“ lambda @”在科特林语中是什么意思

时间:2019-03-06 19:30:49

标签: kotlin

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

我们有这样的代码:

-XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly

https://pl.kotl.in/Syah1jaIN处运行,它将编译并被正确调用

我认为“ lambda @”是一个注释,但此处的文档: https://kotlinlang.org/docs/reference/annotations.html 指的是语法排序,例如“ @word”,而不是“ word @”。

3 个答案:

答案 0 :(得分:3)

它确实是一个标签,并且在该示例中特别有用,因为它为匿名函数添加了标签。您可以使用标签作为合格的引用(例如this)。

在下面的示例中,lambda定义了内部方法nested,该方法可能要从this访问funLit。由于它是匿名的,因此我们需要对其进行标记,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

答案 1 :(得分:2)

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

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
}

答案 2 :(得分:1)

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

通常在lambda和循环中使用,例如跳出嵌套循环。