函数参数的默认值

64 阅读2分钟

在 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!

关键注意事项

  1. 参数顺序与命名参数如果函数有多个参数,且只想传递后面的参数(跳过前面的默认值参数),需要使用 命名参数(通过参数名指定值),否则会按顺序匹配参数:

    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
    
  2. 默认值的表达式默认值可以是任意合法的表达式(甚至是函数调用),但表达式在函数定义时不会执行,而是在每次调用且未传递该参数时执行

    def getDefault(): String = {
      println("计算默认值...")
      "默认值"
    }
    
    def func(x: String = getDefault()): Unit = println(x)
    
    func()  // 输出:计算默认值...  默认值(调用时执行 getDefault())
    func("手动值")  // 输出:手动值(不执行默认值表达式)
    
  3. 与变长参数的配合带默认值的参数可以和变长参数(*)一起使用,但变长参数必须放在参数列表的最后:

    // 正确:变长参数 args 放在最后
    def log(prefix: String = "[INFO]", args: String*): Unit = {
      println(s"$prefix: ${args.mkString(", ")}")
    }
    
    log(args = "a", "b")  // 输出:[INFO]: a, b