Risposte:
Sono quasi sinonimi, ma non del tutto. La differenza è che !ha una precedenza maggiore di not, molto simile &&e ha ||precedenza maggiore di ande or.
!ha la precedenza più alta di tutti gli operatori e notuno 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, notha una precedenza inferiore a true && false, quindi questo "ha cambiato" il falseda true && falsea 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.
unlessin questo caso?
unlessnon è 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.
unlesssia disapprovato . La cosa più vicina a un consenso dice il contrario.
notpossa 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 = !yfunziona, ma x = not yottiene 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).