Risposte:
Sono quasi sinonimi, ma non del tutto. La differenza è che !
ha una precedenza maggiore di not
, molto simile &&
e ha ||
precedenza maggiore di and
e or
.
!
ha la precedenza più alta di tutti gli operatori e not
uno dei più bassi, puoi trovare la tabella completa nella documentazione di Ruby .
Ad esempio, considera:
!true && false
=> false
not true && false
=> true
Nel primo esempio, !
ha la precedenza più alta , quindi stai effettivamente dicendo false && false
.
Nel secondo esempio, not
ha una precedenza inferiore a true && false
, quindi questo "ha cambiato" il false
da true && false
a true
.
La linea guida generale sembra essere quella che dovresti seguire !
, a meno che tu non abbia un motivo specifico per usarlo not
. !
in Ruby si comporta come la maggior parte degli altri linguaggi, ed è "meno sorprendente" di not
.
unless
in questo caso?
unless
non è proprio favorito nel mondo del rubino. Il consenso generale è che si intromette quando !
funziona altrettanto bene nella maggior parte delle situazioni. Sono sicuro che ci sono casi in cui a meno che non possa essere più espressivo, ma mi tengo alla larga.
unless
sia disapprovato . La cosa più vicina a un consenso dice il contrario.
not
possa essere sorprendente . In Python, a volte assegno booleani alle variabili per rendere le istruzioni if più facili da leggere. Ciò potrebbe significare usare il modello x = not y
, dove y è qualcosa di complesso. In Ruby, x = !y
funziona, ma x = not y
ottiene syntax error, unexpected tIDENTIFIER, expecting '('
. L'ordine di precedenza significa che questo ha bisogno di parentesi attorno alla destra del op assegnazione al lavoro: x = (not y)
.