你好,游客 登录 注册 搜索
背景:
阅读新闻

深入理解Scala 标识符,命名和域

[日期:2015-04-02] 来源:bbs.superwu.cn   作者:吴超Hadoop [字体: ]

    在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 以下是包PQ中两个名为X的对象的定义: 

package P { 

object X { val x = 1; val y = 2 } 

package Q { 

object X { val x = trueval 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的成员的类型。 

 

 





收藏 推荐 打印 | 录入:Cstor | 阅读:
相关新闻       Scala 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款