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")
。