语法:
Import ::= ?import? ImportExpr {?,? ImportExpr}
ImportExpr ::= StableId ?.? (id | ?_? | ImportSelectors)
ImportSelectors ::= ?{? { ImportSelector ?,?} (ImportSelector | ?_?) ?}?
ImportSelector ::= id [?=>? id | ?=>? ?_?]
import子句形式为import p.I,p是一个稳定标识符(§3.1),I是一个import表达式。import表达式确定了p的成员中一些名称的集合,使这些名称不加限定即可用。最普通的import表达式的形式是一个import选择器的列表。
{x1=>y1,…,xn=>yn,_}
其中n>=0,最后的通配符?_?可以没有。它使每个成员p.xi在未限定的名称yi下可用。例如每个import 选择器 xi=>yi将p.xi重命名为yi。如果存在最终的通配符,p的除x1,…,xn之外的成员z也将在其自身未限定的名称下可用。
import 选择器对类型和术语成员起同样作用。例如,import子句import p.{x=>y}将术语p.x重命名为术语y,并且将类型名p.x重命名为类型名y。这两个名称中至少有一个引用p的一个成员。
如果import 选择器的目标是通配符,import 选择器就会隐藏对源成员的访问。例如,import 选择器 x=>_将x“重命名”为通配符号(作为用户程序中的名称不可访问),因此也有效阻止了对x的非限制性的访问。这在同一个import 选择器列表最后有一个通配符的情况下是有用的,此时将引入所有前面import 选择器没有提及的成员。
由import子句所引入的绑定的域开始于import子句之后并扩展至封闭块,模板,包子句,或编译单元的末尾,具体决定于哪个先出现。
存在一些简化形式。import 选择器可以只是一个名字x。这种情况下,x以没有重命名的方式被引入,因此该import 选择器等价于x=>x。更进一步,也可以用一个标识符或通配符来替换整个的import 选择器列表。import子句import p.x等价于import p.{x},例如不用限定p的成员x即可用。import子句p._等价于import p.{_},例如不用限定p的所有成员x即可用(该处是java中import p.*的同义语)。
一个import子句中的多个import表达式import p1.I1,…,pn.In被解释为一个import子句的序列import p1.I1;…;import pn.In。
示例4.7.1考虑以下对象定义:
object M{
def z = 0, one = 1
def add(x: Int, y: Int):Int = x + y
}
因此代码块
{import M.{one, z => zero, _}; add(zero, one)}
就等价于代码块
{M.add(M.z, M.one)}
更多精彩内容请关注:http://bbs.superwu.cn
关注超人学院微信二维码: