Scala之旅 - 命名参数(NAMED ARGUMENTS)和包和导入(PACKAGES AND IMPORTS)

命名参数(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._

注意:scalajava.lang 包以及 object.Predef 是默认导入的。

阅读更多
个人分类: scala
所属专栏: Tour of Scala(翻译)
上一篇Scala之旅-注解(ANNOTATIONS)和默认参数值(DEFAULT PARAMETER VALUES)
下一篇scala 编译完生成两个class文件有何不同
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭