没有其他Ruby的三元运算符

时间:2010-02-01 03:03:16

标签: ruby operators conditional conditional-operator

是否有一个红宝石成语“If do-this”和“do-this”就像一个简单的命令一样?

例如,我正在做

object.method ? a.action : nil

将else子句留空,但我觉得这可能是一种更惯用的方法,不需要在最后指定一个nil。 (或者,在这种情况下,我觉得占用多行代码会很浪费。

5 个答案:

答案 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中的布尔运算符不仅返回truefalse,而是返回最后一个计算表达式的值,因此可以将它们用于控制流。这是从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