Ruby运算符优先级表

时间:2014-01-11 08:30:07

标签: ruby

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

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

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

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

3. http://www.tutorialspoint.com/ruby/ruby_operators.htm - 也是 Pickaxe 表的近似副本,但它将||的说明修复为逻辑'或',但它仍然将{列为赋值运算符。同样,它列出::并错误地将其描述为常量分辨率运算符:: 运算符)。

4. http://my.safaribooksonline.com/book/web-development/ruby/9780596516178/expressions-and-operators/operators - Ruby编程语言一书,记录了Ruby 1.81.9分别于2003年8月和2007年12月。本书由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 was released in February 2013, and was intended to be fully backward compatible with Ruby 1.9.3。在少数已知的不兼容性中,没有一个与运营商有关。

Ruby 2.1.0 was released on Christmas Day in 2013,类似地,未列出任何运算符不兼容性。

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

2 个答案:

答案 0 :(得分:57)

Ruby 2.1.0,2.0,1.9,1.8

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

N = arity =运营​​商运营的操作数数量。 (Ref

A = 关联性 =同一运算符(或具有相同优先级的运算符)在表达式中按顺序出现时的求值顺序。值L表示从从左到右评估表达式。值R表示从从右到左计算表达式。值N表示运算符 nonassociative ,并且在没有括号的表达式中不能多次使用以指定评估顺序。 (Ref

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

下表按优先级递减排序(顶部的最高优先级)。

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

答案 1 :(得分:0)

RE Ruby Operators Precedence

有用的列表也可以在本页底部找到:

https://www.tutorialspoint.com/ruby/ruby_operators.htm

RE:使用{}

局部变量以小写字母或_开头。局部变量的范围从类,模块,def或do到相应的末端,或者从块的左大括号到其大括号{}。

当引用未初始化的局部变量时,它被解释为对没有参数的方法的调用。

对未初始化的局部变量的赋值也可用作变量声明。变量开始存在,直到达到当前范围的末尾。当Ruby解析程序时,确定局部变量的生命周期。

在上面的例子中,局部变量是id,name和addr。

另请注意:您可以使用序列#{expr}将任何Ruby表达式的值替换为字符串。这里,expr可以是任何ruby表达式。

来源:https://www.tutorialspoint.com/ruby/ruby_variables.htm