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
有人可以解释发生了什么以及为什么返回值不同吗?
【问题讨论】:
你可能是confusingor
with ||
here.
or
和 and
旨在用作控制流运算符。而||
和&&
是逻辑运算符。
@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 并解释and
和or
用于控制流而非逻辑操作。【参考方案3】:
在 Ruby 中,赋值 (=
) 的优先级高于写入的 or
运算符,因此第一行解释为:
(comp1 = a > 42) or (b == 60)
这意味着comp1
被分配了a > 42
的值,这显然是错误的。第二个表达式中的括号解决了这个问题。
通常,在 Ruby 中,您使用||
代替or
,同样地,&&
代替and
。
【讨论】:
以上是关于Ruby逻辑运算符[重复]的主要内容,如果未能解决你的问题,请参考以下文章