标签:scala
在Scala中,命名用来表示类型,值,方法以及类,这些统称为实体。命名在局部定义与声明,继承,import子句,package子句中存在,这些可以统称为绑定。
绑定有优先级,定义(局部或继承)有最高的优先级,然后是显式import,然后是通配符import,然后是包成员,是最低的优先级。
有两种不同的命名空间,一个是类型,一个是术语。同样的命名可以表示类型或术语,这要看命名应用所在的上下文。
绑定有一个域,在此域中用单一命名定义的实体可以用一个简单名称来访问。域可以嵌套。内部域中的绑定将会遮盖同一域中低优先级的绑定,或者外部域中低优先级或同优先级的绑定。
注意遮盖只是偏序关系。在下面情况中:
val x = 1;
{ 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?
{ importQ.X._ //?x?和?y?由通配符import绑定
//println(“L14: “+x) //这里到?x?的引用指代不明确
import X.y//?y?由显式import绑定
println(“L16:“+y) //这里的?y?指?Q.X.y?
{ valx = “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的成员的类型。标签:scala
原文地址:http://blog.csdn.net/crxy2016/article/details/44803577