在 Scala 中,函数参数可以设置默认值,当调用函数时如果不传递该参数,就会使用默认值。这一特性可以简化函数调用,尤其适用于参数较多但大部分情况下使用默认值的场景。
基本语法
定义带默认值的函数时,在参数后用 = 指定默认值:
def 函数名(参数名: 类型 = 默认值, ...): 返回类型 = {
// 函数体
}
示例
// 定义带默认值参数的函数
def greet(name: String = "Guest", message: String = "Hello"): Unit = {
println(s"$message, $name!")
}
// 调用方式1:不传递任何参数(使用所有默认值)
greet() // 输出:Hello, Guest!
// 调用方式2:传递部分参数(未传递的使用默认值)
greet("Alice") // 输出:Hello, Alice! (message 使用默认值 "Hello")
// 调用方式3:传递所有参数(覆盖默认值)
greet("Bob", "Hi") // 输出:Hi, Bob!
关键注意事项
-
参数顺序与命名参数如果函数有多个参数,且只想传递后面的参数(跳过前面的默认值参数),需要使用 命名参数(通过参数名指定值),否则会按顺序匹配参数:
def calculate(a: Int = 1, b: Int = 2, c: Int = 3): Int = a + b + c // 错误:想传递 c,但未指定参数名,会被当作 a 的值 calculate(10) // 实际是 a=10, b=2, c=3 → 结果 15 // 正确:使用命名参数指定 c 的值(a 和 b 用默认值) calculate(c = 10) // a=1, b=2, c=10 → 结果 13 -
默认值的表达式默认值可以是任意合法的表达式(甚至是函数调用),但表达式在函数定义时不会执行,而是在每次调用且未传递该参数时执行:
def getDefault(): String = { println("计算默认值...") "默认值" } def func(x: String = getDefault()): Unit = println(x) func() // 输出:计算默认值... 默认值(调用时执行 getDefault()) func("手动值") // 输出:手动值(不执行默认值表达式) -
与变长参数的配合带默认值的参数可以和变长参数(
*)一起使用,但变长参数必须放在参数列表的最后:// 正确:变长参数 args 放在最后 def log(prefix: String = "[INFO]", args: String*): Unit = { println(s"$prefix: ${args.mkString(", ")}") } log(args = "a", "b") // 输出:[INFO]: a, b