在Ruby中,找到类似的代码是合理的:
a = 1 and b = 2 and c = 3
print "a = #{a}, b = #{b}, c = #{c}\n"
获得结果:
a = 1, b = 2, c = 3
但我无法理解为什么代码如下:
a = 1 && b = 2 && c = 3
print "a = #{a}, b = #{b}, c = #{c}\n"
结果是:
a = 3, b = 3, c = 3
有人可以为我澄清一下吗?
答案 0 :(得分:3)
这是&&
运算符的优先级高于and
:
a = 1 && b = 2 && c = 3
相当于
a = (1 and b = (2 and c = 3))
导致
c
b
a
答案 1 :(得分:0)
除了操作数的优先级之外,这种行为是short-circuit evaluation逻辑运算符的结果。
当评估and
时,如果发现第一个操作数为假,则没有理由评估第二个操作数。因此a and b
的值计算为a ? b : a
。
同样,or
运营商与a ? a : b
签约。
当我们不关心返回的特定值但仅关注它是真还是假时,这些优化在逻辑上可以正常工作。但它也允许有用的编码习语,例如
( list = list || [] ) << item
有效,因为如果list = list || []
为真(非零),list = list
被评估为list
(无操作),或list = []
(创建新的空数组)如果list
已经初始化,那么“true”。
因此2 and (c = 3)
这样的表达式会计算为2 and 3
或2 ? 3 : 2
,所以3
。