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
这里是一个游乐场链接: