函数参数默认值

42 阅读2分钟

在 Scala 中,函数(包括方法和函数值)可以为参数指定默认值,当调用函数时如果不传递该参数,就会使用默认值。这一特性可以简化函数调用,尤其适用于参数较多但大部分情况下使用默认值的场景。

基本语法scala

为参数指定默认值的语法是在参数声明后加上 = 默认值

scala

def 函数名(参数名: 类型 = 默认值, ...): 返回类型 = {
  // 函数体
}

示例说明

1. 简单示例

scala

// 定义一个带默认值的函数
def greet(name: String = "Guest", message: String = "Hello"): String = {
  s"$message, $name!"
}

// 调用时可省略带默认值的参数
println(greet())               // 输出:Hello, Guest!(使用所有默认值)
println(greet("Alice"))        // 输出:Hello, Alice!(只传递第一个参数,第二个用默认值)
println(greet(message = "Hi")) // 输出:Hi, Guest!(通过参数名指定传递第二个参数)
println(greet("Bob", "Hi"))    // 输出:Hi, Bob!(传递所有参数,覆盖默认值)

2. 注意事项

  • 参数名传递:如果省略前面的参数而传递后面的参数,必须通过 参数名 显式指定,否则会报错。例如,greet("Hi") 会被认为是给第一个参数 name 传值,而非 message(此时会导致逻辑错误)。

  • 默认值表达式:默认值可以是任意合法的表达式(包括变量、其他函数调用等),但表达式在函数定义时会被求值一次,后续调用复用该结果:

    scala

    val defaultAge = 18
    def getUser(age: Int = defaultAge + 2): Int = age
    
    println(getUser()) // 输出:20(默认值为 18 + 2)
    
  • 与变长参数共存:如果函数有变长参数(如 args: String*),带默认值的参数通常放在变长参数之前(否则可能导致歧义)。

3. 函数值的默认参数

匿名函数(函数值)也支持默认参数,但语法上需要显式声明参数类型:

scala

val add: (Int, Int) => Int = (a: Int = 1, b: Int = 2) => a + b

println(add())      // 输出:3(使用默认值 1 + 2)
println(add(3))     // 输出:5(3 + 2)
println(add(b = 5)) // 输出:6(1 + 5)

通过默认参数,Scala 可以在保持函数灵活性的同时,减少重复的参数传递,提升代码简洁性。

例题

def hello(name:String="小米",age:Int=18,xb:String="女")={
  println(name,age,xb)
}
def main(args: Array[String]): Unit = {
  hello()
  hello(age=20)

}

输出结果

image.png

  def getSm(args:Int*):Int={
      var sum=0
      for(i <-args){
        sum+=i
      }
      sum
    }



def main(args: Array[String]): Unit = {
  val result1 =getSm(1)
  val result2=getSm(4,1,2,3,5)
  println(result1,result2)

}

输出结果

image.png

def sjx(a:Double,b:Double,c:Double)={
  a+b>c && a+c>b&&c+b>a
}

def main(args: Array[String]): Unit = {
  val r=sjx(1.0,1.0,4.0)
  println(r)
}

输出结果

image.png