向我展示一个权威的,经过同行评审/维护的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.8和1.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.在少数已知的不兼容性中,没有一个与运营商有关.
我的问题是由触发这在SO讨论,这并没有导致一个答案,将真正说明问题。我在这里以稍微不同的方式“重写”它,因为我想更清楚真正的问题是什么,因此希望在这里得到答案。
考虑以下两个 Ruby 表达式:
1 * a - 31 && a = 3从 Ruby 优先级表中,我们知道这里提到的运算符*的优先级最高,其次是-,然后是&&,最后是=。
表达式没有括号,但是——正如我们可以在irb 中验证的那样,a在第一种情况下提供一个合适的值——它们被评估,就像括号分别写为(1*a) - 3, 一样1 && (a=3)。
第一个很容易理解,因为*绑定比-.
第二个不能这样解释。&&绑定强于=,因此如果仅优先级很重要,则解释应为(1 && a) = 3。
结合性(=右结合和-左结合)也不能解释这种效果,因为只有当我们有几个相同类型的运算符(例如x-y-z或x=y=z)时。
赋值运算符中必须有一些特殊规则,我在我检查过的文档中没有找到,特别是赋值和语法的文档。
有人可以指出,赋值运算符的这种特殊行为记录在哪里吗?或者我在这里错过/误解了什么?