在下面的代码中,我有2个函数-第一个函数包装在lambda主体中,另一个不包含。
fun first() = { println("first")}
fun second() = println("second")
first()
second()
仅打印second()
-为什么打印?
答案 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
返回一个函数,但不调用它。