【问题标题】:what does "lambda@" mean in KotlinKotlin 中的“lambda@”是什么意思
【发布时间】:2019-03-06 19:30:49
【问题描述】:

从那里:https://kotlinlang.org/docs/reference/this-expressions.html#qualified

我们有这样的代码:

val funLit = lambda@ fun String.() {}

在那里运行https://pl.kotl.in/Syah1jaIN 它编译并被正确调用

我认为“lambda@”是一个注释,但这里的文档: https://kotlinlang.org/docs/reference/annotations.html 指的是类似于“@word”的语法,而不是“word@”。

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    它确实是一个标签,并且在该示例中特别有用,因为它标记了一个匿名函数。您将标签用于限定引用(如 this)。

    在以下示例中,lambda 定义了一个内部方法nested,它可能希望从funLit 访问this。由于它是匿名的,我们需要对其进行标记,lambda 是一个任意标识符。

    fun main() {
        val funLit = lambda@ fun String.() {
            println("this:        " + this)
            println("this@lambda: " + this@lambda)
    
            fun String.nested() {
                println("this        in String.nested(): " + this)
                println("this@nested in String.nested(): " + this@nested)
                println("this@lambda in String.nested(): " + this@lambda)
            }
    
            "nested".nested()
        }
        "funLit".funLit()
    }
    

    运行它可以非常清楚地显示 this 使用限定符引用的内容。

    this:        funLit
    this@lambda: funLit
    this        in String.nested(): nested
    this@nested in String.nested(): nested
    this@lambda in String.nested(): funLit
    

    这是一个游乐场链接:https://pl.kotl.in/SJrlUs6LE

    【讨论】:

      【解决方案2】:

      这些被称为标签。考虑这个例子。 with 接受一个接收器(此处为StringBuilder)和一个带有接收器的 lambda(解释为 here)。在第二个参数中,lambda 表达式this 引用StringBuilder。因此,如果您print(this) 与合格的print(this@with) 相同。当您想从 Outer 的封闭实例中访问外部 this 引用时,合格的 this 是有意义的:

      class Outer{
          fun someFunction() = with(StringBuilder()){
              println(this)
              println(this@with) //same as this
              println(this@Outer)
          }
      }
      

      也可以设置自定义标签:

      fun someFunction() = with(StringBuilder()) customLabel@{
          println(this@customLabel) //same as this
      }
      

      【讨论】:

        【解决方案3】:

        不是注解,而是标签:https://kotlinlang.org/docs/reference/returns.html#break-and-continue-labels

        它通常用于 lambda 和循环,例如跳出嵌套循环。

        【讨论】:

          猜你喜欢
          • 2017-11-09
          • 1970-01-01
          • 1970-01-01
          • 2017-03-02
          • 1970-01-01
          • 2017-02-23
          • 1970-01-01
          • 2019-05-22
          • 1970-01-01
          相关资源
          最近更新 更多