Ruby逻辑运算符

3
我不知道这里有什么区别。
a = 24
b = 60
comp1 = a > 42 or b == 60
comp1 # => false
comp2 = (a > 42 or b == 60)
comp2 # => true

有人可以解释一下发生了什么以及为什么返回值不同吗?

1
你可能在这里混淆了 or||。(https://dev59.com/JXI95IYBdhLWcg3w8iz1) - Michael Berkowski
“or”和“and”被用作控制流运算符,而“||”和“&&”则是逻辑运算符。 - engineersmnky
@engineersmnky 鉴于 Ruby 中的每个表达式都有一个计算值,这并不会产生任何区别。 - sawa
2
@sawa:语义学,兄弟。传达信息什么的。但是,降低优先级有助于使用控制流。 - Sergio Tulentsev
有助于记住 and, or 有时被称为逻辑 组合 运算符。 - Michael Berkowski
显示剩余2条评论
3个回答

4
这是由于运算符的优先级绑定强度,因为运算符按照非常特定的顺序应用。or 运算符非常宽松,它的优先级最低。而 || 运算符非常强,与之相反。请注意在那个表格中 ||= 更早出现,但 or 却比它更晚出现,这有一些影响。

从你的例子可以看出:

comp1 = a > 42 or b == 60

这是 Ruby 的解释:
(comp1 = (a > 42)) or (b == 60)

因此,整个语句返回true,但是comp1被赋值为false,因为它没有捕获整个内容。
因此,为了解决这个问题,只需使用强绑定版本即可:
comp1 = a > 42 || b == 60
# => true

3
这与运算符优先级有关。 or的优先级低于=,因此,
comp1 = a > 42 or b == 60

被执行为

(comp1 = a > 42) or (b == 60)

你需要通过括号来强制优先级。或者成为一名优秀的Ruby编程人员,永远不要使用and/or(应该使用&&/||)。*除非你知道自己在做什么。一个经验法则是:&&/||用于逻辑操作,而and/or用于控制流。

感谢您将 * 添加到 never 中,并解释了 andor 是用于控制流而不是逻辑操作。 - engineersmnky

1
在Ruby中,赋值(=)比写作的or运算符具有更高的优先级,因此第一行被解释为:
(comp1 = a > 42) or (b == 60)

这意味着comp1被赋值为a > 42,显然是错误的。第二个表达式中的括号解决了这个问题。
一般来说,在Ruby中,你使用||代替or,同样地,使用&&代替and

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接