函数
函数就像是一个小程序,它有自己的名称,可以通过从另一个函数调用该名称来执行(调用)。
函数将一组活动组合在一起,是组织程序和重用代码的最基本方法。
你将信息传递给函数,函数使用该信息来计算并产生结果。函数的基本形式是:
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 找到。