没有别的Ruby三元运算符


78

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

例如,我目前正在做

object.method ? a.action : nil

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


这取决于上下文,但是有时读取一个if / while / begin块在体内只有一行的情况下比读一些稠密/简洁的语句更为优雅。
glenn jackman 2010年

Answers:



139

作为一般规则: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

正如@Greg Campbell指出的那样,它等效于尾随if修饰符形式

a.action if object.method

另外,由于Ruby中的布尔运算符不仅返回truefalse,而是最后求值表达式的值,因此可以将它们用于控制流。这是从Perl导入的一个惯用法,看起来像这样:

object.method and a.action

13
这是一个很好的答案!
Tim Hettler 2012年

7
三元运算符cond ? a : b比短if cond then a else b end,仅此一项就让我用它来保存11个字符;-)
Markus

1
《 Ruby样式指南》指出:“偏爱于结构的三元运算符(?:if/then/else/end。它更为常见,而且显然更加简洁”。
Kurt Bourbaki

18

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

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

value = 1 result = (value == 1 && 'one' ) || 'two' result #=> 'one' 说明:value == 1 &&'one'#=>返回最后一个表达式结果,value等于1,因此将对段求值,并返回'one'。

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

说明:value!= 1和'and'表达式将不被评估,但是instad将被使用'or'表达式并返回'two'


1

可以在同一行上完成此操作的另一种方法是:

if object.method; a.action end

Rubocop认为这是不好的样式,因为它使用分号来终止表达式,但是我发现在某些情况下比在末尾加上if语句更具可读性。在末尾忽略if语句会更容易,并且如果条件不成立(因为您被强制使用三元运算符),我并不总是希望返回某些内容。

您也可以变得更详细和更友好:

if object.method then a.action end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.