1

在 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

谁能为我澄清一下?

4

2 回答 2

3

这是关于&&运算符的更高优先级 then 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
于 2013-09-02T22:43:25.927 回答
0

除了操作数的优先级之外,这种行为是逻辑运算符短路评估的结果。

评估时and,如果发现第一个操作数为假,则没有理由评估第二个操作数。因此, 的值a and b计算为a ? b : a

同样,or运营商与a ? a : b.

当我们不关心返回的特定值而只关心它是真还是假时,这些优化在逻辑上工作得很好。但它也允许使用有用的编码习惯,例如

( list = list || [] ) << item

之所以有效,是因为如果为真(非零)或(创建一个新的空数组)如果已经被初始化,list = list || []则被评估为list = list(无操作) , “真”也是如此。listlist = []list

因此,表达式 like 的2 and (c = 3)计算结果为2 and 3or 2 ? 3 : 2,所以3

于 2013-09-02T23:26:15.670 回答