假设我有一个接受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

10-02 11:02