10

我想知道为什么 ruby​​ 给予and,or的优先级低于&&,||和 assign 运算符?有什么理由吗?

4

5 回答 5

15

我的猜测是这是 Perl 的直接继承。运算符orand后来在 Perl 5 中添加,用于特定情况下需要较低的优先级。

例如,在 Perl 中,我们希望它||具有较低的优先级,以便我们可以编写:

try to perform big long hairy complicated action     || die ;

并确保||不会吞噬部分行动。Perl 5 引入or了一个新版本,||它的优先级很低,正是为了这个目的。

Ruby 中可以使用or但不能使用的示例||

value = possibly_false or raise "foo"

如果你使用||,那将是一个语法错误。

于 2009-09-16T20:32:36.313 回答
8

区别在于优先级。||,&&的优先级高于=, 但and,or的优先级较低。所以虽然你可以这样做:

a = nil || 0

你必须这样做:

a = (nil or 0)

以获得相同的效果。如果你这样做:

a = nil or 0

表达式的结果仍为 0,但值将为 nil。

于 2009-09-17T09:56:13.450 回答
5

它们的优先级非常低,因此操作数不必用括号括起来,就像&&and有时那样||

于 2009-09-16T19:00:49.103 回答
4

能够控制运算符的优先级有时很有用,尤其是当您关心可读性时——条件语句中的额外括号有时会掩盖实际逻辑。

不过,坦率地说,我认为 Ruby 之所以具有布尔运算符优先级,主要是因为 Matz 在编写 Ruby 之前是一名 Perl 程序员,并且从该语言中借用了许多核心语法和运算符。

于 2009-09-16T19:00:08.560 回答
2

我相信这个想法是专门让它们低于赋值运算符,所以你可以编写带有赋值但没有括号的逻辑测试。

于 2009-09-16T20:02:28.977 回答