Kotlin函数的形参
2019-07-10 本文已影响9人
程序员丶星霖
一、命名参数
Kotlin函数的参数名不是无意义的,Kotlin允许调用函数时通过名字来传入参数值。
fun main(args: Array<String>) {
println(girth(3.5, 4.8))
println(girth(width = 3.5, height = 4.8))
println(girth(height = 4.8, width = 3.5))
println(girth(3.5, height = 4.8))
}
fun girth(width: Double, height: Double): Double {
println("width:${width}")
println("height:${height}")
return 2 * (width + height)
}
输出结果:
width:3.5
height:4.8
16.6
width:3.5
height:4.8
16.6
width:3.5
height:4.8
16.6
width:3.5
height:4.8
16.6
如果希望调用函数时混合使用命名参数和位置参数,那么命名参数必须位于位置参数之后。
二、形参默认值
在某些情况下,程序需要在定义函数时为一个或多个形参指定默认值。
fun main(args: Array<String>) {
sayHi()
sayHi("关羽")
sayHi("关羽", "温酒斩华雄")
sayHi(message = "温酒斩华雄")
}
fun sayHi(name: String = "刘备", message: String = "桃园三结义") {
println("${name},您好")
println("咱们${message}")
}
输出结果:
刘备,您好
咱们桃园三结义
关羽,您好
咱们桃园三结义
关羽,您好
咱们温酒斩华雄
刘备,您好
咱们温酒斩华雄
fun main(args: Array<String>) {
printTriangle(6, '@')
printTriangle(7, char = '#')
printTriangle(char = '*')
}
//定义一个打印三角形的函数
fun printTriangle(height: Int = 5, char: Char) {
for (i in 1..height) {
//先打印一排空格
for (j in 0 until height - 1) {
print(" ")
}
//在打印一排特殊字符
for (j in 0 until 2 * i - 1) {
print(char)
}
}
}
输出结果:
@
@@@
@@@@@
@@@@@@@
@@@@@@@@@
@@@@@@@@@@@
#
###
#####
#######
#########
###########
#############
*
***
*****
*******
*********
如果将带默认值的参数定义在无默认值的参数之前,如果要为默认参数使用默认值时,只能使用命名参数为无默认值的参数传入参数值。
出于对这种情况的考虑,Kotlin建议将带默认值的参数放在函数形参列表的后面。
三、尾递归函数
Kotlin支持一种尾递归函数的编程方式,当函数将调用自身作为它执行的最后一行代码,且递归调用后没有更多代码时,可使用尾递归语法。
尾递归不能在异常处理的try、catch、finally块中使用。
尾递归函数需要使用tailrec修饰。
fun main(args: Array<String>) {
println(fact(10))
println(factRec(10))
}
//定义计算阶乘的函数
fun fact(n: Int): Int {
if (n == 1) {
return 1
} else {
return n * fact(n - 1)
}
}
//使用尾递归函数的语法
tailrec fun factRec(n: Int, total: Int = 1): Int =
if (n == 1) total else factRec(n - 1, total * n)
输出结果:
3628800
3628800
四、个数可变的形参
Kotlin允许定义个数可变的参数,从而允许为函数指定数量不确定的形参。
在定义函数时,在形参的类型前添加vararg修饰,则表明该形参可以接受多个参数值,多个参数值被当成数组传入。
fun main(args: Array<String>) {
test(5, "Python", "Java", "Kotlin")
}
//定义形参个数可变的函数
fun test(a: Int, vararg languages: String) {
for (language in languages) {
println(language)
}
println(a)
}
输出结果:
Python
Java
Kotlin
5
Kotlin允许个数可变的形参可以处于形参列表的任意位置,但是Kotlin要求一个函数最多只能带一个个数可变的形参。
fun main(args: Array<String>) {
test("Python", "Java", "Kotlin", a = 6)
}
//定义形参个数可变的函数
fun test(vararg languages: String, a: Int) {
for (i in languages.indices) {
println(languages[i])
}
println(a)
}
输出结果:
Python
Java
Kotlin
6
由于可数可变的形参可以接受个数不等的参数值,所以,如果需要给后面的参数传入参数值,则必须使用命名参数。
如果将数组的多个元素传给个数可变的参数,则可以在传入数组参数前添加*
运算符。
fun main(args: Array<String>) {
var arr = arrayOf("Python", "Java", "Kotlin")
test(*arr, a = 6)
}
//定义形参个数可变的函数
fun test(vararg languages: String, a: Int) {
for (i in languages.indices) {
println(languages[i])
}
println(a)
}
输出结果:
Python
Java
Kotlin
6
学海无涯苦作舟
![](https://img.haomeiwen.com/i4625756/1e4bf2f119027169.jpg)