какой смысл возвращаться в Рубин?
в чем разница между return
и просто положить переменную, такую как следующее:
нет возврата
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = "No Problem"
end
mood
end
возвращение
def write_code(number_of_errors)
if number_of_errors > 1
mood = "Ask me later"
else
mood = puts "No Problem"
end
return mood
end
6 ответов:
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"
будет возвращен немедленно. В конце метода, однако, это не нужно, как вы заметили.
Edit: чтобы продемонстрировать, что
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]
, что приведет к ошибке.
использование "return" не требуется, если это последняя строка, которая должна быть выполнена в методе, так как Ruby автоматически возвращает последнее вычисленное выражение.
вам даже не нужно это окончательное "настроение", и вам не нужны эти задания в операторе IF.
def write_code(number_of_errors) if number_of_errors > 1 "ERROR" else "No Problem" end end puts write_code(10)
выход:
я использую return, когда я просматриваю список, и я хочу выйти из функции, если какой-либо член списка соответствует критериям. Я мог бы сделать это с помощью одного утверждения, как:
list.select{|k| k.meets_criteria}.length == 0
в некоторых ситуациях, но
list.each{|k| return false if k.meets_criteria}
это тоже одна строка-с, на мой взгляд, некоторой дополнительной гибкостью. Например, в первом примере предполагается, что это единственная строка в методе, и что мы хотим вернуться из этой точки независимо от того что?. Но если это тест, чтобы увидеть, безопасно ли продолжать работу с остальной частью метода, первый пример должен будет обрабатывать это по-другому.
EDIT:
чтобы добавить некоторую гибкость, рассмотрим следующую строку кода:
list_of_method_names_as_symbols.each{|k| list_of_objects.each{|j| return k if j.send(k)}}
Я уверен, что это может быть достигнуто, в одной строке, без
return
, но с моей головы я не вижу, как.но теперь это довольно гибкая строка кода это может быть вызвано с любым списком булевых методов и списком объектов, реализующих эти методы.
EDIT
следует отметить, что я предполагаю, что эта строка находится внутри метода, а не блока.
но это в основном стилистический выбор, я думаю, что в большинстве ситуаций вы можете и, возможно, должны избегать использования
return
.
Руби возвращается всегда! лучший способ-это
def write_code(number_of_errors) (number_of_errors > 1)? "ERROR" : "No Problem" end
это означает, что если number_of_errors > 1 он вернет ошибку иначе никаких проблем
его хороший ruby дает эту хорошую возможность не указывать оператор return явно, но я просто чувствую, что в качестве стандарта программирования всегда следует стремиться указывать операторы "return" везде, где это требуется. Это помогает сделать код более читаемым для тех, кто исходит из другого фона, такого как C++, Java, PHP и т. д. и учится Руби. оператор "return" ничего не повредит, поэтому зачем пропускать обычный и более стандартный способ возврата из функций.