Qual è la differenza tra gli operatori &&
e and
in Ruby?Differenza tra "e" e && in Ruby?
risposta
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
Sarebbe una buona idea specificare che di solito si dovrebbe usare '&&', mentre 'and' dovrebbe essere usato solo per casi molto specifici. –
Un'altra buona spiegazione qui: http://devblog.avdi.org/2010/08/02/using-and-and-or-in-ruby/. –
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
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
.
' a = foo e bar' _and_ '(a = foo) && bar' dimostra che' and' ha precedenza più bassa di '&&'. – sargas
non capisco: cosa significa "foo e bar" destinati a ritornare? – BKSpurgeon
'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
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!
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
@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. –
@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
||
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/.
"a differenza di' || ',' or' ha precedenza più bassa di '=' "... ora ha più senso, grazie! –
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
Grazie, ma come è la precedenza di "e" diversa da "&&"? – BKSpurgeon
@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
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
- 1. Differenza tra downcase e downcase! in Ruby
- 2. Ruby - Differenza tra: variabile e @variabile
- 3. Differenza tra. e #
- 4. Qual è la differenza tra Ruby e Ruby on Rails?
- 5. Differenza tra `% in%` e `` ==
- 6. Qual è la differenza tra Metodi e Attributi in Ruby?
- 7. Differenza tra operatori di stringa + e << in Ruby
- 8. Differenza tra lambda e -> operatore in Ruby
- 9. Qual è la differenza tra Object e BasicObject in Ruby?
- 10. Differenza tra il metodo as_json e to_json in Ruby
- 11. Rubino: Differenza tra istanza e variabili locali in Ruby
- 12. Qual è la differenza tra "include" e "anteporre" in Ruby?
- 13. In Ruby, qual è la differenza tra String() e #to_s
- 14. Differenza tra @istanza_variabile e attr_accessor
- 15. Differenza tra String.scan e String.split
- 16. Differenza tra "" e "" in Python
- 17. Differenza tra $ @ e $! in perl
- 18. Differenza tra. e: in Lua
- 19. Qual è la differenza tra Ruby on Rails e Grails?
- 20. Ruby - Differenza tra matrice # << e matrice # push
- 21. Ruby - qual è la differenza tra virgolette singole e doppie?
- 22. Differenza tra "o" e "||"
- 23. MySQL: Differenza tra ",", "e"
- 24. Differenza tra oggetto e *?
- 25. Differenza tra ". +" E ". +?"
- 26. Differenza tra | = e^= css
- 27. CMake: differenza tra $ {} e "$ {}"
- 28. La differenza tra $ * e $ @
- 29. Differenza tra $ # e $ {# @}
- 30. Differenza tra unwrapObservable e()
Vedi anche [Differenza tra 'o' e' '||] (http://stackoverflow.com/q/2083112/211563). –