82

“If do-this”和“do-this”是否有一个简单的命令?

例如,我目前正在做

object.method ? a.action : nil

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

4

5 回答 5

141

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

在 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 中的布尔运算符不仅返回trueor false,而且返回最后一个计算表达式的值,因此您可以将它们用于控制流。这是一个从 Perl 导入的习语,看起来像这样:

object.method and a.action
于 2010-02-01T08:17:28.483 回答
121
a.action if object.method?
于 2010-02-01T03:06:01.667 回答
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 中不存在只允许使用单个语句或表达式的情况......

于 2010-02-01T04:39:56.853 回答
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'

于 2012-08-26T15:25:01.963 回答
1

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

if object.method; a.action end

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

你也可以更加冗长和对 rubocop 友好:

if object.method then a.action end
于 2016-10-31T15:03:27.437 回答