在Scala中,命名用來表示類型,值,方法以及類,這些統稱爲實體。命名在局部定義與聲明,繼承,import子句,package子句中存在,這些能夠統稱爲綁定。 spa
綁定有優先級,定義(局部或繼承)有最高的優先級,而後是顯式import,而後是通配符import,而後是包成員,是最低的優先級。 對象
有兩種不一樣的命名空間,一個是類型,一個是術語。一樣的命名能夠表示類型或術語,這要看命名應用所在的上下文。 繼承
綁定有一個域,在此域中用單一命名定義的實體能夠用一個簡單名稱來訪問。域能夠嵌套。內部域中的綁定將會遮蓋同一域中低優先級的綁定,或者外部域中低優先級或同優先級的綁定。 字符串
注意遮蓋只是偏序關係。在下面狀況中: import
val x = 1; object
{ import p.x; 命名空間
x} 引用
x的綁定並無互相遮蓋。所以第三行中對x的引用的含義將是不明確的。 程序
對一個未限定的(類型或術語)標識符x的引用在如下條件下能夠被單一綁定: 方法
l 在同一命名空間中用命名x定義一個實體做爲標識符
l 在此命名空間中遮蓋全部的其餘定義命名x的實體綁定
若是沒有這樣的綁定將會致使錯誤。若是x由一個import子句綁定,那麼簡單命名x將等價於由import子句映射所限定的命名。若是x由一個定義或聲明綁定,那麼x將指代由該綁定引入的實體。在此狀況下,x的類型便是引用的實體的類型。
示例2.0.2 如下是包P和Q中兩個名爲X的對象的定義:
package P {
object X { val x = 1; val y = 2 }
}
package Q {
object X { val x = true; val y = 「」 }
}
如下程序示意了它們間不一樣的綁定及優先級。
package P { //‟X‟由package子句綁定
import Console._ //‟println‟由通配符import綁定
object A {
println(「L4: 「+X) //這裏的‟X‟指‟P.X‟
object B {
import Q._{ //‟X‟由通配符import綁定
println(「L7: 「+X) //這裏的‟X‟指‟Q.X‟
import X._ //‟x‟和‟y‟由通配符import綁定
println(「L8: 「+x) //這裏的‟x‟指‟Q.X.x‟
object C {
val x = 3 //‟x‟由局部定義綁定
println(「L12: 「+x) //這裏的‟x‟指常數‟3‟
{ import Q.X._ //‟x‟和‟y‟由通配符import綁定
// println(「L14: 「+x) //這裏到‟x‟的引用指代不明確
import X.y //‟y‟由顯式import綁定
println(「L16: 「+y) //這裏的‟y‟指‟Q.X.y‟
{ val x = 「abc」 //‟x‟由局部定義綁定
import P.X._ //‟x‟和‟y‟由通配符import綁定
// println(「L19: 「+y) //這裏到‟y‟的引用指代不明確
println(「L20: 「+x) //這裏的‟x‟指字符串」abc」
}}}}}}
一個到限定的(類型或術語)標識符e.x的引用指在同一個命名空間中e的類型T的一個名爲x的成員做爲標識符。若是T不是值類型將會致使錯誤。e.x的類型就是引用的實體T的成員的類型。