objective заявления «вернуть» в Scala?

Есть ли настоящая причина предоставления оператора return в Scala? (кроме того, что они более «совместимы с Java»)

    Игнорируя вложенные функции, всегда можно заменить вычисления Scala на возврат с эквивалентными вычислениями без возврата. Этот результат восходит к ранним дням «структурированного программирования» и, как ни странно, называется теоретикой структурированной программы .

    С вложенными функциями ситуация меняется. 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 } 

    Он предоставляется для того, чтобы приспособить те обстоятельства, при которых сложно или громоздко организовать все пути управления streamом, чтобы сходиться на лексическом конце метода.

    Хотя это, безусловно, так, как говорит Дэйв Гриффит, что вы можете исключить любое использование return , часто может быть более запутанным, чем просто сократить сокращение с явным return .

    Имейте в виду, что return возвращается из методов, а не из функции (литералов), которые могут быть определены в методе.

    Вот пример

    У этого метода есть множество операторов if-else для управления streamом, потому что нет возврата (это то, с чем я пришел, вы можете использовать свое воображение для его расширения). Я взял это из примера реальной жизни и модифицировал его как фиктивный код (на самом деле он длиннее этого):

    Без возврата:

      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() } } } } } 

    С возrotationм:

      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. И мне это не нравится 🙂

    Я рассматриваю return как полезный при написании императивного стиля кода, который обычно означает код ввода-вывода. Если вы делаете чистый функциональный код, вам не нужно (и не следует использовать) return . Но с функциональным кодом вам может понадобиться лень, чтобы получить производительность, эквивалентную императивному коду, который может «убежать раньше» с использованием return .

    Interesting Posts

    Что я могу сделать, чтобы извлечь окна, которые ушли с экрана?

    Полноскоростное соединение 802.11n между двумя ноутбуками без точки доступа

    Как распознать прямоугольники в этом изображении?

    MATLAB: применить фильтр низких частот или верхних частот к массиву

    Заменить значение для выбранной ячейки в pandas DataFrame без использования индекса

    Сборщик мусора в java – установить объект null

    Каковы сочетания клавиш для навигации по современным приложениям пользовательского интерфейса?

    Это ошибка в MonoTouch GC?

    Как читать .pages с флеш-накопителя на ПК

    Как улавливать исключения / недостающие страницы в Laravel 5?

    Подождите, пока флаг = true

    В чем разница между «AS» и «IS» в хранимой процедуре Oracle?

    Критерии Hibernate возвращают дочерние элементы несколько раз с помощью FetchType.EAGER

    MySql: добавьте строку и получите контент

    Обнаруживать iPhone / iPad исключительно css

    Давайте будем гением компьютера.