Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

函数

函数就像是一个小程序,它有自己的名称,可以通过从另一个函数调用该名称来执行(调用)。

函数将一组活动组合在一起,是组织程序和重用代码的最基本方法。

你将信息传递给函数,函数使用该信息来计算并产生结果。函数的基本形式是:

fun 函数名(参数1: 类型1, 参数2: 类型2, ...): 返回类型 {
  代码行
  return 结果
}

参数1参数2参数:你传递给函数的信息。每个参数都有一个标识符名称(参数1参数2),后跟一个冒号和该参数的类型。参数列表的闭合括号后跟一个冒号和函数产生的结果类型。函数体中的代码行被括在大括号中。return 关键字后面的表达式是函数完成时产生的结果。

参数是你定义传递到函数中的内容,它是占位符。参数值是你实际传递给函数的实际值。

名称、参数和返回类型的组合称为函数签名

以下是一个名为 multiplyByTwo() 的简单函数示例:

// Functions/MultiplyByTwo.kt

fun multiplyByTwo(x: Int): Int {  // [1]
  println("Inside multiplyByTwo") // [2]
  return x * 2
}

fun main() {
  val r = multiplyByTwo(5)        // [3]
  println(r)
}
/* 输出:
Inside multiplyByTwo
10
*/
  • [1] 注意 fun 关键字、函数名称以及由单个参数组成的参数列表。这个函数接受一个 Int 参数并返回一个 Int
  • [2] 这两行是函数的主体。最后一行将其计算结果 x * 2 的值作为函数的结果返回。
  • [3] 这一行通过合适的参数调用函数,并将结果捕获到 val r 中。函数调用模仿了其声明的形式:函数名称,后面跟在括号内的参数。

通过调用函数来执行函数代码,使用函数名称 multiplyByTwo() 作为该代码的缩写。这就是为什么函数是编程中最基本的简化和代码重用形式。你还可以将函数视为具有可替代值(参数)的表达式。

println() 也是一个函数调用,它恰好是由 Kotlin 提供的。我们将 Kotlin 定义的函数称为库函数

如果函数不提供有意义的结果,它的返回类型是 Unit。如果你愿意,可以显式指定 Unit,但 Kotlin 允许你省略它:

// Functions/SayHello.kt

fun sayHello() {
  println("Hallo!")
}

fun sayGoodbye(): Unit {
  println("Auf Wiedersehen!")
}

fun main() {
  sayHello()
  sayGoodbye()
}
/* 输出:
Hallo!
Auf Wiedersehen!
*/

sayHello()sayGoodbye() 都返回 Unit,但 sayHello() 省略了显式声明。main() 函数也返回 Unit

如果一个函数只有一个单独的表达式,你可以使用等号后跟表达式的简化语法:

fun 函数名(参数1: 类型1, 参数2: 类型2, ...): 返回类型 = 表达式

用大括号包围的函数体称为块主体。使用等号语法的函数体称为表达式主体

在这里,multiplyByThree() 使用了表达式主体:

// Functions/MultiplyByThree.kt

fun multiplyByThree(x: Int): Int = x * 3

fun main() {
  println(multiplyByThree(5))
}
/* 输出:
15
*/

这是一种说法 return x * 3 在块主体内的简短版本。

Kotlin 推断带有表达式主体的函数的返回类型:

// Functions/MultiplyByFour.kt

fun multiplyByFour(x: Int) = x * 4

fun main() {
  val result: Int = multiplyByFour(5)
  println(result)
}
/* 输出:
20
*/

Kotlin 推断 multiplyByFour() 返回一个 Int

Kotlin 只能推断表达式主体的返回类型。如果函数有一个块主体,并且你省略了其类型,那么函数将返回 Unit

  • -

在编写函数时,选择有描述性的名称。这样可以使代码更易于阅读,通常可以减少对代码注释的需求。在本书中,函数名称可能并不总是像我们希望的那样描述性,因为我们受到了行宽的限制。

练习和解答可在 www.AtomicKotlin.com 找到。