Ruby 是一种表达能力很强的语言,这得意于它异常丰富的运算符和语法糖,虽然 Ruby 一直把最小惊讶原则作为它的哲学之一,但还是常常看到让人惊讶不已,难于理解的代码,这可能是因为对它运算符和语句优先级理解不透导致,今天就和大家聊一聊 Ruby 运算符和语句的优先级。
先看一句简单的代码,猜一猜它的输出是什么。
1
|
|
很多人一定以为结果是 Hash,但实事上结果是空,不信可以在 irb 里试一试。
再看一段代码。
1 2 3 4 5 6 |
|
结果是:
1 2 3 4 |
|
有没有觉得奇怪 b 怎么是 5 而不是 3 呢。
如果这两个例子你也觉得奇怪,那说明你对 Ruby 一些运算符和语句的优先级理解还不透彻,判断有误。
puts {}.class
实际上相当于 (puts {}).class
-> nil.class
所以输出为空。{}
相当于一个空的 block,优先和方法 puts 结合。
&& 和 and
的优先是不同的,而且和 =
号的优先级顺序比较, && > = > and
,所以 a = 5 && 3
相当于 a = ( 5 && 3)
,而 b = 5 and 3
相当于 ( b = 5 ) and 3
,所以结果 a 和 b的值是不同的。
下面一张表格是 Ruby 中常见的运算符和语句的优先级列表,从上到下优先级递减。
Method | Operator | Description |
---|---|---|
Yes | [ ] [ ]= |
Element reference, element set |
Yes | ** |
Exponentiation (raise to the power) |
Yes | ! ~ + - |
Not, complement, unary plus and minus (method names for the last two are +@ and -@ ) |
Yes | * / % |
Multiply, divide, and modulo |
Yes | + - |
Addition and subtraction |
Yes | >> << |
Right and left bitwise shift |
Yes | & |
Bitwise `AND’ |
Yes | ^ | |
Bitwise exclusive `OR’ and regular `OR’ |
Yes | <= < > >= |
Comparison operators |
Yes | <=> == === != =~ !~ |
Equality and pattern match operators (!= and !~ may not be defined as methods) |
&& |
Logical `AND’ | |
|| |
Logical `AND’ | |
.. ... |
Range (inclusive and exclusive) | |
? : |
Ternary if-then-else | |
= %= { /= -= += |= &= >>= <<= *= &&= ||= **= |
Assignment | |
defined? |
Check if specified symbol defined | |
not |
Logical negation | |
or and |
Logical composition | |
if unless while until |
Expression modifiers | |
begin/end |
Block expression |
几条便于记忆的原则:
- 关键字类如if and 等的优先级是要比符号类低;
- 赋值符号
= ||=
等优先级也比较低,仅次于关键字类; [] []=
元素引用的优先级非常高。