Ruby 中的“and”、“or”运算符背后有什么智慧吗?
-
07-07-2019 - |
题
我想知道为什么红宝石给 and
, or
优先级低于 &&
, ||
,并赋值运算符?有什么理由吗?
解决方案
我的猜测是这是 Perl 的直接继承。经营者 or
和 and
后来在 Perl 5 中针对需要较低优先级的特定情况添加了这些内容。
例如,在 Perl 中,我们希望 ||
优先级较低,因此我们可以写:
try to perform big long hairy complicated action || die ;
并确保 ||
不会吞噬部分行动。Perl 5 介绍 or
, ,新版本 ||
正是出于这个目的,它的优先级较低。
Ruby 中您可以使用的示例 or
但不是 ||
:
value = possibly_false or raise "foo"
如果你用过 ||
, ,这将是一个语法错误。
其他提示
区别在于优先级。 ||
, &&
优先级高于 =
, , 但 and
, or
有较低的。所以虽然你可以这样做:
a = nil || 0
你必须这样做:
a = (nil or 0)
以获得相同的效果。如果你这样做:
a = nil or 0
表达式的结果仍为 0,但值将为 nil。
它们的优先级非常低,因此操作数不必括在括号中,有时会出现这种情况 &&
和 ||
.
能够控制运算符的优先级有时很有用,特别是当您关心可读性时——条件语句中的额外括号有时会掩盖实际逻辑。
不过,坦率地说,我认为 Ruby 拥有布尔运算符优先级的原因主要源于这样一个事实:Matz 在编写 Ruby 之前是一名 Perl 程序员,并借用了该语言的大部分核心语法和运算符。
我相信这个想法是专门让它们位于赋值运算符下方,这样您就可以使用赋值但不带括号来编写逻辑测试。
不隶属于 StackOverflow