Kotlin普通函数与表达式函数的差异及调用行为疑问解答
为什么Kotlin中两个看似相似的函数调用结果不同?
嘿,这个问题刚好踩中了Kotlin里普通函数和返回函数类型的函数的核心区别,我来给你拆解明白:
先看第一个函数 p()
fun p() : Unit { println("Hello P") }
这个函数的返回类型是Unit——Kotlin里用来表示“没有实际返回值”的特殊类型。当你调用p()时,JVM会直接执行函数体里的代码(也就是println("Hello P")),执行完成后返回一个Unit实例。所以你一调用p(),立刻就能看到打印结果。
再看第二个函数 y()
fun y() : () -> Unit = { println("Hello Y") }
这里的关键是返回类型:() -> Unit,这是一个函数类型,它代表“一个不需要参数、返回值为Unit的函数”。
当你定义y()的时候,等号右边的{ println("Hello Y") }是一个lambda表达式——它本身是一个函数对象,而不是一段会立刻执行的代码。所以当你调用y()时,它做的事情不是执行打印逻辑,而是把这个lambda函数对象返回给你。这时候你拿到的是一个可以被调用的“函数”,但它还没被执行呢!
所以你需要再加一对括号y()():
- 第一对括号
y():调用函数y,拿到它返回的那个lambda函数对象 - 第二对括号
():调用这个lambda函数对象,这时候才会执行里面的println("Hello Y")
你也可以把这个过程拆开来写,会更直观:
val printHelloFunc = y() // 把y返回的函数对象存到变量里 printHelloFunc() // 现在调用这个函数对象,才会打印内容
一句话总结
p()是直接执行函数体逻辑,执行完返回Unity()是返回一个待执行的函数对象,必须额外调用这个返回的对象才会触发逻辑
内容的提问来源于stack exchange,提问作者shinobitiger310
相关产品推荐
相关产品推荐

