本文主要对 Scala 中的包和引入进行介绍
包
- 同一个包可以定义在多个文件中
- 不同的包也可以定义在同一个文件中
- 包可以包含类,对象和特质,但是不能包含函数或者变量的定义(引出了包对象的出现)
作用域
- 底层可以访问上层作用域内的名称
因为在 Scala 中包名是相对的,所以如果出现下面的情况,
package collection{
class test{
val a = new collection.mutable.ArrayBuffer[Int]()}
}
本来想使用scala.collection
下面的数据结构,但是像上面的定义,编译器会尝试在collection包下查找mutable,最终会报错。
所以一般会使用完整包名
val a = new _root_.scala.collection.mutable.ArrayBuffer[Int]()
// 或者
val a = new scala.collection.mutable.ArrayBuffer[Int]()
包的表示
- 包括嵌套标记法和文件顶部标记法
package p1{
package p2{
// 可以访问p1下的成员
...
}
}
// 或者
package p1
package p2
...
package p1.p2{
// 访问不到p1下的成员
}
// 或者
package p1.p2
...
包对象
- 每个包都可以有一个包对象,需要在父包中定义,名字与子包相同
- 包对象中可以包含工具函数或者常量
package p1
// 包对象
package object p2{
// 外界可以通过p1.p2.a访问到这个变量
val a = 1
}
package p2{
...
}
包可见性
package p1.p2.p3
class c3{
// 只在p3中可见
private [p3] def test3 = println("test3")
// 拓展到p2中也可见
private [p2] def test2 = println("test2")
}
包的引入
// 导入Map
import scala.collection.mutable.Map
// 导入Map和Arraybuffer
import scala.collection.mutable.{Map, Arraybuffer}
// 重命名Map
import scala.collection.mutable.{Map => Mymap}
// 导入包下全部成员
import scala.collection.mutable._
并且 Scala 中,import 语句可以出现在任何地方,并不限于文件顶部,且 import 语句的效果一直延申到包含该语句的块末尾。
参考资料:《快学Scala》