какой смысл возвращаться в Рубин?


в чем разница между 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 73

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" ничего не повредит, поэтому зачем пропускать обычный и более стандартный способ возврата из функций.

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