假设我有一个接受lambda作为参数的高阶函数,如下所示:
fun getNum(op: () -> Int) = op()
还有一个返回数字的函数:
fun getTen() = 10
在主函数中,我可以这样调用
getNum()
函数fun main(args: Array<String>){
val x = 50
val a = getNum(::getTen) // a == 10
val b = getNum{x} // this works and b == 50
}
为什么通过varibale而不是lambda起作用?任何的想法?谢谢。
最佳答案
在Kotlin中,lambda is the return value中的最后一个或单个表达式。
在getNum { x }
表达式中,{ x }
是其中包含单个表达式x
的lambda,因此被视为返回值,因此,当调用lambda时,它仅求值closure中捕获的x
并将其值返回给getNum
。getNum(::getTen)
调用又是callable reference的用法(可通过::
符号区分),可以将其作为功能类型() -> Int
的值传递,就好像它是getNum { getTen() }
一样。
请参阅:语言参考中的Lambda Expressions and Anonymous Functions。