深刻理解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的成员的类型。

相关文章
相关标签/搜索