“if”语句与“then”结尾有什么区别?

时间:2010-06-21 09:55:40

标签: ruby

当我们在if语句的末尾添加then时,这两个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

5 个答案:

答案 0 :(得分:64)

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

if条件then true-part else false-part 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

答案 1 :(得分:12)

这是一个与你的问题没有直接关系的快速提示:在Ruby中,没有if语句这样的东西。实际上,在Ruby中,根本没有语句 Everything 是一个表达式。 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已经是一个表达式,所以实际上不需要三元运算符。

答案 2 :(得分:6)

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

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

您的示例中的括号不重要,您可以在任何一种情况下跳过它们。

有关详细信息,请参阅Pickaxe Book

答案 3 :(得分:2)

完全没有区别。

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

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

答案 4 :(得分:1)

我唯一想在多行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时要执行的块之间提供了直观的轮廓。