当我们在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
答案 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
时要执行的块之间提供了直观的轮廓。