在 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
谁能为我澄清一下?
在 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
谁能为我澄清一下?
这是关于&&
运算符的更高优先级 then and
:
a = 1 && b = 2 && c = 3
相当于
a = (1 and b = (2 and c = 3))
这导致
c
b
a
除了操作数的优先级之外,这种行为是逻辑运算符短路评估的结果。
评估时and
,如果发现第一个操作数为假,则没有理由评估第二个操作数。因此, 的值a and b
计算为a ? b : a
。
同样,or
运营商与a ? a : b
.
当我们不关心返回的特定值而只关心它是真还是假时,这些优化在逻辑上工作得很好。但它也允许使用有用的编码习惯,例如
( list = list || [] ) << item
之所以有效,是因为如果为真(非零)或(创建一个新的空数组)如果已经被初始化,list = list || []
则被评估为list = list
(无操作) , “真”也是如此。list
list = []
list
因此,表达式 like 的2 and (c = 3)
计算结果为2 and 3
or 2 ? 3 : 2
,所以3
。