Scala не имеет break
или continue
, поэтому некоторое циклическое поведение требует немного больше размышлений.
Раннее завершение цикла требует хвостовой рекурсии, исключений или scala.util.control.Breaks
(которые используют исключения).
Основанием для этого является то, что goto
они , как и они, представляют собой потоковые конструкции, которые затеняют поток и могут быть выполнены лучшими, менее удивительными способами.
Но, похоже, те же аргументы могут быть использованы для return
.
Почему Скала намеренно опускается break
и continue
, но не return
?
language-design
scala
control-structures
Пол Дрейпер
источник
источник
break
и мнеcontinue
понадобится дополнительная уборочная техника. OTOHreturn
- это способ упорядоченного завершения функции, и любое оборудование для очистки уже существует.breakable { for { break; } }
только запоздалая мысль, и, вероятно, далеко не эффективная.break
иcontinue
содержится в вашем вопросе и в ссылке в вашем вопросе. Вопрос вreturn
том, о чём именно был связан вопрос, на который я ссылался, и на который был дан ответ, по крайней мере, в ответе, получившем наибольшее количество голосов. Если два ответа вместе не отвечают на ваш вопрос, возможно, вы могли бы отредактировать вопрос, чтобы уточнить его.Ответы:
Перерыв и продолжить:
В своем выступлении о Scala Мартин Одерский назвал 3 причины не включать перерыв или продолжить работу на слайде 22:
И тогда он говорит: «Мы можем поддерживать их исключительно в библиотеках». На слайде 23 он дает код, который реализует
break
. Хотя я не достаточно хорошо знаю Scala, чтобы быть уверенным, похоже, что короткий фрагмент на этом слайде - это все, что нужно для реализацииbreak
, и этоcontinue
может быть реализовано в коде, который также короток.Возможность реализовывать подобные вещи в библиотеках упрощает основной язык.
В «Программировании в Scala, второе издание» Мартина Одерского, Лекса Спуна и Билла Веннерса дается следующее объяснение:
Возвращение:
Возвраты могут считаться немного обязательными по стилю, поскольку return - это глагол, команда, которая что-то делает. Но их также можно увидеть в чисто функциональном / декларативном виде: они определяют, что является возвращаемым значением функции (даже если в функции с множественными возвращениями они дают только частичное определение).
В той же книге говорится о следующем
return
:Методы завершают работу и возвращают значение, даже если
return
оператор не используется, поэтому с замыканиями проблем быть не может, так как в противном случае замыкания не сработают.Также не может быть проблем с зацеплением с функциональными литералами, так как функция все равно должна возвращать значение.
источник
Я думаю, что предыдущие ответы отдают должное проблемам определения семантики для
break
илиcontinue
в языковой форме для Scala с относительно непринужденным контекстом.Я написал небольшую библиотеку, которая определяет
break
иcontinue
в более ограниченном контексте: итерации по последовательностям через Scala для-понимания. Сосредоточив внимание на этом контексте, я считаю, что семантика становится однозначной и легко обоснованной.Библиотека доступна здесь: https://github.com/erikerlandson/breakable
Вот простой пример того, как это выглядит в коде:
источник