Ruby运算符优先级表

use*_*833 45 ruby

向我展示一个权威的,经过同行评审/维护的Ruby优先级表(运算符,非运算符修饰符).

多年来,我不得不依赖以下来源获取此信息:

1. http://phrogz.net/programmingruby/language.html#table_18.4 - 文档Ruby 的Pickaxe书,1.6于2000年9月发布,包含格式错误或拼写错误({列为赋值运算符) .

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

3. http://www.tutorialspoint.com/ruby/ruby_operators.htm - 也是Pickaxe表的近似副本,虽然它修复了||Logical'OR'的描述,但它仍然{列为赋值运算符.同样,它列出::并错误地描述为一个恒定的分辨率操作者(::不是操作者).

4. http://my.safaribooksonline.com/book/web-development/ruby/9780596516178/expressions-and-operators/operators - Ruby编程语言的书,其中记录的Ruby 1.81.9,这是在2003年发布2007年8月和十二月, 分别.本书由David Flanagan和Yukihiro Matsumoto(又名"Matz",Ruby的发明者)于2008年出版.它似乎是最新,最准确的运营商,非运营商,修改器和支持信息列表.顺便说一句,在2005年左右,对Ruby的兴趣与2004年7月发布的Rails同步增长.

5. http://romhack.wikia.com/wiki/Ruby_operators - 还记录Ruby中1.9的运算符,并在其表中包含非运算符和修饰符.

Ruby 2.0于2013年2月发布,旨在与Ruby完全向后兼容1.9.3.在少数已知的不兼容性中,没有一个与运营商有关.

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

因此,我决定根据Flanagan/Matz的书提供一个答案,并将其作为社区维基.

use*_*833 62

Ruby 2.1.0,2.0,1.9,1.8

操作者是一个表示操作(如加法或比较)要在一个或多个操作数执行的令牌.操作数是表达式,运算符允许我们将这些操作数表达式组合成更大的表达式.(参考)

N = arity =操作员操作的操作数的数量.(参考)

A = associativity =当同一个运算符(或具有相同优先级的运算符)在表达式中按顺序出现时的求值顺序.该值L表示从左到右计算表达式.该值R表示从右到左计算表达式.并且该值N意味着运算符是非关联的,并且在没有括号的表达式中不能多次使用以指定评估顺序.(参考)

M = definability = Ruby实现了许多运算符作为方法,允许类为这些运算符定义新的含义.列M指定哪些运算符是方法.标有a的运算符Y使用方法实现,可以重新定义,标记为a的运算符N可以不重新定义.(参考)

下表按降序优先级排序(顶部的最高优先级).

N A M  Operator(s)            Description
- - -  -----------            -----------
1 R Y  ! ~ +                  boolean NOT, bitwise complement, unary plus
                              (unary plus may be redefined from Ruby 1.9 with +@)

2 R Y  **                     exponentiation
1 R Y  -                      unary minus (redefine with -@)

2 L Y  * / %                  multiplication, division, modulo (remainder)
2 L Y  + -                    addition (or concatenation), subtraction

2 L Y  << >>                  bitwise shift-left (or append), bitwise shift-right
2 L Y  &                      bitwise AND

2 L Y  | ^                    bitwise OR, bitwise XOR (exclusive OR)
2 L Y  < <= >= >              ordering

2 N Y  == === != =~ !~ <=>    equality, pattern matching, comparison
                              (!= and !~ may not be redefined prior to Ruby 1.9)

2 L N  &&                     boolean AND
2 L N  ||                     boolean OR

2 N N  .. ...                 range creation (inclusive and exclusive)
                              and boolean flip-flops

3 R N  ? :                    ternary if-then-else (conditional)
2 L N  rescue                 exception-handling modifier

2 R N  =                      assignment
2 R N  **= *= /= %= += -=     assignment
2 R N  <<= >>=                assignment
2 R N  &&= &= ||= |= ^=       assignment

1 N N  defined?               test variable definition and type
1 R N  not                    boolean NOT (low precedence)
2 L N  and or                 boolean AND, boolean OR (low precedence)
2 N N  if unless while until  conditional and loop modifiers
Run Code Online (Sandbox Code Playgroud)

  • 我也想知道方法调用,`.`. (6认同)
  • 表中似乎缺少to_proc-operator(一元'&')运算符. (2认同)
  • 用括号调用方法怎么样,没有方法调用呢?怎么样`{}`块?怎么样`结束'块? (2认同)