Ruby 逻辑运算符

Ruby logical operator

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

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

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

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

comp1 = a > 42 or b == 60

执行为

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

您需要使用括号强制执行优先顺序。或者成为一名优秀的 ruby 编码员并且从不*使用 and/or(改为使用 &&/||

* 永远不会,除非你知道自己在做什么。一个经验法则是:&&/||对于逻辑操作,and/or - 对于控制流。

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

or 很松散,优先级最低。 || 运算符非常强大,与之相反。请注意,table || 是如何出现在 = 之前,而 or 出现在之后?这有影响。

根据你的例子:

comp1 = a > 42 or b == 60

Ruby 对此的解释如下:

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

因此,整个语句 returns truecomp1 被分配 false 因为它没有捕获全部内容。

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

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

在Ruby中,赋值(=),比写的or运算符有更高的优先级,所以第一行解释为:

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

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

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