Вложенные беговые блоки в Котлине - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть ситуация, когда у меня есть вложенные блоки выполнения.И я хочу получить доступ к внешнему блоку прогона this из внутреннего блока прогона.Я попробовал это, следуя подсказкам IntelliJ, но получая ClassCastException на (this@run as String).equals("").Есть ли способ добиться этого?

Пример кода:

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

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Поскольку в этой области имеется более одной метки с таким именем run.

Чтобы получить доступ к внешнему блоку выполнения, просто пометьте его как угодно.Например, run1@ и run2@

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

Кстати, в Котлине, equals("") заменяется на == ""

0 голосов
/ 31 декабря 2018

РЕДАКТИРОВАТЬ

Вы получаете java.lang.ClassCastException, потому что this@run ссылается на значение 1.0 (самое близкое в области действия), которое затем вы пытаетесь преобразовать в строку.Если вы хотите использовать приемник вместо аргумент , вы можете использовать альтернативную функцию apply для одной из ваших лямбд

Пример

fun main(args: Array<String>) {
    "".run  {
        1.0.apply {
            println(this@run == "")
        }
    }
}

Предыдущий

Используйте also вместо run, таким образом, переменная будет передана как параметр лямбды вместолямбда с приемником .

Пример

fun main(args: Array<String>) {
    "".also  { text ->
        1.0.run {
            println(this@run == "")
        }
    }
}

В качестве альтернативы, вы можете использовать apply вместо запуска

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...