无法理解ruby逻辑运算符的结果

时间:2013-09-02 22:39:17

标签: ruby logic operator-keyword

在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

有人可以为我澄清一下吗?

2 个答案:

答案 0 :(得分:3)

这是&&运算符的优先级高于and

a = 1 && b = 2 && c = 3

相当于

a = (1 and b = (2 and c = 3))

导致

  1. 3被分配到c
  2. (2和3)导致3被分配给b
  3. (1和3)导致3最终被分配给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 32 ? 3 : 2,所以3