Lembro-me de ter lido em algum lugar que not
e !
são avaliados de forma diferente, e não consigo encontrar na documentação. Eles são sinônimos?
ruby
boolean-logic
0112
fonte
fonte
Respostas:
Eles são quase sinônimos, mas não exatamente. A diferença é que
!
tem uma precedência mais alta quenot
, muito parecido com&&
e||
são de uma precedência mais alta queand
eor
.!
tem a precedência mais alta de todos os operadores, enot
uma das mais baixas, você pode encontrar a tabela completa nos documentos Ruby .Como exemplo, considere:
No primeiro exemplo,
!
tem a precedência mais alta , então você está efetivamente dizendofalse && false
.No segundo exemplo,
not
tem uma precedência menor do quetrue && false
, então isso "mudou"false
detrue && false
paratrue
.A orientação geral parece ser que você deve seguir
!
, a menos que tenha um motivo específico para usarnot
.!
em Ruby se comporta da mesma forma que a maioria das outras linguagens, e é "menos surpreendente" do quenot
.fonte
unless
nesse caso?unless
simplesmente não é muito popular no mundo do rubi. O consenso geral é que isso só atrapalha quando!
funciona tão bem na maioria das situações. Tenho certeza de que há casos em que a menos pode ser mais expressiva, mas evito.unless
é desfavorecido. A coisa mais próxima que temos de um consenso diz o contrário.not
pode ser surpreendente . Em Python, às vezes atribuo booleanos a variáveis para tornar as instruções if mais fáceis de ler. Isso pode significar usar o padrãox = not y
, onde y é algo complexo. Em Ruby,x = !y
funciona, masx = not y
conseguesyntax error, unexpected tIDENTIFIER, expecting '('
. A ordem de precedência significa que este precisa de parênteses em torno do direito da op atribuição ao trabalho:x = (not y)
.Uma maneira fácil de entender o
not
operador é olhandonot true && false
como equivalente a!(true && false)
fonte