Respuestas:
Son casi sinónimos, pero no del todo. La diferencia es que !
tiene una precedencia mayor que not
, mucho como &&
y ||
son de mayor precedencia que and
y or
.
!
tiene la precedencia más alta de todos los operadores, y not
una de las más bajas, puede encontrar la tabla completa en los documentos de Ruby .
Como ejemplo, considere:
!true && false
=> false
not true && false
=> true
En el primer ejemplo, !
tiene la mayor prioridad, por lo que efectivamente está diciendo false && false
.
En el segundo ejemplo, not
tiene una precedencia menor que true && false
, por lo que "cambió" el false
de true && false
a true
.
La pauta general parece ser que debe seguir !
, a menos que tenga una razón específica para usarla not
. !
en Ruby se comporta igual que la mayoría de los otros lenguajes, y es "menos sorprendente" que not
.
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ón x = not y
, donde y es algo complejo. En Ruby, x = !y
funciona, pero x = not y
consigue syntax 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)
.