没有别的三元运算符

有没有一个关于“ If do-this”和“ do-this”的红宝石习语,仅仅作为一个简单的命令?

例如,我现在正在做

object.method ? a.action : nil

把 else 子句保留为空,但我觉得可能有一种更惯用的方法,不需要在结尾指定一个 nil。(或者,我觉得在这种情况下使用多行代码是一种浪费。

55243 次浏览
a.action if object.method?

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 中不存在只允许单个语句或表达式的情况..。

一般来说: 在 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

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

值 = 1 Result = (value = = 1 & & ‘ one’) | | ‘ two’ 结果 # = > 「一」 解释: value = = 1 & & ‘ one’# = > 返回最后一个表达式的结果,value 等于1,因此将计算 section,并返回‘ one’。

值 = 0 Result = (value = = 1 & & ‘ one’) | | ‘ two’ 结果 # = > ‘ two’

解释: 价值!= 1和‘ and’表达式将不被求值,但是 instad 将使用‘ or’表达式并返回‘ two’

在同一条线上实现这一点的另一种方法是:

if object.method; a.action end

由于使用了分号来终止表达式,所以这种风格被 Rubopolice 认为是糟糕的,但是我发现在某些情况下,这种风格比在结尾添加 if 语句更具可读性。在结尾处忽略 if 语句更容易,而且如果条件不为真,我并不总是想返回一些内容(正如您被迫使用三元操作符一样)。

你也可以更冗长一点,更友好一点:

if object.method then a.action end