В чем разница между утверждениями «если» и «потом» в конце? - PullRequest
54 голосов
/ 21 июня 2010

В чем разница между этими двумя операторами Ruby if, когда мы ставим then в конце оператора if?

if(val == "hi") then
  something.meth("hello")
else
  something.meth("right")
end

и

if(val == "hi")
  something.meth("hello")
else
  something.meth("right")
end

Ответы [ 5 ]

66 голосов
/ 21 июня 2010

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

if условие then истинная часть else ложная часть end

then необязательно , если вы не хотите написать if выражение в одну строку.Для if-else-end, охватывающего несколько строк, символ новой строки действует как разделитель, отделяющий условное выражение от истинной части

# can't use newline as delimiter, need keywords
puts if (val == 1) then '1' else 'Not 1' end

# can use newline as delimiter
puts if (val == 1)
  '1'
else
  'Not 1'
end
12 голосов
/ 21 июня 2010

Вот краткий совет, который не имеет прямого отношения к вашему вопросу: в Ruby нет такой вещи, как оператор if. На самом деле в Ruby нет операторов вообще . Все является выражением. Выражение if возвращает значение последнего выражения, которое было оценено в выбранной ветви.

Таким образом, нет необходимости писать

if condition
  foo(something)
else
  foo(something_else)
end

Это лучше написать как

foo(
  if condition
    something
  else
    something_else
  end
)

или как однострочный

foo(if condition then something else something_else end)

В вашем примере:

something.meth(if val == 'hi' then 'hello' else 'right' end)

Примечание: в Ruby также есть троичный оператор (condition ? then_branch : else_branch), но это совершенно не нужно и его следует избегать. Единственная причина, почему троичный оператор необходим в таких языках, как C, заключается в том, что в C if является оператором и, следовательно, не может возвращать значение. Вам нужен троичный оператор, потому что это выражение и единственный способ вернуть значение из условия. Но в Ruby if уже является выражением, поэтому в действительности нет необходимости в троичном операторе.

6 голосов
/ 21 июня 2010

then требуется только в том случае, если вы хотите записать выражение if в одну строку:

if val == "hi" then something.meth("hello")
else something.meth("right")
end

То, что скобки в вашем примере не имеют значения, вы можете пропустить их в любом случае.

Подробнее см. Книга кирки .

2 голосов
/ 21 июня 2010

Нет никакой разницы.

И, только к вашему сведению, ваш код может быть оптимизирован до

something.meth( val == 'hi' ? 'hello' : 'right' )
1 голос
/ 01 августа 2018

Единственный раз, когда мне нравится использовать then на многострочном if/else (да, я знаю, что это не требуется), это когда есть несколько условий для if, например так:

if some_thing? ||
  (some_other_thing? && this_thing_too?) ||
  or_even_this_thing_right_here?
then
  some_record.do_something_awesome!
end

Я считаю, что он гораздо более читабелен, чем любой из этих (полностью допустимых) параметров:

if some_thing? || (some_other_thing? && this_thing_too?) || or_even_this_thing_right_here?
  some_record.do_something_awesome!
end

# or

if some_thing? ||
  (some_other_thing? && this_thing_too?) ||
  or_even_this_thing_right_here?
  some_record.do_something_awesome!
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...