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

10-08 18:20