Existe alguma trás sabedoria “e”, “ou” operadores em Ruby?
-
07-07-2019 - |
Pergunta
Eu me pergunto por ruby ??dar and
, or
menos precedência do que &&
, ||
, e operador de atribuição? Há alguma razão?
Solução
Meu palpite é que é um carry-over direta do Perl. Os operadores or
e and
foram adicionados mais tarde em Perl 5 para situações específicas foram precedência mais baixa foi desejado.
Por exemplo, em Perl, aqui nós desejamos que ||
tiveram menor precedência, de modo que podemos escrever:
try to perform big long hairy complicated action || die ;
e certifique-se de que o ||
não ia devorar parte da ação. Perl 5 or
introduzidos, uma nova versão do ||
que tem baixa precedência, exatamente para este fim.
Um exemplo em Ruby onde você poderia usar or
mas não ||
:
value = possibly_false or raise "foo"
Se você usou ||
, seria um erro de sintaxe.
Outras dicas
A diferença é prioridade. ||
, &&
tem precedência maior do que =
, mas and
, or
têm menor. Então, enquanto você pode fazer:
a = nil || 0
Você teria que fazer:
a = (nil or 0)
para obter mesmo efeito. Se você fizer isso:
a = nil or 0
O resultado da expressão ainda seria 0, mas um valor seria nulo.
Eles têm muito baixa precedência para que os operandos não tem que ser envolto em parênteses, como é o caso com &&
e ||
.
Ser capaz de controlar a precedência de seus operadores às vezes é útil, especialmente se você está preocupado com a legibilidade -. Parêntese extra na instruções condicionais, por vezes, podem obscurecer a lógica real
Para ser franco, porém, eu acho que a razão Ruby tem os níveis de precedência boolean ele faz decorre principalmente do fato de que Matz era um programador Perl antes que ele escreveu Ruby, e emprestado muito da sintaxe núcleo e operadores de que linguagem.
Eu acredito que a idéia é especificamente para obtê-los abaixo dos operadores de atribuição, para que possa escrever testes de lógica com as atribuições, mas sem parênteses.