какая точка возврата в Ruby? - PullRequest
76 голосов
/ 05 января 2011

В чем разница между return и простой переменной:

Ответы [ 6 ]

112 голосов
/ 05 января 2011

return позволяет вам пробиться раньше:

def write_code(number_of_errors)
  return "No problem" if number_of_errors == 0
  badness = compute_badness(number_of_errors)
  "WHAT?!  Badness = #{badness}."
end

Если number_of_errors == 0, то "No problem" будет возвращено немедленно. В конце метода, как вы заметили, он не нужен.


Редактировать: Чтобы продемонстрировать, что return немедленно завершается, рассмотрите эту функцию:

def last_name(name)
  return nil unless name
  name.split(/\s+/)[-1]
end

Если вы вызовете эту функцию как last_name("Antal S-Z"), она вернет "S-Z". Если вы называете это как last_name(nil), возвращается nil. Если return не немедленно прервется, он попытается выполнить nil.split(/\s+/)[-1], что приведет к ошибке.

37 голосов
/ 05 января 2011

Использование «return» не нужно, если это последняя строка, которая должна быть выполнена в методе, поскольку Ruby автоматически возвращает последнее вычисленное выражение.

Вам даже не нужно это последнее «настроение», и вам не нужны эти назначения в выражении IF.

def write_code(number_of_errors)
    if number_of_errors > 1
       "ERROR"
    else
       "No Problem"
    end  
end

puts write_code(10)

Выход:

ERROR

4 голосов
/ 27 июля 2013

Руби возвращается всегда! лучший способ это

def write_code(number_of_errors)
  (number_of_errors > 1)? "ERROR" : "No Problem"
end

это означает, что если number_of_errors> 1, он вернет ERROR, иначе нет проблем

4 голосов
/ 05 января 2011

Я использую return, когда просматриваю список, и хочу выйти из функции, если какой-либо член списка соответствует критериям.Я мог бы сделать это с помощью одного утверждения вроде:

list.select{|k| k.meets_criteria}.length == 0

в некоторых ситуациях, но

list.each{|k| return false if k.meets_criteria}

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

РЕДАКТИРОВАТЬ:

Чтобы добавить некоторую гибкость, рассмотрите следующую строку кода:

list_of_method_names_as_symbols.each{|k| list_of_objects.each{|j| return k if j.send(k)}}

Я уверен, что это может быть выполнено, в одну строку, без return, ноот макушки головы я не вижу как.

Но теперь это довольно гибкая строка кода, которую можно вызывать любым списком логических методов и списком объектов, реализующих эти методы.

EDIT

Следует отметить, что я предполагаю, что эта строка находится внутри метода, а не блока.


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

3 голосов
/ 09 декабря 2013

Его приятный рубин дает хорошую возможность не задавать оператор return явно, но я просто чувствую, что как стандарт программирования всегда нужно стремиться указывать операторы return везде, где это необходимо. Это помогает сделать код более читабельным для тех, кто приходит из разных областей, таких как C ++, Java, PHP и т. Д., И изучает ruby. Оператор return ничего не повредит, поэтому пропустите обычный и более стандартный способ возврата из функций.

0 голосов
/ 05 января 2011

Unnecesarity return в последней строке в функции просто синтаксический сахар Ruby. В большинстве процедурных языков вам нужно написать return в каждой (не void в C ++) функции.

...