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

В чем разница между "if" заявлениями с "then" в конце?

Какая разница между этими двумя операторами 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
4b9b3361

Ответ 1

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

if условие then true-part else false-part end

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

# 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

Ответ 2

Вот быстрый совет, который напрямую не связан с вашим вопросом: в 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 уже является выражением, поэтому нет необходимости в тройном операторе.

Ответ 3

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

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

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

Подробнее см. Pickaxe Book.

Ответ 4

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

И, просто FYI, ваш код можно оптимизировать для

something.meth( val == 'hi' ? 'hello' : 'right' )

Ответ 5

Единственное время, которое мне нравится использовать 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.