首页 > 解决方案 > 为什么在 Kotlin 中将变量传递给 lambda 有效?

问题描述

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

为什么传递变量而不是 lambda 有效?任何的想法?谢谢。

标签: lambdakotlin

解决方案


在 Kotlin 中,lambda 中的最后一个或单个表达式是返回值

getNum { x }表达式中,{ x }是一个带有单个表达式的 lambda,x因此被视为返回值,因此当调用 lambda 时,它只计算闭包x中捕获的值并将其值返回给.getNum

反过来getNum(::getTen),调用是可调用引用的使用(可通过符号区分::),它可以作为函数类型的值传递,() -> Int就像它是一样的getNum { getTen() }

请参阅:语言参考中的Lambda 表达式和匿名函数


推荐阅读