为什么Kotlin Lambda函数在调用时不执行?

时间:2019-02-28 08:47:19

标签: kotlin

在下面的代码中,我有2个函数-第一个函数包装在lambda主体中,另一个不包含。

fun first() = { println("first")}
fun second() = println("second")

first()
second()

仅打印second()-为什么打印?

4 个答案:

答案 0 :(得分:3)

第一个是返回函数的函数。实际上发生的是first()返回了另一个函数,该函数打印“ first”,但不执行。

为此,您必须通过添加另一组括号来调用它:

first()()
// Or
val resultOfFirst = first()
resultOfFirst()

之所以会发生这种情况,是因为函数的=符号类似于return语句,并且当您将内容包装在{}中时,实际上是在创建lambda。因此,首先返回一个lambda,但不执行该操作

答案 1 :(得分:2)

函数first返回函数{ println("first")}

调用first()不会执行任何操作-甚至没有捕获到它的return参数。

如果没有lambda,则等效,也许更容易理解为这种形式:

fun firstWithoutLambda() = fun() { println("first w/o lambda")}

给他们打电话:

first().invoke()
firstWithoutLambda().invoke()

它将打印您期望的消息。

Kotlin原始教程中的一篇不错的文章:https://kotlinlang.org/docs/reference/lambdas.html

答案 2 :(得分:1)

这很简单。检查这些类型:

fun first(): () -> Unit = { println("first") }
fun second(): Unit = println("second")

因此,当您调用first时,您会得到lamda表达式。要调用此功能,请使用.invoke()(或简单地使用()):

first().invoke()
// or
first()()

第二个很明显-它是在调用时执行的。

答案 3 :(得分:0)

尝试

first()()

first().invoke()

first返回一个函数,但不调用它。