命名参数(NAMED ARGUMENTS)
当调用方法时,你可以使用它们的参数名称标记参数:
def printName(first: String, last: String): Unit = {
println(first + " " + last)
}
printName("John", "Smith") // Prints "John Smith"
printName(first = "John", last = "Smith") // Prints "John Smith"
printName(last = "Smith", first = "John") // Prints "John Smith"
注意参数名称的顺序可以重新排列。但是,如果有些参数被命名而有些参数没有命名,那么未命名的参数必须要以在方法签名中参数的顺序放在第一位。
def printName(first: String, last: String): Unit = {
println(first + " " + last)
}
printName(last = "Smith", "john") // Does not compile
注意命名参数不适用于调用 Java 方法。
包和导入(PACKAGES AND IMPORTS)
Scala 使用包创建命名空间,允许你对程序进行模块化设计。
创建包
通过在 Scala 文件头部声明一个或多个包名来创建软件包。
package users
class User
一个约定是将包命名为和包含 Scala 文件的目录相同。但是,Scala 不知道文件布局。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
}
}
正如你看到的,这允许包嵌套并为范围和封装提供了更大的控制权。
包名称应该全部使用小写,如果代码是在具有网站的组织内开发,那么包的命名应该按照接下来的约定:<top-level-domain>.<domain-name>.<project-name>
。例如,如果谷歌有一个叫作 SelfDrivingCar
项目,那么包应该像这样命名:
package com.google.selfdrivingcar.camera
class Lens
这可以对应到以下目录结构:
SelfDrivingCar/src/main/scala/com/google/selfdrivingcar/camera/Lens.scala。
导入
import
子句用于访问其它包中成员(类,traits
,函数等)。访问相同包中的成员不必使用 import
子句。导入子句具有选择性:
import users._ // import everything from the users package 导入 users 包中的全部成员
import users.User // import the class User 导入 users 包中的 User 类
import users.{User, UserPreferences} // Only imports selected members 仅导入选择的成员
import users.{UserPreferences => UPrefs} // import and rename for convenience 导入并设置别名
Scala 不同于 Java 的一点是 import
可以在任何地方使用:
def sqrtplus1(x: Int) = {
import scala.math.sqrt
sqrt(x) + 1.0
}
如果存在命名冲突并且需要从项目根目录导入某些内容,你可以在包名前加上 _root_
。
package accounts
import _root_.users._
注意:scala
和 java.lang
包以及 object.Predef
是默认导入的。