📅  最后修改于: 2023-12-03 15:40:05.587000             🧑  作者: Mango
在Scala中,可变参数允许我们在定义函数时指定一个参数列表,其中最后一个参数可以带有 *
修饰符,表示这个参数可以是任意数量的参数,这样我们就可以用同一个函数处理不同数量的参数。这个特性称为可变长度参数或可变参数。
例如:
def sum(args: Int*): Int = {
var result = 0
for (arg <- args) result += arg
result
}
val s = sum(1, 2, 3, 4, 5) // 15
在上面的代码中,我们定义了一个名为 sum
的函数,它有一个可变参数列表 args: Int*
,它接受任意数量的整数参数。在函数体内,我们使用了一个循环来计算参数的总和,并将结果返回。
使用可变参数的函数调用看起来似乎和使用普通函数没有区别:
val s1 = sum(1, 2, 3) // 6
val s2 = sum(1, 2, 3, 4, 5) // 15
你甚至可以在调用时不传递任何参数(不过这意味着将返回0):
val s3 = sum() // 0
由于可变参数是一个包含多个值的序列,因此我们可以像处理其他序列一样处理它们,例如通过使用高阶函数。
例如,我们可以为可变参数列表创建一个高阶函数 foreach
,它可以接收一个函数并将其应用于每个参数:
def foreach[U](f: Int => U)(args: Int*): Unit = {
for (arg <- args) f(arg)
}
使用上述定义,我们可以将 foreach
应用于 sum
函数的实现中:
foreach(println)(1, 2, 3)
上述代码将输出以下内容:
1
2
3
虽然可变参数非常有用,但是在使用时需要小心,因为它们有一些限制。主要有以下几点:
如果在一个函数中有多个参数列表,那么可变参数必须在最后一个参数列表中。
例如,下面的代码就是错误的:
def sum(x: Int, args: Int*)(y: Int): Int = {
// ...
}
在上述代码中,我们定义了一个函数 sum
,它有两个参数列表。第一个参数列表只有一个参数 x: Int
,第二个参数列表是可变参数列表 args: Int*
。然而,由于第二个参数列表不是最后一个参数列表,因此编译器会抛出一个错误。