Ruby运算符优先级表

给我一个明确的,同行评审/维护的Ruby优先级表( 运算符非运算符修饰符 )。

多年来,我不得不依靠以下来源获取这些信息:

1. http://phrogz.net/programmingruby/language.html#table_18.4 – Pickaxe书,它logging了2000年9月发布的Ruby 1.6 ,包括格式错误或错字( {被列为作业运营商)。

2. http://www.techotopia.com/index.php/Ruby_Operator_Precedence-上面的Pickaxe表的近似副本,包括错误的{ ,并且意外地描述|| 作为逻辑“AND”

3. http://www.tutorialspoint.com/ruby/ruby_operators.htm – 也是Pickaxe表的一个近似副本,虽然它修复了对||的描述。 逻辑“或” ,但它仍然列出{作为一个赋值运算符。 而且,它列出::并将其错误地描述为一个常量parsing运算符:: 不是运算符)。

4. http://my.safaribooksonline.com/book/web-development/ruby/9780596516178/expressions-and-operators/operators – Ruby编程语言手册,它logging了Ruby 1.81.9 ,它们于2003年8月发布, 2007年12月,分别。 这本书于2008年由David Flanagan和Yukihiro Matsumoto(Ruby的发明者,“Matz”)发表。 它似乎是运营商,非运营商,修改者和支持信息的最新和准确的清单。 顺便说一句,大约在2005年,对Ruby的兴趣与Rails(2004年7月发布)一起激增。

5. http://romhack.wikia.com/wiki/Ruby_operators – 还在Ruby 1.9文档,并在其表中包含非运算符和修饰符。

Ruby 2.0于2013年2月发布,旨在完全向后兼容Ruby 1.9.3 。 less数已知的不兼容性,与运营商无关。

Ruby 2.1.0于2013年圣诞节当天发布 ,同样没有列出运营商的不兼容性。

因此,我决定在Flanagan / Matz的书籍的基础上join一个答案,并将其作为一个社区维基

Ruby 2.1.0,2.0,1.9,1.8

运算符是一个表示要在一个或多个操作数上执行的操作(如添加或比较)的标记。 操作数是expression式,操作符允许我们将这些操作数expression式组合成更大的expression式。 ( Ref )

N = arity =操作员操作的操作数。 ( Ref )

A = 关联性 =当一个expression式中相同的运算符(或具有相同优先级的运算符)顺序出现时的评估顺序。 值L意味着expression式从左到右进行评估。 值R表示从右向左计算expression式。 而N值表示运算符是非关联的 ,不能在没有括号的expression式中多次使用来指定评估顺序。 ( Ref )

M = definability = Ruby将一些操作符作为方法实现,允许类为这些操作符定义新的含义。 列M指定哪些运算符是方法。 标有Y操作符是用方法实现的,可以重新定义,标有N操作符不可以。 ( Ref )

下表按照优先级降序( 最高优先级 )sorting。

 NAM Operator(s) Description - - - ----------- ----------- 1 RY ! ~ + boolean NOT, bitwise complement, unary plus (unary plus may be redefined from Ruby 1.9 with +@) 2 RY ** exponentiation 1 RY - unary minus (redefine with -@) 2 LY * / % multiplication, division, modulo (remainder) 2 LY + - addition (or concatenation), subtraction 2 LY << >> bitwise shift-left (or append), bitwise shift-right 2 LY & bitwise AND 2 LY | ^ bitwise OR, bitwise XOR (exclusive OR) 2 LY < <= >= > ordering 2 NY == === != =~ !~ <=> equality, pattern matching, comparison (!= and !~ may not be redefined prior to Ruby 1.9) 2 LN && boolean AND 2 LN || boolean OR 2 NN .. ... range creation (inclusive and exclusive) and boolean flip-flops 3 RN ? : ternary if-then-else (conditional) 2 LN rescue exception-handling modifier 2 RN = assignment 2 RN **= *= /= %= += -= assignment 2 RN <<= >>= assignment 2 RN &&= &= ||= |= ^= assignment 1 NN defined? test variable definition and type 1 RN not boolean NOT (low precedence) 2 LN and or boolean AND, boolean OR (low precedence) 2 NN if unless while until conditional and loop modifiers