“有没有一种惯用的Ruby方法?”;如果;或;除非;基于真值?

“有没有一种惯用的Ruby方法?”;如果;或;除非;基于真值?,ruby,idioms,Ruby,Idioms,如果y如果z为true,我想运行x;如果z为false,我想运行x,除非y 最惯用的方法是什么?我能想到的最好办法是: x if z ? y : !y 试试这个: x if !!y == !!z 这是一个标准的Ruby习惯用法,用于强制转换为布尔值。如果y和z已经是布尔值,那么您可以简单地执行以下操作: x if y == z 这似乎是一种令人困惑的思考方式。对我来说,更清晰的表述(Ruby-ish或其他)是 使用xor运算符,然后对其求反: x unless (!y ^ !z) 根据V

如果y如果z为true,我想运行
x;如果z为false,我想运行
x,除非y

最惯用的方法是什么?我能想到的最好办法是:

x if z ? y : !y
试试这个:

x if !!y == !!z
这是一个标准的Ruby习惯用法,用于强制转换为布尔值。如果
y
z
已经是布尔值,那么您可以简单地执行以下操作:

x if y == z

这似乎是一种令人困惑的思考方式。对我来说,更清晰的表述(Ruby-ish或其他)是


使用xor运算符,然后对其求反:

x unless (!y ^ !z)

根据Victor的建议进行更正,因为不符合
true
false
nil
的内容可能会对
^

产生自己的影响,我认为您提出的方法足够好,并且比其他建议的方法更具可读性。我只是稍微修改一下,使其更具可读性:
x if(z?y:!y)
。作为预防措施(Ruby以使用
true
false
以外的内容而闻名),我会将其重写为
x,除非(!y^!z)
把维克托的话更明确地告诉读者:Ruby允许任何东西作为真值(即除nil或false之外的任何东西都算作true),但这段代码取决于只在TrueClass、FalseClass和NilClass中找到的
^
操作符的实现。如果
y
不是真、假或零,则此操作将不可预测地失败。所以,如果你这样做的话,你需要确保你在和布尔人一起工作。
x unless (!y ^ !z)