2009-09-15 20 views

risposta

277

and è lo stesso di && ma con lower precedence. Entrambi usano short-circuit evaluation.

ATTENZIONE: and ha addirittura la precedenza inferiore rispetto = così si vorrà evitare and sempre

+36

Sarebbe una buona idea specificare che di solito si dovrebbe usare '&&', mentre 'and' dovrebbe essere usato solo per casi molto specifici. –

+9

Un'altra buona spiegazione qui: http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/. –

+12

Dal link di Andrew Marshall: "Un altro modo di pensare su' and' è come un modificatore di dichiarazione 'if' invertito:' next se widget = widgets.pop' diventa 'widget = widgets.pop e next'. È un ottimo modo di metterlo, davvero fatto "clic" nella mia testa. (E 'o' è come un modificatore' unless tranne'.) – GMA

220

La differenza pratica è vincolante forza, che può portare ad un comportamento singolare, se non siete preparati per questo:

foo = :foo 
bar = nil 

a = foo and bar 
# => nil 
a 
# => :foo 

a = foo && bar 
# => nil 
a 
# => nil 

a = (foo and bar) 
# => nil 
a 
# => nil 

(a = foo) && bar 
# => nil 
a 
# => :foo 

La stessa cosa funziona per || e or.

+2

' a = foo e bar' _and_ '(a = foo) && bar' dimostra che' and' ha precedenza più bassa di '&&'. – sargas

+0

non capisco: cosa significa "foo e bar" destinati a ritornare? – BKSpurgeon

+0

'a = foo e bar' è equivalente a' (a =: foo) e nil'. Poiché l'assegnazione restituisce un valore logicamente true (': foo'), la seconda parte valuta, che fallisce, restituendo' nil'. – tadman

49

Il Ruby Style Guide dice che meglio di me:

Usa & &/|| per le espressioni booleane e/o per il flusso di controllo. (Regola di generale: se si deve usare le parentesi esterne, si utilizzano i sbagliate operatori.)

# boolean expression 
if some_condition && some_other_condition 
    do_something 
end 

# control flow 
document.saved? or document.save! 
+38

In realtà la [** guida ora dice **] (https://github.com/bbatsov/ruby-style-guide/commit/5920497452c1f6f604742a735f5684e86d4c0003) per evitare 'and' /' or' completamente, e potrebbero avere un punto . Spesso il loro uso nel flusso di controllo [potrebbe essere scritto più chiaramente con gli operatori 'if' /' unless'] (http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby /) comunque (ad esempio 'document.save! a meno che document.saved?') – Yarin

+0

@akostadinov nel caso in cui non stiate trollando: la guida di Ruby Style non è scritta dai creatori di Ruby. Ruby è stato creato da Yukihiro Matsumoto e altri, mentre Ruby Style Guide era [principalmente] (https://github.com/bbatsov/ruby-style-guide/graphs/contributors) di Bozhidar Batsov. –

+0

@AndrewGrimm, grazie, buono a sapersi. Mi dispiace per la trolling ma sono sinceramente confuso con alcuni aspetti della realtà rubino.Una cosa è certa: ogni progetto di ruby ​​richiede politiche di stile rigorose per mantenere la base di codici manutenibile. – akostadinov

33

|| e && si legano con la precedenza che ci si aspetta da parte degli operatori booleani nei linguaggi di programmazione (&& è molto forte, || è leggermente meno forte).

and e or hanno precedenza inferiore.

Ad esempio, a differenza ||, or ha precedenza inferiore =:

> a = false || true 
=> true 
> a 
=> true 
> a = false or true 
=> true 
> a 
=> false 

Analogamente, a differenza &&, and ha anche inferiore precedenza rispetto =:

> a = true && false 
=> false 
> a 
=> false 
> a = true and false 
=> false 
> a 
=> true 

Inoltre, a differenza && e ||, and e or binding con uguale precedenza:

> !puts(1) || !puts(2) && !puts(3) 
1 
=> true 
> !puts(1) or !puts(2) and !puts(3) 
1 
3 
=> true 
> !puts(1) or (!puts(2) and !puts(3)) 
1 
=> true 

La debolmente vincolante and e or possono essere utili per scopi di controllo di flusso: vedi http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/.

+1

"a differenza di' || ',' or' ha precedenza più bassa di '=' "... ora ha più senso, grazie! –

13

and ha precedenza inferiore a &&.

Tuttavia, per un utente senza pretese, potrebbero verificarsi problemi se utilizzato insieme ad altri operatori la cui precedenza è nel mezzo, ad esempio l'operatore di assegnazione.

es

def happy?() true; end 
def know_it?() true; end 

todo = happy? && know_it? ? "Clap your hands" : "Do Nothing" 

todo 
# => "Clap your hands" 

todo = happy? and know_it? ? "Clap your hands" : "Do Nothing" 

todo 
# => true 
+0

Grazie, ma come è la precedenza di "e" diversa da "&&"? – BKSpurgeon

+1

@BKSpurgeon Vedere [here] (https://ruby-doc.org/core-2.4.1/doc/syntax/precedence_rdoc.html) per un elenco ordinato di precedenza degli operatori in Ruby. – thutt

3

e ha bassa priorità, soprattutto usiamo come modificatore di flusso di controllo come se

next if widget = widgets.pop 

diventa

widget = widgets.pop and next 

per o

raise "Not ready!" unless ready_to_rock? 

diventa

ready_to_rock? or raise "Not ready!" 

Io preferisco usare se ma non e, perché se è più comprensibile, quindi ho solo ignorare e e o .

Riferimento Per

Using “and” and “or” in Ruby