我有类似以下的功能:
def check
return 2 == 2 || 3 != 2 || 4 != 5
end
我的问题是,Ruby会执行所有比较,即使第一个是真的,因此函数返回true。我的检查要密集得多,所以我想知道我是否应该以不同的方式解决这个问题,以避免每次都进行所有检查。
irb(main):004:0> 2 == 2 || 3 != 2 || 4 != 5
=> true
谢谢。
答案 0 :(得分:15)
Ruby使用short-circuit evaluation。
这适用于两个||和&&。
||
如果左操作数是真实的,则不评估右操作数。&&
不会评估右操作数。答案 1 :(得分:5)
||
短路。所以是的,如果你把最昂贵的条件放在最后,它会有所帮助。
答案 2 :(得分:2)
||将默认短路评估,这意味着一旦遇到第一个“真实”表达式,它将停止评估(除非您明确声明您希望所有表达式使用'或'运算符进行评估)。
参考:
答案 3 :(得分:0)
只要其中一个条件为真,该函数就会返回。
答案 4 :(得分:0)
你可以用irb自己测试一下,像这样:
irb> p('Hello') || p('World')
我们知道函数p
打印其参数(以inspect
方式)然后返回它们,所以如果||
短路,只打印"Hello"
,否则会打印"Hello"
和"World"
。
您还可以使用&&
代替puts
来测试逻辑p
运算符,因为puts
始终返回nil
。