11

我有一个类似于以下的功能:

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

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

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

谢谢你。

4

5 回答 5

16

Ruby 使用短路评估

这适用于 || 和 &&。

  • 如果左操作数为真,||则不计算右操作数。
  • 如果左操作数为假,&&则不计算右操作数。
于 2011-03-11T21:11:48.533 回答
5

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

于 2011-03-11T21:12:10.360 回答
2

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

参考:

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

于 2011-03-11T21:14:18.830 回答
0

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

于 2011-03-11T21:11:30.067 回答
0

你可以在 irb 中自己测试,如下所示:

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

正如我们所知,该函数p(以某种方式)打印其参数inspect然后返回它们,因此如果||短路,则仅"Hello"打印,否则两者"Hello""World"打印。

您还可以像往常一样使用 return 来测试逻辑&&运算符,方法是使用puts而不是。pputsnil

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

于 2015-03-05T09:49:00.103 回答