Kotlin 什么是;“兰姆达”;科特林平均值

Kotlin 什么是;“兰姆达”;科特林平均值,kotlin,Kotlin,从那里: 我们有这样一个代码: val funLit = lambda@ fun String.() {} 在那里运行它编译并被无错误地调用 我认为“lambda@”是一个注释,但这里的文档: 指类似于“@word”的语法分类,而不是“word@”。它不是注释,而是标签: 它通常用于lambda和循环,例如跳出嵌套循环。这些被称为标签。考虑这个例子。带的接受接收器(StringBuilder此处)和带接收器的lambda(已解释)。在第二个参数中,lambda表达式this引用了StringB

从那里:

我们有这样一个代码:

val funLit = lambda@ fun String.() {}
在那里运行它编译并被无错误地调用

我认为“lambda@”是一个注释,但这里的文档:
指类似于“@word”的语法分类,而不是“word@”。

它不是注释,而是标签:


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

这些被称为标签。考虑这个例子。带的
接受接收器(
StringBuilder
此处)和带接收器的lambda(已解释)。在第二个参数中,lambda表达式this
引用了
StringBuilder
。因此,如果您
打印(此)
它与合格的
打印相同(this@with)
。当您想要访问外部
引用时,限定的
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
}

它确实是一个标签,在该示例中特别有用,因为它标记匿名函数。您可以使用标签来限定引用(如
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:        funLit
this@lambda: funLit
this        in String.nested(): nested
this@nested in String.nested(): nested
this@lambda in String.nested(): funLit
这里是一个游乐场链接: