【问题标题】:|| Operator, return when result is known?||运算符,结果已知时返回?
【发布时间】:2011-03-11 21:10:10
【问题描述】:

我有一个类似下面的函数:

def check
  return 2 == 2 || 3 != 2 || 4 != 5
end

我的问题是,即使第一个比较为真,Ruby 是否会执行所有比较,因此函数返回真。我的检查要密集得多,所以我想知道是否应该以不同的方式将其分解,以避免每次都进行所有检查。

irb(main):004:0> 2 == 2 || 3 != 2 || 4 != 5
=> true

谢谢。

【问题讨论】:

  • 顺便说一句:您的方法中不需要return

标签: ruby short-circuiting


【解决方案1】:

Ruby 使用short-circuit evaluation

这适用于 ||和 &&。

  • 使用||,如果左操作数为真,则不计算右操作数。
  • 使用&&,如果左操作数为假,则不计算右操作数。

【讨论】:

    【解决方案2】:

    || 一旦第一个条件为真,就会短路。所以是的,如果你把最昂贵的条件放在最后会有所帮助。

    【讨论】:

      【解决方案3】:

      ||默认情况下会短路评估,这意味着一旦遇到第一个“真”表达式,它将停止评估(除非您明确声明您希望所有表达式都使用“或”运算符进行评估)。

      参考:

      http://en.wikipedia.org/wiki/Short-circuit_evaluation

      【讨论】:

        【解决方案4】:

        只要其中一个条件为真,函数就会返回。

        【讨论】:

          【解决方案5】:

          你可以自己在irb中测试一下,像这样:

          irb> p('Hello') || p('World')
          

          我们知道函数p 打印它的参数(以inspect 的方式)然后返回它们,所以如果|| 短路,只打印"Hello",否则"Hello" 和@987654327 @ 被打印出来。

          您还可以使用puts 代替p 来测试逻辑&& 运算符,因为puts 总是返回nil

          顺便说一句,irb 是玩 ruby​​ 的理想场所。除了一小部分并发之外,您可以在那里测试所有内容。

          【讨论】:

            猜你喜欢
            • 2021-05-12
            • 2020-05-12
            • 1970-01-01
            • 1970-01-01
            • 2014-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-14
            相关资源
            最近更新 更多