“If do-this”和“do-this”是否有一个简单的命令?
例如,我目前正在做
object.method ? a.action : nil
将 else 子句留空,但我觉得可能有一种更惯用的方式来执行此操作,而不必在末尾指定 nil。(或者,我觉得在这种情况下占用多行代码会很浪费。
“If do-this”和“do-this”是否有一个简单的命令?
例如,我目前正在做
object.method ? a.action : nil
将 else 子句留空,但我觉得可能有一种更惯用的方式来执行此操作,而不必在末尾指定 nil。(或者,我觉得在这种情况下占用多行代码会很浪费。
作为一般规则:在 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 中的布尔运算符不仅返回true
or false
,而且返回最后一个计算表达式的值,因此您可以将它们用于控制流。这是一个从 Perl 导入的习语,看起来像这样:
object.method and a.action
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 中不存在只允许使用单个语句或表达式的情况......
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'
可以在同一行上完成的另一种方法是:
if object.method; a.action end
这被 Rubocop 认为是不好的风格,因为它使用分号来终止表达式,但我发现它在某些情况下比在末尾添加 if 语句更具可读性。在最后忽略 if 语句更容易,如果条件不成立,我并不总是想返回一些东西(因为你被迫使用三元运算符)。
你也可以更加冗长和对 rubocop 友好:
if object.method then a.action end