fun main (){
run(::topLevel)
run{::topLevel}
run{topLevel()}
run(topLevel())
}
fun topLevel() = println("print something")
1,2 run 将执行 fun 3-不会执行 4-是一个错误
通过这个例子我发现 () 和 {} 有不同的含义。 如果有人能解释 Kotlin 如何解释这 4 种情况,我将不胜感激。
最佳答案
如果您看到 run
函数的声明,
public inline fun <R> run(block: () -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
它需要一个签名 block (lambda)() -> R
。大括号 ({}
) 创建该签名的 lambda。
例如 {}
具有签名 () -> Unit
,{ 4 }
具有签名 () -> Int
。这些与 run 函数兼容。
当你调用 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
函数的 Unit(返回类型),例如 topLevel()
关于kotlin - Kotlin 如何通过运行示例解释 {} 或 (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62114105/