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. }
  6. class DefaultParam : DefaultParamBase() {
  7. override fun add(x: Int, y: Int): Int { // 不能有默认值
  8. return super.add(x, y)
  9. }
  10. }
  11. ```#### 命名参数
  12. 可以在调用函数时使用命名的函数参数。当一个函数有大量的参数或默认参数时这会非常方便。
  13. 给定以下函数
  14. ```kotlin
  15. fun reformat(str: String,
  16. normalizeCase: Boolean = true,
  17. upperCaseFirstLetter: Boolean = true,
  18. divideByCamelHumps: Boolean = false,
  19. wordSeparator: Char = ' ') {
  20. }

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

  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)
  3. 函数的参数(通常是最后一个)可以用 `vararg` 修饰符标记:
  4. ```kotlin
  5. fun <T> asList(vararg ts: T): List<T> {
  6. val result = ArrayList<T>()
  7. for (t in ts) // ts is an Array
  8. result.add(t)
  9. return result
  10. }

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

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