
3.3.1 可变数量的实参
在3.1.5节中,我们编写了一个max()函数,它接受一个数字数组。在对函数的调用中,正如预期的那样,我们传递了一个值数组。如果我们已经有了一个值数组,那么这没什么大不了的,但如果我们有一组离散的值,那么要调用函数,必须创建一个这些值的临时数组,然后传递这个数组。单调又乏味。
在Kotlin中,函数可以接受可变数量的实参。让我们将max()函数转换为对调用方来说更灵活的函数。

与我们之前编写的max()函数相比,这个版本有两个变化,都在参数列表中。首先,参数numbers以关键字vararg作为前缀。其次,参数的类型被指定为Int而不是IntArray。参数numbers的实际类型为数组,vararg将参数注释为指定类型的数组。
让我们对函数进行几次调用,传递一些离散值。

这工作得很好——我们可以传递任意数量的实参,并且Kotlin的类型检查将确保不同的实参是正确的类型。
max()函数只接受一个参数,但是当一个函数同时接受多个参数时,你可以使用vararg。但是只有一个参数可以注释为vararg。
这是一个接受两个参数的函数,但是只有末尾的一个标记为vararg。

在调用中,第一个实参绑定到第一个参数,其余的实参传递给vararg参数。
vararg参数的类型可以独立于函数接受的任何其他参数的类型。
vararg参数不必是末尾的参数,但是我强烈建议要这样做。考虑以下版本的greetMany()函数:

调用函数时,如果传递任意数量的未命名字符串参数,编译器将假设所有这些参数都用于vararg参数。为了搞清楚一个值是对应msg参数的,你必须使用命名参数,如下所示:

如果使用vararg注释非末尾的参数,则调用方将被迫使用命名参数。
下面是一些关于vararg参数放置位置的建议:
□将其放在末尾,这样调用方就不会被迫使用命名参数。
□如果最后一个参数是lambda表达式,则将其放在最后一个参数之前——我们将在本书的后面进一步探讨这个问题。
我们已经看到Kotlin如何使传递可变数量的参数变得容易,但是如果我们已经有了一个带有值的数组该怎么办?在这种情况下,spread运算符可以出手相助。