Подтвердить что ты не робот

Есть ли какая-то причина, чтобы избежать возвратных утверждений

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

Есть ли какая-либо польза в том, чтобы избегать этих явных операторов возврата?

4b9b3361

Ответ 1

A return может быть реализовано путем исключения исключения, поэтому он может иметь определенные накладные расходы над стандартным способом объявления результата метода. (Спасибо за Ким Штебеля за указание на это не всегда, может быть, даже не часто).

Кроме того, a return на замыкании вернется из метода, в котором определяется замыкание, а не просто из самого замыкания. Это делает его полезным для этого и бесполезно для возврата результата из замыканий.

Пример выше:

def find[T](seq: Seq[T], predicate: T => Boolean): Option[T] = {
  seq foreach { elem =>
    if (predicate(elem)) return Some(elem) // returns from find
  }
  None
}

Если вы все еще не понимаете, elem => if (predicate(elem)) return Some(elem) - это метод apply анонимного объекта, который реализует Function1 и передается в foreach в качестве параметра. Удалите из него return, и он не будет работать.

Ответ 2

Один из недостатков заключается в том, что тип возвращаемого значения не может быть выведен. Все остальное - дело стиля. То, что кажется вам непонятным или запутанным, может быть совершенно "естественным" для кого-то другого.

Ответ 3

Явный возврат прерывает поток управления. Например, если у вас есть оператор вроде

if(isAuth(user)) {
 return getProfile(user)
}
else {
 return None
}

структура управления (if) не закончена, поэтому я утверждаю, что она более запутанна. Для меня это аналогично высказыванию break. Кроме того, принцип Scalas "все является ценностью" уменьшает необходимость использования явных возвратов, что приводит к меньшему количеству людей, использующих ключевое слово, которое полезно только для инструкций def:

// start 
def someString:String = return "somestring"

// def without return 
def someString = "somestring"

// after refactoring
val someString = "somestring"    

Вы видите, что необходимо добавить аннотацию типа, и при изменении def на val требуется удалить возврат.