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

Kotlin如何通过运行示例解释{}或(),kotlin,Kotlin,1,2次跑步将带来乐趣 3-不会执行 4-这是一个错误 通过这个例子,我发现()和{}有不同的含义。 如果有人能解释Kotlin是如何解释这4个案例的,我将不胜感激 在kotlin中,当您使用{}并在其中写入内容时,意味着您正在将一个块传递给后面的lambda 当您使用()时,表示您正在传递一个值,因此: run(someFunction())->这意味着您将someFunction()的返回值作为参数传递给run(),这将失败,因为run不将值作为参数,但它将lambda作为参数 run{so

1,2次跑步将带来乐趣 3-不会执行 4-这是一个错误

通过这个例子,我发现()和{}有不同的含义。
如果有人能解释Kotlin是如何解释这4个案例的,我将不胜感激

在kotlin中,当您使用
{}
并在其中写入内容时,意味着您正在将一个块传递给
后面的lambda

当您使用
()
时,表示您正在传递一个值,因此:

  • run(someFunction())
    ->这意味着您将
    someFunction()
    返回值作为参数传递给
    run()
    ,这将失败,因为
    run
    不将值作为参数,但它将lambda作为参数

  • run{someFunction}
    ->这意味着您正在传递一个
    lambda
    ,以便在
    run
    正文中调用。这将起作用,因为它只满足
    run
    函数签名

  • public内联趣味跑(block:()->R):R
    
    如果您看到
    run
    函数的声明

    public内联趣味跑(block:()->R):R{
    合同{
    callsInPlace(块,调用种类,恰好一次)
    }
    返回块()
    }
    
    它需要一块(λ)签名
    ()->R
    。而圆括号(
    {}
    )创建了该签名的lambda

    例如,
    {}
    具有签名
    ()->单元
    {4}
    具有签名
    ()->Int
    。它们与run函数兼容

    当您调用run时,实际发生的情况是:

    运行{topLevel()}
    //相当于
    运行(){topLevel()}
    //相当于
    运行({topLevel})
    
    希望您完全理解lambda,它是由大括号
    {}
    创建的,可以放在函数调用之外

    现在,如果您讨论
    ::
    运算符,它将返回函数的引用,该引用本身就是lambda签名

    例如,
    ::topLevel
    将返回
    ()->Unit
    ,因为它不接受任何参数,也不返回任何内容(即Unit)


    第二个和第四个不起作用,因为

    第二步:
    run{::topLevel}
    ()->()->单元
    传递给run。i、 e.它传递一个函数,该函数返回对函数
    topLevel
    的引用。因此,要让它发挥作用,你必须写:

    运行{::topLevel}()
    
    它所做的是返回
    ::topLevel
    ,我们使用调用
    topLevel
    ()
    调用它


    第四个不会编译,因为您正在传递通过调用它返回的
    topLevel
    函数的单位(返回类型),就像
    topLevel()

    {}
    是签名
    ()->Unit
    的lambda,而
    ()
    是调用操作符的函数。第一个和第三个将编译,而不是第二个
    fun main (){
        run(::topLevel)
        run{::topLevel}
        run{topLevel()}
        run(topLevel())
        }
    fun topLevel() = println("print something")
    
    public inline fun <R> run(block: () -> R): R