Ruby逻辑运算符[重复]

Posted

技术标签:

【中文标题】Ruby逻辑运算符[重复]【英文标题】:Ruby logical operator [duplicate] 【发布时间】:2015-09-12 10:42:01 【问题描述】:

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

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

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

【问题讨论】:

你可能是confusing or with || here. orand 旨在用作控制流运算符。而||&& 是逻辑运算符。 @engineersmnky 鉴于 Ruby 中的每个表达式都有一个评估值,这没有任何区别。 @sawa:语义,伙计。传达信息等等。再说一次,降低优先级有助于使用控制流。 帮助记住 and, or 有时被称为逻辑 composition 运算符。 【参考方案1】:

这是由于运算符绑定的强度,因为运算符应用于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】:

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

comp1 = a > 42 or b == 60

被执行为

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

您需要通过括号强制执行优先级。或者做一个优秀的 ruby​​ 编码器,永远不要使用and/or(改用&&/||

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

【讨论】:

感谢您将* 添加到never 并解释andor 用于控制流而非逻辑操作。【参考方案3】:

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

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

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

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

【讨论】:

以上是关于Ruby逻辑运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

python字符串中的逻辑运算符[重复]

使用双重逻辑非(!!)运算符感到困惑[重复]

逻辑运算符Javascript && [重复]

将逻辑运算符与 If 语句一起使用不会输出预期的结果 [重复]

带和不带括号的熊猫逻辑和运算符产生不同的结果[重复]

带括号的逻辑运算的优先顺序(Java)[重复]