Есть ли настоящая причина предоставления заявления return
в Scala? (кроме того, что они более «совместимы с Java»)Цель заявления «вернуть» в Scala?
ответ
Игнорирование вложенных функций всегда позволяет заменить вычисления Scala с помощью эквивалентных вычислений без возврата. Этот результат восходит к ранним дням «структурированного программирования» и назван structured program theorem, достаточно умно.
С вложенными функциями ситуация меняется. Scala позволяет размещать «возврат» в глубину внутри серии вложенных функций. Когда возврат выполняется, управление выпрыгивает из всех вложенных функций в самый внутренний содержащий метод, из которого он возвращается (при условии, что метод на самом деле все еще выполняется, в противном случае создается исключение). Такой тип разворачивания стека может быть выполнен с исключениями, но не может быть выполнен путем механической перестройки вычисления (как это возможно без вложенных функций).
Наиболее распространенная причина, по которой вы действительно хотите вернуться изнутри вложенной функции, состоит в том, чтобы выйти из императивного для понимания или управления ресурсами блока. (Тело императива-осмыслению переводится на вложенную функцию, даже если она выглядит так же, как утверждение.)
for(i<- 1 to bezillion; j <- i to bezillion+6){
if(expensiveCalculation(i, j)){
return otherExpensiveCalculation(i, j)
}
withExpensiveResource(urlForExpensiveResource){ resource =>
// do a bunch of stuff
if(done) return
//do a bunch of other stuff
if(reallyDoneThisTime) return
//final batch of stuff
}
Он предоставляется для того, чтобы приспособить те обстоятельства, при которых сложно или громоздко организовать все пути потока управления, чтобы сходиться на лексическом конце метода.
Хотя, по словам Дэйва Гриффита, вы можете устранить любое использование return
, часто это может быть более запутанным, чем просто сократить сокращение короткого замыкания return
.
Помните, что return
возвращает методы, а не функции (литералы), которые могут быть определены в рамках метода.
Я знал, что это был ответ. Я просто не могу придумать никаких примеров. – Jus12
К счастью для меня, вы не просили каких-либо примеров ... –
+1 для обфускатора –
Я рассматриваю return
как полезно при написании императивного кода типа, который обычно означает, что I/Вывода. Если вы используете чистый функциональный код, вам не нужно (и не следует использовать) return
. Но с функциональным кодом вам может понадобиться лень, чтобы получить производительность, эквивалентную императивному коду, который может «ускользнуть» с нуля, используя return
.
Вот пример
Этот метод имеет много если-иначе заявления для управления потоком, потому что нет возврата (то есть то, что я пришел с, вы можете использовать свое воображение, чтобы расширить его). Я взял это из реального примера жизни и изменить его, чтобы быть фиктивный код (на самом деле это больше, чем это):
без возврата:
def process(request: Request[RawBuffer]): Result = {
if (condition1) {
error()
} else {
val condition2 = doSomethingElse()
if (!condition2) {
error()
} else {
val reply = doAnotherThing()
if (reply == null) {
Logger.warn("Receipt is null. Send bad request")
BadRequest("Coudln't receive receipt")
} else {
reply.hede = initializeHede()
if (reply.hede.isGood) {
success()
} else {
error()
}
}
}
}
}
С возвращением:
def process(request: Request[RawBuffer]): Result = {
if (condition1) {
return error()
}
val condition2 = doSomethingElse()
if (!condition2) {
return error()
}
val reply = doAnotherThing()
if (reply == null) {
Logger.warn("Receipt is null. Send bad request")
return BadRequest("Coudln't receive receipt")
}
reply.hede = initializeHede()
if (reply.hede.isGood)
return success()
return error()
}
На мой взгляд, второй является более читаемым и даже управляемым, чем первый. Глубина углубления (с хорошо отформатированным кодом) идет глубоко и глубоко, если вы не используете оператор return. И мне это не нравится :)
Я думаю, что опытные программисты Scala (а не я) могут более четко следовать первому фрагменту. – Jus12
Действительно, это немного «вкус», зависит от точки зрения разработчиков. например Мне нравится плоский – yerlilbilgin
- 1. Какова цель заявления `pass`?
- 2. Scala функции: гнездо-заявления
- 3. kthread_run - Цель последнего заявления (__k;)
- 4. Два заявления пакета в Scala
- 5. Какова цель этого заявления SQL?
- 6. Scala: какова цель «переопределения»
- 7. Scala For Loop, если заявления
- 8. Как вернуть заявления в хранимой процедуре
- 9. Блок заявления в анонимной Scala функционируют
- 10. Как вернуть None в scala?
- 11. Scala: Как вернуть тип
- 12. Scala, как вернуть постоянную
- 13. Какова цель языка программирования Scala?
- 14. Какова цель двойных скобок метода в Scala?
- 15. Какова цель использования «ключевого слова» в Scala?
- 16. Какова цель или значение: в scala
- 17. как вернуть значение из заявления LINQ
- 18. Scala: Рефакторинг тематического заявления использовать для понимания-
- 19. Заявления соответствия Scala с встроенными регулярными выражениями
- 20. Scala - Объяснение для регулярных выражений заявления
- 21. Цель C - Получить класс, чтобы вернуть значение
- 22. JavaScript: Дополняющие типы - Цель «вернуть это»
- 23. scala вернуть список строк в html
- 24. Scala SBT CoffeeScripted, правильно переопределить цель компиляции
- 25. Scala: Как вернуть часть или вариант
- 26. Как вернуть заявления, расположенные в If Conditionals (Обработка)
- 27. Почему не может скомпилировать Scala Длинного заявления переключателя в tableswitch
- 28. Цель классов классов в Haskell против цели черт в Scala
- 29. Как вернуть WebBrowser.Element с Selenium и Scala
- 30. Как вернуть значение от Scala def
Спасибо за ответ.Это очень информативно. – Jus12
Я думаю, что это более формальный ответ. Меня интересует доказательство упомянутого вами результата. Можете ли вы предоставить некоторые рекомендации? – Jus12
Добавлена ссылка на wikipedia для структурированной программной теоремы. –