Como você deve saber em Ruby, você pode usar operadores booleanos como: &&, ||, !
adicionalmente, existem: and, or, not
operadores.
À primeira vista, eles são apenas sinônimos um do outro. Mas se olhar mais profundamente, há pequenas diferenças entre eles:
1. Você não pode sobrescrever / sobrecarregar os operadores, &&, ||
mas pode fazer isso com and, or
2. A diferença mais importante é que os &&, ||, !
operadores têm precedências diferentes and, or, not
.
O que isso significa na prática? Alguns exemplos:
#example 1
true || false && false #=> true
#example 2
true or false and false #=> false
Essas expressões simples parecem iguais, mas os resultados são diferentes. A razão disso é a ordem diferente das verificações booleanas. No primeiro exemplo &&
tem maior precedência ||
, então , à primeira vista, é acionada a verificação e o resultado disso é verificado com . No segundo exemplo, os operadores booleanos têm a mesma precedência, então a verificação booleana é feita da esquerda para a direita, o que dá resultados diferentes.false && false
||
Mais um pequeno exemplo:
#example 3
a = true and b = a #=> true
puts a, b #=> true
true
#example 4
x = true && y = x #=> nil
puts x, y #=> nil
nil
Mais uma vez, resultados diferentes por causa de diferentes precedências de operadores – &&
tem maior e and
menor para =
. No exemplo 3, primeiro a atribuição foi feita e após a verificação com and
, no exemplo 4 de forma oposta, a verificação booleana foi feita. Para fazer o exemplo 4 funcionar como exemplo 3, é necessário introduzir parênteses:
(x = true) && (y = x) #=> true
puts x, y #=> true
true