Scala/匯入
Scala 中的匯入機制允許更直接地引用不同的實體,例如包、類、物件、例項、欄位和方法。與 Java 或 C++ 相比,Scala 中匯入程式碼的概念更加靈活。
- 匯入語句可以位於任何地方。它可以位於類的開頭,在類或物件內部,或在方法或塊內部。
- 在匯入時,成員可以被重新命名或隱藏。
- 包、類或物件可以被匯入到當前作用域中。
匯入
[edit | edit source]任何匯入都是使用關鍵字 "import" 定義的。一個匯入包含在包中的物件的簡單示例
package p1 {
class A
}
object B {
val x = new p1.A
import p1.A
val y = new A
}
在第 1-3 行中,聲明瞭一個名為 "p1" 的包,其中包含一個名為 "A" 的類。在第 4-8 行中,定義了一個名為 "B" 的物件。在第 5 行中,一個名為 "x" 的值被賦值為類 "A" 的一個新例項,使用 "p1.A" 作為類 "A" 的完整識別符號。在第 6 行中,使用關鍵字 "import",後跟識別符號 "p1.A"。 "import" 宣告使作用域中所有後續實體能夠直接引用宣告中識別符號的最後一部分,這裡是指類 "A"。在第七行中,直接引用類 "A",無需使用其完整識別符號。
可以匯入的實體包括物件成員,例如欄位和方法
import math.Pi
import math.round
println("Pi is: " + Pi) //Prints "Pi is: 3.141592653589793".
println("Pi rounded is: " + round(Pi)) //Prints "Pi rounded is: 3".
在第一行中,匯入物件 "math" 的名為 "Pi" 的欄位,使其可用於匯入宣告之後的實體。在第二行中,同樣匯入物件 "math" 的名為 "round" 的方法。在第四行和第五行中,直接引用 "Pi" 和 "round",無需使用通常所需的識別符號 "math.Pi" 和 "math.round"。
例項的成員也可以匯入
class Cube(val a:Double)
def volume(cube:Cube) = {
import cube.a
a*a*a
}
val cube1 = new Cube(4)
println("The volume of cube1 is: " + volume(cube1)) //Prints "The volume of cube1 is: 64.0".
在第一行中,聲明瞭一個名為 "Cube" 的類,其中包含一個名為 "a" 的值,表示邊長。在第 2-5 行中,定義了一個計算立方體體積的方法。在第 3 行中,匯入引數名為 "cube" 的欄位 "a",在第 4 行中直接引用 "a"。在第 6 行中例項化一個新的立方體,在第 7 行中列印其體積。
包也可以匯入
package p1.p2 {
class A
}
import p1.p2
val a = new p2.A
在前 3 行中,聲明瞭兩個巢狀的包,名為 "p1" 和 "p2",其中 "p2" 包含一個名為 "A" 的類。在第五行中,匯入 "p2"。在第七行中,直接引用 "p2",無需使用 "p1.p2" 來限定它。
您可以按照以下方式從一個包中匯入多個類。
import math.{Pi,round}
在單個匯入語句中從 math 包匯入 math.Pi 和 math.round 類。
萬用字元
[edit | edit source]_ 字元在 Scala 中用作萬用字元。它類似於 Java 中的 * 字元。在下面的示例中,從 math 包匯入所有內容。
import math._
println("Pi is: " + Pi) //Prints "Pi is: 3.141592653589793".
println("Pi rounded is: " + round(Pi)) //Prints "Pi rounded is: 3".
匯入選擇子句
[edit | edit source]重新命名
[edit | edit source]為了避免名稱空間衝突,您可能需要在匯入到作用域時重新命名成員。在下面的示例中,Pi 重新命名為 myPi,round 重新命名為 myRound,它們從 math 包中匯入,這樣就不會與物件中的本地 Pi 和 round 成員發生衝突。
import math.{Pi => myPi,round => myRound}
object myMaths extends App {
val Pi = 3.1
val round = TRUE
println("Pi is: " + myPi) //Prints "Pi is: 3.141592653589793".
println("Pi rounded is: " + myRound(myPi)) //Prints "Pi rounded is: 3".
}
隱藏
[edit | edit source]Scala 提供了一個選項,允許您在從同一個包中匯入其他成員時,隱藏一個或多個類。
import math.{Pi => _, _}
object myMaths extends App {
println("Pi is: " + Pi) // Error, Pi is hidden
}
在上面的示例中,隱藏了 Pi,而從 math 包中匯入的其餘所有內容都匯入到了作用域中。訪問示例中的 Pi 會導致錯誤,因為 Pi 在匯入時被隱藏了。
限制範圍
[edit | edit source]您可以在任何地方使用匯入語句,這可以讓您控制匯入成員的作用域。
您可以在包的頂部使用匯入語句。
package importTesting
import math.Pi
class test1 {
def printPi {
println("Pi is: " + Pi) //Successful
}
}
class test2 {
def printMyPi {
println("Pi is :" + Pi) //Successful
}
}
在上面的示例中,math.pi 在包的頂部被匯入,math.pi 的作用域在整個包中。因此,它可以在包中所有類中使用。
您可以在類內部使用匯入語句。
package importTesting
class test1 {
import math.Pi
def printPi {
println("Pi is: " + Pi) //Successful
}
}
class test2 {
def printMyPi {
println("Pi is :" + Pi) //Fail as the scope of Pi is limited to class test1
}
}
在上面的示例中,math.pi 在類 test1 中被匯入,Pi 的作用域被限制在類 test1 內部。無法從類 test2 中訪問它。
您可以在類的某個方法內部使用匯入語句,並將作用域限制到該成員。
package importTesting
class test1 {
def printPi {
import math.Pi
println("Pi is: " + Pi) //Successful
}
def printMyPi {
println("Pi is :" + Pi) //Fail as the scope of Pi is limited to the method
}
}