Использование возврата внутри лямбда?
В приведенном ниже коде я хочу показать свои пустые представления, если поездки пусты, а затем вернуться и не запускать приведенный ниже код, но компилятор говорит, что "возврат здесь не разрешен".
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
return
}
// run some code if it not empty
}
Есть ли способ вернуться так?
Я знаю, что могу просто положить его в блок if else, но я ненавижу писать, если что-то еще, это менее понятно или читаемо, на мой взгляд, когда есть еще несколько условий.
Ответы
Ответ 1
Просто используйте квалифицированный синтаксис [email protected]omingTrips
: [email protected]
.
В Котлин, return
внутри лямбда означает возвращение из внутренней вложенности fun
( не обращая внимания лямбды), и не допускается в лямбды, которые не встраиваются.
Синтаксис [email protected]
используется для указания области возврата. Вы можете использовать имя функции, передаваемой лямбда (fetchUpcomingTrips
) в качестве метки:
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
[email protected]
}
// ...
}
Связанные с:
Ответ 2
Обычный return
предполагает, что вы возвращаетесь из функции. Поскольку вы не можете вернуться из функции внутри лямбда, компилятор будет жаловаться. Вместо этого вы хотите вернуться из лямбда, и вы должны использовать метку:
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty()) {
showEmptyViews()
[email protected]
}
//run some code if it not empty
}
Ответ 3
Возвращения позволяют нам вернуться из внешней функции. Наиболее важным вариантом использования является возврат из лямбда-выражения
Оператор return в анонимной функции будет возвращаться из анонимной функции.
fun foo() {
ints.forEach(fun(value: Int) {
if (value == 0) return // local return to the caller of the anonymous fun, i.e. the forEach loop
print(value)
})
}
При возврате значения синтаксический анализатор отдает предпочтение квалифицированному возврату, т.е.
[email protected] 1
означает "return 1 at label @a", а не "вернуть помеченное выражение (@a 1)". Возврат По умолчанию возвращается из ближайшей закрывающей функции или анонимной функции.
Разрыв Завершает ближайший замкнутый контур.
Продолжить Переход к следующему шагу ближайшего замкнутого цикла.
Подробнее см. " Возвраты и переходы", "Разрыв" и "Продолжить наклейки".
Ответ 4
Альтернативой return
может быть
mainRepo.fetchUpcomingTrips { trips ->
if (trips.isEmpty())
showEmptyViews()
else {
//run some code if it not empty
}
}