向我展示一个权威的,经过同行评审/维护的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.8
和1.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一书提供答案,并将其作为社区维基。
答案 0 :(得分:57)
运算符是表示要对一个或多个操作数执行的操作(例如添加或比较)的标记。操作数是表达式,运算符允许我们将这些操作数表达式组合成更大的表达式。 (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表达式。