Differenza tra "not" e "!" In ruby


Risposte:


143

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.


6
Ho usato "non" in passato per rendere più facili da leggere i condizionali negati. Significa che se la totalità del condizionale dovesse essere negata, mi sentivo a mio agio nell'usare "non" invece di "!". Mi piace quando il mio codice si legge come inglush
jaydel

@jaydel Potresti usare unlessin questo caso?
Jacob

1
@Jacob, sì, decisamente. 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.
Brennan

4
Non sono d'accordo che unlesssia disapprovato . La cosa più vicina a un consenso dice il contrario.
Adam Lassek

1
Volevo solo condividere un esempio di quanto 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).
S. Kirby

13

Un modo semplice per capire l' notoperatore è considerare not true && falsecome equivalente a!(true && false)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.