无法理解 ruby 逻辑运算符的结果 [重复]
Posted
技术标签:
【中文标题】无法理解 ruby 逻辑运算符的结果 [重复]【英文标题】:cannot understand the result of ruby logic operator [duplicate] 【发布时间】:2013-09-06 01:28:14 【问题描述】:在 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
谁能帮我澄清一下?
【问题讨论】:
这两段代码只是给我一个SyntaxError
。我没有得到你看到的结果。
感谢 Andrew 编辑,看起来更好
【参考方案1】:
&&
运算符的优先级高于 and
:
a = 1 && b = 2 && c = 3
等价于
a = (1 and b = (2 and c = 3))
导致
-
3 分配给
c
(2 和 3)导致 3 分配给 b
(1 和 3)导致 3 最终分配给 a
【讨论】:
这真的很有帮助,谢谢大卫! 你不解释为什么2 && 3 == 3
@Borodin 逻辑 and
仅当左操作数被评估为 true
时才评估其右参数,这对除 nil
或 false
之外的任何对象都有效。右操作数是表达式的结果。但我认为在回答 OP 的问题时不需要提及它。
@Borodin 您在我的答案中插入最内层的括号是非常多余的。
@DavidUnric:很公平,这是你的答案。但是我们在这里讨论的是运算符优先级,我看不出2 and c = 3
不等于(2 and c) = 3
的原因。【参考方案2】:
除了操作数的优先级之外,这种行为是逻辑运算符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
。
【讨论】:
以上是关于无法理解 ruby 逻辑运算符的结果 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
将逻辑运算符与 If 语句一起使用不会输出预期的结果 [重复]