fun main (){
run(::topLevel)
run{::topLevel}
run{topLevel()}
run(topLevel())
}
fun topLevel() = println("print something")
1,2运行将执行乐趣
3-将不执行
4-是错误
通过此示例,我发现()和{}具有不同的含义。
如果有人将解释Kotlin如何解释这4种情况,将不胜感激。
最佳答案
如果看到run
函数的声明,
public inline fun <R> run(block: () -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
它需要签名
() -> R
的一个块(一个lambda)。圆括号({}
)创建该签名的lambda。例如
{}
具有签名() -> Unit
,{ 4 }
具有签名() -> Int
。这些与运行功能兼容。当您调用run时,实际上发生的是:
run { topLevel() }
// is equivalent to
run() { topLevel() }
// is equivalent to
run({ topLevel })
希望您完全理解了由花括号
{}
创建的lambda,并且可以将其置于函数的调用之外。现在,如果您谈论
::
运算符,它将返回该函数的引用,该函数本身就是一个lambda签名。例如,
::topLevel
将返回() -> Unit
,因为它不带任何参数且不返回任何值(即Unit)。第二和第四将不起作用,因为。
在第二个:
run{::topLevel}
中,将() -> () -> Unit
传递给运行。即它传递了一个函数,该函数返回对函数topLevel
的引用。因此,要使其工作,您必须编写:run{::topLevel}()
它的作用是返回
::topLevel
,我们使用调用()
的topLevel
对其进行调用。第四个不会编译,因为您正在传递通过调用
topLevel
函数返回的topLevel()
函数的Unit(返回类型),就像ojit_code