kotlin - Kotlin 如何通过运行示例解释 {} 或 ()

标签 kotlin

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/

相关文章:

metadata - 为什么 Kotlin 在 Kotlin 类文件中保存 MetaData?

mockito - 如何使用mockito验证kotlin varargs函数

java - 使用 Kotlin 在泛型类中获取 getter(或方法或属性)列表

android - 更新 androidx.constraintlayout :constraintlayout lib to 2. 0.2 版本后得到 crash isRtl() null reference

kotlin - VSCode 长时间显示 'Installing Kotlin Language Server'。我能阻止吗?

maven - 使用 Docker 和 Kotlin 缓存 Maven

android - 如何取消和替换 Kotlin Coroutine Call

java - Jackson 无法在 Android 上加载 JDK7 类型

Android 工作管理器 - ExistingPeriodicWorkPolicy.KEEP 和 .Replace 之间的区别

Android 构建错误 : "lStar not found..."