8.2.4 函数参数

函数参数使用 Pascal 表示法定义,即 name: type。参数用逗号隔开。每个参数必须显式指定其类型。

1. fun powerOf(number: Int, exponent: Int): Int {
2. return Math.pow(number.toDouble(), exponent.toDouble()).toInt()
3. }

测试代码:

1. val eight = powerOf(2, 3)
2. println("powerOf(2,3) = $eight")

输出:powerOf(2,3) = 8#### 默认参数

函数参数可以有默认值,当省略相应的参数时使用默认值。这可以减少重载数量。

1. fun add(x: Int = 0, y: Int = 0): Int {
2. return x + y
3. }

默认值通过类型后面的 = 及给出的值来定义。

测试代码:

1. val zero = add()
2. val one = add(1)
3. val two = add(1, 1)
4. println("add() = $zero")
5. println("add(1) = $one")
6. println("add(1, 1) = $two")

输出:

1. add() = 0
2. add(1) = 1
3. add(1, 1) = 2

另外,覆盖带默认参数的函数时,总是使用与基类型方法相同的默认参数值。 当覆盖一个带有默认参数值的方法时,签名中不带默认参数值:

1. open class DefaultParamBase {
2. open fun add(x: Int = 0, y: Int = 0): Int {
3. return x + y
4. }
5. }

7. class DefaultParam : DefaultParamBase() {
8. override fun add(x: Int, y: Int): Int { // 不能有默认值
9. return super.add(x, y)
10. }
11. }
12. ```#### 命名参数

14. 可以在调用函数时使用命名的函数参数。当一个函数有大量的参数或默认参数时这会非常方便。

16. 给定以下函数

18. ```kotlin
19. fun reformat(str: String,
20. normalizeCase: Boolean = true,
21. upperCaseFirstLetter: Boolean = true,
22. divideByCamelHumps: Boolean = false,
23. wordSeparator: Char = ' ') {
24. }

我们可以使用默认参数来调用它

1. reformat(str)

然而,当使用非默认参数调用它时,该调用看起来就像

1. reformat(str, true, true, false, '_')

使用命名参数我们可以使代码更具有可读性

1. reformat(str,
2. normalizeCase = true,
3. upperCaseFirstLetter = true,
4. divideByCamelHumps = false,
5. wordSeparator = '_'
6. )

并且如果我们不需要所有的参数

1. reformat(str, wordSeparator = '_')
2. ```#### 可变数量的参数(Varargs)

4. 函数的参数(通常是最后一个)可以用 `vararg` 修饰符标记:

6. ```kotlin
7. fun <T> asList(vararg ts: T): List<T> {
8. val result = ArrayList<T>()
9. for (t in ts) // ts is an Array
10. result.add(t)
11. return result
12. }

允许将可变数量的参数传递给函数:

1. val list = asList(1, 2, 3)