我遇到了嵌套运行块的情况。我想从内部运行块访问外部运行块this
。我在IntelliJ提示下尝试了此操作,但是在(this@run as String).equals("")
上收到ClassCastException。
有没有办法做到这一点?
示例代码:
fun main(args: Array<String>) {
"".run {
1.0.run {
(this@run as String).equals("")
}
}
}
答案 0 :(得分:3)
因为在该范围内有多个标签,其名称为run
。
为了访问外部运行块,只需将其标记为所需的任何内容即可。例如,run1@
和run2@
fun main(args: Array<String>) {
"".run run1@ {
1.0.run run2@ {
(this@run1 as String).equals("")
}
}
}
顺便说一句,在科特林,equals("")
可替换为== ""
答案 1 :(得分:1)
编辑
您将获得java.lang.ClassCastException
,因为this@run
引用了值1.0
(范围中最接近的值),然后您试图将其转换为String。如果您想使用 receiver 而不是 argument ,则可以为您的其中一个lambda使用替代apply
函数
示例
fun main(args: Array<String>) {
"".run {
1.0.apply {
println(this@run == "")
}
}
}
上一个
使用also
代替run
,这样您就可以将变量作为lambda的参数传递,而不是使用 receiver 的lambda传递。
示例
fun main(args: Array<String>) {
"".also { text ->
1.0.run {
println(this@run == "")
}
}
}
或者,您可以使用apply
代替run