Ruby逻辑运算符

时间:2015-06-25 17:25:57

标签: ruby logical-operators

我不知道这会有什么不同。

a = 24
b = 60
comp1 = a > 42 or b == 60
comp1 # => false
comp2 = (a > 42 or b == 60)
comp2 # => true

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

3 个答案:

答案 0 :(得分:3)

它与运算符优先级有关。 or的优先级低于=,因此

comp1 = a > 42 or b == 60

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

您需要通过括号强制执行优先顺序。或者是一个优秀的红宝石编码器,永远不要* and/or(使用&& / ||代替)

*从不,除非你知道你在做什么。经验法则是:&& / ||用于逻辑运算,和/或 - 用于控制流程。

答案 1 :(得分:3)

这是由于运算符绑定的强度,因为运算符应用于a very particular order

or非常宽松,优先级最低。 ||运算符非常强大,与此相反。请注意该表||=之前是如何出现的,但or之后呢?这有影响。

从你的例子:

comp1 = a > 42 or b == 60

Ruby就是这样解释的:

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

因此,整个语句返回true,但comp1被分配false,因为它不会捕获整个事件。

所以要解决这个问题,只需使用强大的绑定版本:

comp1 = a > 42 || b == 60
# => true

答案 2 :(得分:1)

在Ruby中,赋值(=)的优先级高于写入的or运算符,因此第一行被解释为:

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

这意味着comp1被赋予a > 42的值,这显然是错误的。第二个表达式中的括号解决了这个问题。

通常,在Ruby中,您使用||代替or,同样使用&&代替and