Kotlin中的嵌套运行块

时间:2018-12-31 02:30:57

标签: kotlin

我遇到了嵌套运行块的情况。我想从内部运行块访问外部运行块this。我在IntelliJ提示下尝试了此操作,但是在(this@run as String).equals("")上收到ClassCastException。 有没有办法做到这一点?

示例代码:

fun main(args: Array<String>) {
    "".run  {
        1.0.run {
            (this@run as String).equals("")
        }
    }
}

2 个答案:

答案 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