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中的布尔运算符不只是返回true
或false
,而且是最后一个求值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