【问题标题】:Is there an idiomatic Ruby way to do "if" or "unless" based on a truth value?是否有一种惯用的 Ruby 方法可以根据真值执行“如果”或“除非”?
【发布时间】:2011-08-15 01:00:59
【问题描述】:

如果z 为真,我想运行x if y,如果z 为假,我想运行x unless y

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

x if z ? y : !y

【问题讨论】:

  • 我认为您提出的内容比其他建议的替代方案足够好并且更具可读性。我会稍微修改一下以使其更具可读性:x if (z ? y : !y).

标签: ruby idioms


【解决方案1】:

试试这个:

x if !!y == !!z

这是强制转换为布尔值的标准 Ruby 习惯用法。如果yz 已经是布尔值,那么你可以简单地这样做:

x if y == z

【讨论】:

    【解决方案2】:

    使用异或运算符,然后取反:

    x unless (!y ^ !z)
    

    根据 Victor 的建议进行了更正,因为不是 truefalsenil 的东西可以用 ^ 做自己的事情。

    【讨论】:

    • 作为预防措施(Ruby 以使用 truefalse 以外的东西而闻名)我会将其重写为 x unless(!y ^ !z)
    • 为了让那些阅读者更明确地说 Victor 所说的:Ruby 允许任何东西作为真值工作(即除 nil 或 false 之外的任何东西都算作真),但这段代码取决于^ 运算符仅存在于 TrueClass、FalseClass 和 NilClass 中。如果y 不是真、假或零,这将无法预料地失败。因此,如果您这样做,您需要确保您使用的是布尔值。
    【解决方案3】:

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

    x if (z and y) or (not z and not y)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多