2010-09-29 7 views
5

È vero che nella maggior parte dei casi, in Ruby, è preferibile utilizzare &&, || anziché and, or, a meno che non si tratti di alcune situazioni speciali.In Ruby, dovremmo sempre usare "&&", "||" invece di "e", "o" a meno che non si tratti di situazioni speciali?

Penso che uno dei principi di progettazione di Ruby è quello di avere meno sorprese possibile, in modo da utilizzare and, o or in realtà hanno qualche sorpresa ... quali and non avere una priorità più alta rispetto or, mentre && ha una priorità più alta rispetto ||.

Quindi penso che nella maggior parte dei casi, utilizzare &&, ||. Conoscere in alcune situazioni speciali, potrebbe richiedere l'uso di and, or, ma penso che se queste sono mescolate con &&, ||, prima o poi potrebbe creare bug quando i tuoi colleghi che hanno iniziato a Ruby non molto tempo fa hanno bisogno di modificare il tuo codice .

+2

e qual è la vostra domanda? – klew

+1

la questione è il titolo del post –

+0

Vedi anche: http://stackoverflow.com/questions/1512547/what-is-the-difference-between-perls-or-and-and-short-circuit-op –

risposta

7

Sì. Affidarsi a and e or per la logica booleana è un buon modo per introdurre bug sottili nella propria applicazione.

Hanno un posto, però. Sono un'opzione sicura e leggibile quando vengono utilizzati come operatori di flusso di controllo.

redirect_to root_url and return 

ho praticamente sentito il modo che hai fatto fino a quando ho letto this excellent blog post.

+1

Questo è un post fantastico, grazie per la condivisione. –

+1

Incomprensione o abuso 'e',' o', e '&&' e '' || è un problema in molte lingue. Le persone assumono (erroneamente) che sono intercambiabili, ignorando la precedenza di ciascuna. Come dice Raphomet, non sapere quando usarne ognuno porta a bug sottili. Sono d'accordo che l'uso migliore di 'and' e' or' è come un controllo del flusso, che porta a un codice più leggibile. L'uso liberale di '(' e ')' può fare molto per evitare il problema, anche se può portare a un codice che sembra rumore di linea ... o Perl. –

7

Il libro "The Ruby Programming Language" (David Flanagan & Yukihiro Matsumoto) offre due motivi per usare "e".

  • leggibilità:

    if x > 0 and y > 0 and not defined? d then d = Math.sqrt(x*x +y*y) end

  • fare buon uso della precedenza inferiore:

    if a = get_from_db(x) and b = get_from_db(y) then do_stuff_with_true_values(a, b) end

(codice adattato da me) L'ultimo appena wouldn lavorare con '& & '.

Personalmente, io uso 'e' e 'o' combinato con parentesi in caso di dubbio, per readability.-

+0

+1 per "combinato con parentesi" –

2

È perché and, or & not hanno la precedenza inferiore rispetto &&, || e !.

Perché? Perché deriva da Perl. Larry Wall essere un linguista voluto il seguente al lavoro:

open my $fh, "<", $filename or die $!; 

Se si sostituisce la or con || allora questa affermazione sarebbe analizzato in questo modo:

open my $fh, "<", ($filename || die $!); 

che non è buono!

Così per linguaggi come Perl & rubino dove parentesi sono spesso opzionale allora questa era la soluzione. In caso contrario, si avrebbe bisogno di scrivere:

open(my $fh, "<", $filename) || die $!; 

Vedi perlop "Logical Not, And, or, Defined or, and Exclusive Or & & Logical operators in Perl and Ruby per l'intero shake down.

/I3az/

Problemi correlati