Recuerdo haber leído en algún lugar que not
y !
se evalúan de manera diferente, y no puedo encontrarlo en la documentación. ¿Son sinónimos?
ruby
boolean-logic
0112
fuente
fuente
Respuestas:
Son casi sinónimos, pero no del todo. La diferencia es que
!
tiene una precedencia mayor quenot
, mucho como&&
y||
son de mayor precedencia queand
yor
.!
tiene la precedencia más alta de todos los operadores, ynot
una de las más bajas, puede encontrar la tabla completa en los documentos de Ruby .Como ejemplo, considere:
En el primer ejemplo,
!
tiene la mayor prioridad, por lo que efectivamente está diciendofalse && false
.En el segundo ejemplo,
not
tiene una precedencia menor quetrue && false
, por lo que "cambió" elfalse
detrue && false
atrue
.La pauta general parece ser que debe seguir
!
, a menos que tenga una razón específica para usarlanot
.!
en Ruby se comporta igual que la mayoría de los otros lenguajes, y es "menos sorprendente" quenot
.fuente
unless
en ese caso?unless
simplemente no es realmente favorecido en el mundo del rubí. El consenso general es que se interpone cuando!
funciona igual de bien en la mayoría de las situaciones. Estoy seguro de que hay casos en los que a menos que sea más expresivo, pero me mantengo alejado.unless
esté desfavorecido. Lo más cercano que tenemos a un consenso dice lo contrario.not
puede ser. En Python, a veces asigno valores booleanos a variables para facilitar la lectura de las declaraciones if. Eso podría significar usar el patrónx = not y
, donde y es algo complejo. En Ruby,x = !y
funciona, perox = not y
consiguesyntax error, unexpected tIDENTIFIER, expecting '('
. El orden de prioridad significa esto necesita paréntesis alrededor de la derecha de la op asignación a un trabajo:x = (not y)
.Una forma sencilla de entender al
not
operador es considerarnot true && false
como equivalente a!(true && false)
fuente