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.

Table 18.4 : Ruby operators (high to low precedence)
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?

1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas
Loading ... Loading ...

Posts relacionados