深刻理解Scala 標識符,命名和域

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 如下是包PQ中兩個名爲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的成員的類型。

相關文章
相關標籤/搜索