【问题标题】:Is there a way to force non-lazy evaluation of && and || in Ruby?有没有办法强制对 && 和 || 进行非懒惰评估在红宝石?
【发布时间】:2022-01-27 10:05:49
【问题描述】:

今天晚上我正在玩 FizzBu​​zz 编程练习,尝试不同的方法来编写解决方案。

我写的一行是:

nf = !((ff = i % 3 == 0) || (bf = i % 5 == 0))

nf 是“无标志”

ff 是“嘶嘶旗”

bf 是“嗡嗡声标志”

现在我知道这是一种可怕的风格——我对原始问题有更好的解决方案——但是这个也不起作用,因为 Ruby 对 || 的懒惰评估表达式意味着如果 i 是 3 的倍数,则 ff 设置为 true,bf 保留为 nil(尽管定义它是因为它发生在评估之前)。

我一直在寻找但没有成功的方法是让 Ruby 评估 || 的双方。 (或其他运算符),以便所有三个标志都获得正确的值。

有没有办法在 Ruby 中做到这一点?

【问题讨论】:

    标签: ruby fizzbuzz


    【解决方案1】:

    也许您正在寻找 |& 运算符,它们不会短路。

    例如:

    irb(main):007:0> true | (puts "hello")
    hello
    => true
    irb(main):008:0>
    

    TrueClass 的文档hereFalseClass 存在相同的方法。

    【讨论】:

    • 谢谢。我没想过在布尔值上使用按位运算符。
    • 在这种情况下不要将其视为按位运算符。它只是 一个 运算符。这意味着它只是一种可以作为一个类认为有用的方法来实现。考虑一下:true.send(:"|", false)
    • 再次感谢。或许我应该说,“我把它当作位运算符是错误的”。
    • 这里的重要方面是| 只是一个与任何其他方法一样的方法,这意味着 就像任何其他方法一样,它急切地评估其参数.
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2019-05-13
    • 2014-10-10
    • 1970-01-01
    • 2021-12-25
    • 2018-08-11
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多