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