Ruby没有别的三元运算符

有没有一个ruby的成语“如果这样做”,“做这个”只是一个简单的命令?

例如,我现在正在做

object.method ? a.action : nil 

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

 a.action if object.method? 

作为一般规则:你几乎从不需要Ruby中的三元运算符。 你在C中需要它的原因是因为在C中if是一个语句,所以如果你想返回一个值,你必须使用三元运算符,这是一个expression式。

在Ruby中, 一切都是expression式,没有语句,这使得三元运算符变得多余。 你可以随时更换

 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 

正如@格雷格·坎贝尔指出的那样,相当于尾随的修饰语forms

 a.action if object.method 

另外,由于Ruby中的布尔运算符不只是返回truefalse ,而且是最后一个求值expression式的值,所以可以将它们用于控制stream。 这是从Perl导入的一个成语,看起来像这样:

 object.method and a.action 

格雷格的答案是最好的,但为了logging,甚至比在C中,expression式和语句在Ruby中是等价的,那么除了a.action if om?之外, a.action if om? 你也可以做这样的事情:

 object.method? && a.action 

(a; b; c) if d或者甚至可以写(a; b; c) if d

 (a b c ) if d 

或者就此而言: (x; y; z) ? (a; bc) : (d; e; f) (x; y; z) ? (a; bc) : (d; e; f)

Ruby中只有一个语句或expression式是不允许的。

result = (<expression> && <true value>) || <false value>

value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one'说明:value == 1 &&'one'#=>返回最后一个expression式的结果,value是等于1,所以section将被求值,返回'one'。

value = 0 result = (value == 1 && 'one' ) || 'two' result #=> 'two'

解释:value!= 1和'and'expression式不会被评估,但instad将被使用'或'expression式,并返回'two'

另一种方式可以在同一行上完成:

 if object.method; a.action end 

这被Rubocop认为是不好的风格,因为它使用分号来终止expression式,但是我发现它在一些条件下比在最后加上if语句更具可读性。 最后忽略一个if语句比较容易,如果条件不成立,我并不总是想要返回一些东西(因为你被三元运算符强制)。

你也可以更加详细和rubocop友好:

 if object.method then a.action end