Precedência dos operadores em Ruby
O Ruby é, sem dúvida, uma linguagem interessante. Tenho observado algumas peculiaridades que não me lembro de ter visto em outras linguagens. Uma dessas peculiaridades é a precedência de operadores, mais especificamente em relação aos operadores lógicos.
O Ruby dispõe duas formas de se fazer uma comparação lógica. Por exemplo, você pode usar && ou and, || ou or e ! ou not. No fundo, as operações são iguais, mas a diferença está na precedência desses operadores. Os operadores &&, || e ! têm maior precedência sobre os operadores and, ou e not. Dessa forma, o bloco a seguir não funcionaria se colocássemos && no lugar de and. Se fizéssemos isso, o Ruby primeiro faria a comparação entre f(x) e b para depois atribuir o resultado a a e não o contrário, como era esperado.
if a = f(x) and b = f(y) and c = f(z) then puts "Resultado" end
O exemplo a seguir também é interessante:
x = false or true puts x
Ao contrário de outras linguagens, o resultado de puts x não será true, será false. Isso acontece porque o operador = tem maior precedência sobre o operador or, portanto primeiro o Ruby faz a atribuição x = false para depois fazer a comparação com true. Considerando isto, para fazer que essa linha de código tenha o mesmo comportamento que outras linguagens temos que usar o operador || (que tem maior precedência sobre =) ou então usar parênteses, assim: x = (false or true).
A tabela a seguir (retirada da documentação oficial do Ruby) mostra os operadores disponíveis, em ordem de precedência do maior para o menor.
| Method | Operator | Description |
|---|---|---|
| Y | [ ] [ ]= |
Element reference, element set |
| Y | ** |
Exponentiation |
| Y | ! ~ + - |
Not, complement, unary plus and minus (method names for the last two are +@ and -@) |
| Y | * / % |
Multiply, divide, and modulo |
| Y | + - |
Plus and minus |
| Y | >> << |
Right and left shift |
| Y | & |
Bitwise `and’ |
| Y | ^ | |
Bitwise exclusive `or’ and regular `or’ |
| Y | <= < > >= |
Comparison operators |
| Y | <=> == === != =~ !~ |
Equality and pattern match operators (!= and !~ may not be defined as methods) |
&& |
Logical `and’ | |
|| |
Logical `or’ | |
.. ... |
Range (inclusive and exclusive) | |
? : |
Ternary if-then-else | |
= %= { /= -= += |= &= >>= <<= *= &&= ||= **= |
Assignment | |
defined? |
Check if symbol defined | |
not |
Logical negation | |
or and |
Logical composition | |
if unless while until |
Expression modifiers | |
begin/end |
Block expression |
Poderia avaliar este artigo, por favor? |

