Scala 之旅

默认参数值

语言

Scala 提供了为参数提供默认值的功能,可用于允许调用者省略这些参数。

def log(message: String, level: String = "INFO") = println(s"$level: $message")

log("System starting")  // prints INFO: System starting
log("User not found", "WARNING")  // prints WARNING: User not found

参数 level 有一个默认值,因此它是可选的。在最后一行,参数 "WARNING" 覆盖了默认参数 "INFO"。在 Java 中,你可能使用重载方法,但可以使用具有可选参数的方法来实现相同的效果。但是,如果调用者省略了一个参数,则任何后续参数都必须命名。

class Point(val x: Double = 0, val y: Double = 0)

val point1 = new Point(y = 1)

在这里我们必须说 y = 1

请注意,从 Java 代码调用时,Scala 中的默认参数不是可选的

// Point.scala
class Point(val x: Double = 0, val y: Double = 0)
// Main.java
public class Main {
    public static void main(String[] args) {
        Point point = new Point(1);  // does not compile
    }
}

重载方法的默认参数

Scala 不允许有两个具有默认参数且名称相同(重载)的方法。一个重要的原因是为了避免由于存在默认参数而可能造成的歧义。为了说明这个问题,我们考虑下面提供的声明方法

object A {
  def func(x: Int = 34): Unit
  def func(y: String = "abc"): Unit
}
object A:
  def func(x: Int = 34): Unit
  def func(y: String = "abc"): Unit

如果我们调用 A.func(),编译器无法知道程序员打算调用 func(x: Int = 34) 还是 func(y: String = "abc")

此页面的贡献者