Diferencia entre "not" y "!" En ruby

Respuestas:

143

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 andy or.

!tiene la precedencia más alta de todos los operadores, y notuna 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, nottiene una precedencia menor que true && false, por lo que "cambió" el falsede true && falsea 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.

Brennan
fuente
6
He utilizado "no" en el pasado para facilitar la lectura de los condicionales negados. Lo que significa que si se debe negar la totalidad del condicional, me sentí cómodo usando 'no' en lugar de '!'. Me gusta cuando mi código se lee como inglush
jaydel
@jaydel ¿Podrías usar unlessen ese caso?
Jacob
1
@Jacob, sí, definitivamente. unlesssimplemente 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.
Brennan
4
No estoy de acuerdo con que unlessesté desfavorecido. Lo más cercano que tenemos a un consenso dice lo contrario.
Adam Lassek
1
Solo quería compartir un ejemplo de lo sorprendente que notpuede 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 = !yfunciona, pero x = not yconsigue 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).
S. Kirby
13

Una forma sencilla de entender al notoperador es considerar not true && falsecomo equivalente a!(true && false)

roniegh
fuente