没有其他Ruby的三元运算符

Rya*_*ony 73 ruby conditional operators conditional-operator

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

例如,我现在正在做

object.method ? a.action : nil
Run Code Online (Sandbox Code Playgroud)

将else子句留空,但我觉得这可能是一种更惯用的方法,不需要在最后指定一个nil.(另外,在这种情况下,我觉得占用多行代码会很浪费.

Jör*_*tag 136

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

在Ruby中,一切是一个表达式,也没有报表,这使得三元操作几乎是多余的.你总是可以替换

cond ? then_branch : else_branch
Run Code Online (Sandbox Code Playgroud)

if cond then then_branch else else_branch end
Run Code Online (Sandbox Code Playgroud)

所以,在你的例子中:

object.method ? a.action : nil
Run Code Online (Sandbox Code Playgroud)

相当于

if object.method then a.action end
Run Code Online (Sandbox Code Playgroud)

正如@Greg Campbell指出的那样反过来相当于尾随if修饰符形式

a.action if object.method
Run Code Online (Sandbox Code Playgroud)

此外,由于Ruby中的布尔运算符不仅仅返回true或者false,而是最后一个计算表达式的值,您可以将它们用于控制流.这是从Perl导入的习语,看起来像这样:

object.method and a.action
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案! (12认同)
  • 三元运算符`cond?a:b`短于`如果cond然后a else b end`,那就单独让我用它来保存11个字符;-) (5认同)
  • [Ruby 风格指南](https://github.com/bbatsov/ruby-style-guide#ternary-operator) 指出:“优先使用三元运算符 (`?:`) 而不是 `if/then/else/end` 构造.它更常见,显然更简洁”。 (2认同)

Dig*_*oss 16

Greg的答案是最好的,但是对于记录,甚至比在C中更多,表达式和语句在Ruby中是等价的,所以除了a.action if o.m?你还可以做以下事情:

object.method? && a.action
Run Code Online (Sandbox Code Playgroud)

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

(a
 b
 c
) if d
Run Code Online (Sandbox Code Playgroud)

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

在Ruby中没有允许只允许单个语句或表达式的情况......