Наткнулся тут на такую особенность Kotlin: return из функционального литерала выполняет выход из функции, в которой этот литерал объявлен. Например:
fun hasZeros(ints: List<Int>): Boolean {
ints.forEach {
if (it == 0)
return true // returns from hasZeros
}
return false
}
Если же нужно выйти только из этого блока кода, то используется return с квалификатором:
fun foo() {
ints.forEach lit@ {
if (it == 0)
return@lit // явная метка
//return@forEach // неявная метка – имя функции
print(it)
}
}
Меня интересует два вопроса:
— есть ли еще какой-то язык(-и) с таким же извращением?
— что вообще может твориться в голове, чтобы так сломать распространенное поведение?
P.S. Если тут есть кто-то из команды разрабатывающей Kotlin, то у вас в трансляции в javascript есть ошибка как раз в этом гулпом поведении.
| JS-код который генерируется |
| hasZeroes_9mvhws$: function (arr) {
var tmp$0, tmp$1, tmp$2;
tmp$0 = arr, tmp$1 = tmp$0.length;
for (var tmp$2 = 0; tmp$2 !== tmp$1; ++tmp$2) {
var element = tmp$0[tmp$2];
hasZeroes_9mvhws$f$break: {
if (element === 0)
break hasZeroes_9mvhws$f$break;
}
}
return false;
}
|
| |