Подтвердить что ты не робот

Таблица приоритетов оператора Ruby

Покажите мне окончательную, пересмотренную/поддерживаемую таблицу приоритетов Ruby (операторов, неоператоров и модификаторов).

На протяжении многих лет мне приходилось полагаться на следующие источники для этой информации:

1. http://phrogz.net/programmingruby/language.html#table_18.4 - Книга Pickaxe, в которой содержится документ Ruby 1.6, который был выпущен в Сентябрь 2000 года и включает в себя ошибку форматирования или опечатку ({ указан как оператор присваивания).

2. http://www.techotopia.com/index.php/Ruby_Operator_Precedence - ближайшая копия вышеупомянутой таблицы Pickaxe, включая ошибочный {, и случайно описывает || как логический "AND".

3. http://www.tutorialspoint.com/ruby/ruby_operators.htm - также ближайшая копия таблицы Pickaxe, хотя она исправляет описание || в логический 'OR', но он все еще отображает { как оператор присваивания. Кроме того, он перечисляет :: и неправильно описывает его как оператор с постоянным разрешением (:: не является оператором).

4. http://my.safaribooksonline.com/book/web-development/ruby/9780596516178/expressions-and-operators/operators - Книга языка программирования Ruby, в которой указаны Ruby 1.8 и 1.9, которые были выпущены в августе 2003 года и декабре 2007 года, соответственно. Эта книга была опубликована в 2008 году Дэвидом Фланаганом и Юкихиро Мацумото (он же "Мац", изобретателем Ruby). Кажется, это самый современный и точный список операторов, не-операторов, модификаторов и вспомогательной информации. Кстати, около 2005 года интерес к Ruby вырос в тандеме с Rails, который был выпущен в июле 2004 года.

5. http://romhack.wikia.com/wiki/Ruby_operators - также операторы документов в Ruby 1.9 и включают в себя не-операторы и модификаторы в своей таблице.

Ruby 2.0 был выпущен в феврале 2013 года и был полностью совместим с Ruby 1.9.3. Из немногих известных несовместимостей ни одна из них не связана с операторами.

Ruby 2.1.0 был выпущен в Рождество в 2013, и аналогичным образом не указаны никакие операционные несовместимости.

Таким образом, я решил включить ответ, основанный на книге Фланагана/Маца, и сделал его вики-сообществом.

4b9b3361

Ответ 1

Ruby 2.1.0, 2.0, 1.9, 1.8

Оператор - это токен, который представляет операцию (например, добавление или сравнение) для одного или нескольких операндов. Операнды - это выражения, и операторы позволяют нам объединить эти выражения операнда в более крупные выражения. (Ссылка)

N= arity= количество операндов, на которых работает оператор. (Ссылка)

A= ассоциативность= порядок оценки, когда один и тот же оператор (или операторы с одинаковым приоритетом) последовательно появляются в выражении. Значение L означает, что выражения оцениваются слева направо. Значение R означает, что выражения оцениваются справа налево. И значение N означает, что оператор неассоциативен и не может использоваться несколько раз в выражении без круглых скобок, чтобы указать порядок оценки. (Ссылка)

M= определимость= Ruby реализует ряд своих операторов как методы, позволяя классам определять новые значения для этих операторов. Столбец M указывает, какие операторы являются методами. Операторы, отмеченные Y, реализуются с помощью методов и могут быть переопределены, а операторы, помеченные знаком 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 [email protected])

2 R Y  **                     exponentiation
1 R Y  -                      unary minus (redefine with [email protected])

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