红宝石-“ if”语句与“ then”末尾有什么区别?

当我们将then放在if语句的末尾时,这两个Ruby if语句之间有什么区别?

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

if(val == "hi")
  something.meth("hello")
else
  something.meth("right")
end
Mo. asked 2019-11-15T14:51:56Z
5个解决方案
68 votes

then是一个定界符,可帮助Ruby识别条件和表达式的实部。

then条件if真部件else假部件end

除非要在一行中编写if表达式,否则then是可选的。 对于跨越多行的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
Gishu answered 2019-11-15T14:52:39Z
12 votes

这是与您的问题没有直接关系的快速提示:在Ruby中,没有condition ? then_branch : else_branch语句之类的东西。 实际上,在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已经是一个表达式,因此实际上并不需要三元运算符。

Jörg W Mittag answered 2019-11-15T14:53:44Z
6 votes

仅当您要在一行上编写if表达式时才需要then

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

您的示例中的括号并不重要,无论哪种情况都可以跳过。

有关详细信息,请参见镐。

Douglas answered 2019-11-15T14:54:28Z
2 votes

完全没有区别。

而且,仅供参考,您的代码可以优化为

something.meth( val == 'hi' ? 'hello' : 'right' )
zed_0xff answered 2019-11-15T14:55:10Z
2 votes

我唯一喜欢在多行true上使用if(是的,我知道这不是必需的)是当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时要执行的块之间的视觉描述。

jeffdill2 answered 2019-11-15T14:55:55Z
translate from https://stackoverflow.com:/questions/3083636/what-is-the-difference-between-if-statements-with-then-at-the-end