我不知道这会有什么不同。
a = 24
b = 60
comp1 = a > 42 or b == 60
comp1 # => false
comp2 = (a > 42 or b == 60)
comp2 # => true
有人可以解释一下发生了什么以及为什么返回值不同?
答案 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
。