是否有一个红宝石成语“If do-this”和“do-this”就像一个简单的命令一样?
例如,我正在做object.method ? a.action : nil
将else子句留空,但我觉得这可能是一种更惯用的方法,不需要在最后指定一个nil。 (或者,在这种情况下,我觉得占用多行代码会很浪费。
答案 0 :(得分:135)
作为一般规则:你几乎不需要Ruby中的三元运算符。你在C中需要它的原因是因为在C if
中是一个语句,所以如果你想返回一个值有来使用三元运算符,这是一个表达式。
在Ruby中,所有都是一个表达式,是没有语句,这使得三元运算符非常多余。您可以随时替换
cond ? then_branch : else_branch
与
if cond then then_branch else else_branch end
所以,在你的例子中:
object.method ? a.action : nil
相当于
if object.method then a.action end
@ preg Campbell指出的反过来相当于尾随的if
修饰符形式
a.action if object.method
此外,由于Ruby中的布尔运算符不仅返回true
或false
,而是返回最后一个计算表达式的值,因此可以将它们用于控制流。这是从Perl导入的习语,看起来像这样:
object.method and a.action
答案 1 :(得分:108)
a.action if object.method?
答案 2 :(得分:16)
Greg的回答是最好的,但是对于记录,甚至比C更多,表达式和语句在Ruby中是等价的,所以除了a.action if o.m?
之外,你还可以做以下事情:
object.method? && a.action
您可以写(a; b; c) if d
甚至
(a
b
c
) if d
或者就此而言:(x; y; z) ? (a; b c) : (d; e; f)
Ruby中没有允许只允许使用单个语句或表达式的情况......
答案 3 :(得分:2)
result = (<expression> && <true value>) || <false value>
value = 1
result = (value == 1 && 'one' ) || 'two'
result #=> 'one'
说明:值== 1&amp;&amp; 'one'#=&gt;返回最后一个表达式结果,value等于1,因此将评估section,并返回'one'。
value = 0
result = (value == 1 && 'one' ) || 'two'
result #=> 'two'
解释:值!= 1并且'和'表达式不会被评估,但是instad将被用于'或'表达式并返回'two'
答案 4 :(得分:1)
另一种可以在同一行上完成的方法是:
if object.method; a.action end
这被Rubocop认为是不好的风格,因为它使用分号来终止表达式,但我发现它在某些条件下比在最后添加if语句时更具可读性。在最后忽略if语句更容易,如果条件不正确,我并不总是想要返回一些东西(因为你被迫使用三元运算符)。
你也可以更加冗长和rubocop友好:
if object.method then a.action end