包和导入
Scala 使用包来创建命名空间,允许你对程序进行模块化。
创建包
通过在 Scala 文件顶部声明一个或多个包名称来创建包。
package users
class User
一种约定是将包命名为与包含 Scala 文件的目录相同的名称。但是,Scala 与文件布局无关。package users
的 sbt 项目的目录结构可能如下所示
- ExampleProject
- build.sbt
- project
- src
- main
- scala
- users
User.scala
UserProfile.scala
UserPreferences.scala
- test
注意 users
目录如何位于 scala
目录中,以及包中如何有多个 Scala 文件。包中的每个 Scala 文件都可以具有相同的包声明。声明包的另一种方法是将它们相互嵌套
package users {
package administrators {
class NormalUser
}
package normalusers {
class NormalUser
}
}
package users:
package administrators:
class NormalUser
package normalusers:
class NormalUser
如你所见,这允许包嵌套,并为作用域和封装提供了更大的控制。
包名应全部小写,如果代码是在有网站的组织内开发的,则应采用以下格式约定:<top-level-domain>.<domain-name>.<project-name>
。例如,如果 Google 有一个名为 SelfDrivingCar
的项目,则包名将如下所示
package com.google.selfdrivingcar.camera
class Lens
这可能对应于以下目录结构:SelfDrivingCar/src/main/scala/com/google/selfdrivingcar/camera/Lens.scala
。
导入
import
子句用于访问其他包中的成员(类、特征、函数等)。对于访问同一包中的成员,不需要 import
子句。导入子句是可选的
import users._ // import everything from the users package
import users.User // import the class User
import users.{User, UserPreferences} // Only imports selected members
import users.{UserPreferences => UPrefs} // import and rename for convenience
import users.* // import everything from the users package except given
import users.given // import all given from the users package
import users.User // import the class User
import users.{User, UserPreferences} // Only imports selected members
import users.UserPreferences as UPrefs // import and rename for convenience
Scala 与 Java 不同的一点是,导入可以在任何地方使用
def sqrtplus1(x: Int) = {
import scala.math.sqrt
sqrt(x) + 1.0
}
def sqrtplus1(x: Int) =
import scala.math.sqrt
sqrt(x) + 1.0
在出现命名冲突,并且需要从项目的根目录导入内容时,请使用 _root_
为包名称添加前缀
package accounts
import _root_.users._
package accounts
import _root_.users.*
注意:scala
和 java.lang
包以及 object Predef
默认导入。