代码之家  ›  专栏  ›  技术社区  ›  Toni Joe

为什么在Kotlin中将变量传递给lambda有效?

  •  2
  • Toni Joe  · 技术社区  · 6 年前

    假设我有一个接受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有效?有什么想法吗?谢谢。

    1 回复  |  直到 6 年前
        1
  •  3
  •   hotkey    6 年前

    在Kotlin中,lambda中的最后一个或单个表达式 is the return value .

    getNum { x } 表达式, { x } 是具有单个表达式的lambda x 在它中,它被认为是返回值,因此当调用lambda时,它只计算 X 捕获在 closure 并将其值返回到 getNum .

    这个 getNum(::getTen) 反过来,call是 callable reference (可通过 :: 符号),可以作为函数类型的值传递 () -> Int 就像是 getNum { getTen() } .

    见: Lambda Expressions and Anonymous Functions 在语言参考中。