Можете ли вы вернуть @ label какое-то значение в kotlin? - PullRequest
0 голосов
/ 05 сентября 2018

Я только что узнал о помеченных возвратах в kotlin, и написал этот пример кода, где я передаю лямбду в with, а есть еще одну лямбду, передаваемую в forEach, и я пытался вернуться из with в forEach по какой-то причине происходит сбой компилятора, вот код:

fun main(args: Array<String>) : Unit {
    val l = listOf(listOf(1,2,3), listOf(4,5,6))
    val t = label@ with(l) {
        get(0).forEach {
            return@label 2
        }
    }
    println(t)
}

Должно ли это вообще быть разрешено в Котлине? Это ошибка компилятора?

1 Ответ

0 голосов
/ 05 сентября 2018

Обратите внимание, что если вы просто хотите вернуться с with, вы должны вместо этого использовать return@with.

Итак, ваш код должен выглядеть так:

fun main(args: Array<String>) : Unit {
  val l = listOf(listOf(1,2,3), listOf(4,5,6))
  val t = with(l) {
    get(0).forEach {
      return@with 2
    }
  }
  println(t)
}

и да ... он вернет 2 тогда .. Вы также можете использовать return@forEach, если вы просто хотите вернуться с forEach ...

Если вы действительно хотите использовать вместо этого свою собственную метку, убедитесь, что вы поместили ее перед открывающей фигурной скобкой (без пробела (см. Также Соглашение о кодировании Kotlin относительно лямбда-форматирования )), например ::

fun main(args: Array<String>) : Unit {
  val l = listOf(listOf(1,2,3), listOf(4,5,6))
  val t = with(l) label@{
    get(0).forEach {
      return@label 2
    }
  }
  println(t)
}

Также обратите внимание: если это был for, while или что-то еще, где можно использовать continue или break, то вы фактически размещаете метку впереди (см. Ссылка на Kotlin # Break and Продолжить ярлыки ), например:

lambda@ for (i in 1..3) { 
  break@label
}

Наконец: старайтесь по возможности опускать собственные метки В большинстве случаев они вам действительно не нужны ... и, вероятно, уже достаточно повторно использовать существующие метки return @. Проверьте также Соглашения о кодировании Kotlin, например возвращается в лямбду

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