在 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)
}
输出结果
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)
}
输出结果
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)
}
输出结果