Kotlin и тараканы
От: std.denis Россия  
Дата: 07.12.15 20:08
Оценка: 15 (1)
Наткнулся тут на такую особенность 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;
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.