Verschil tussen “of” en || in robijn?

Wat is het verschil tussen de operators oren ||in Ruby? Of is het gewoon een voorkeur?


Antwoord 1, autoriteit 100%

Het is een kwestie van operatorprioriteit.

||heeft een hogere prioriteit dan or.

Dus tussen de twee heb je andere operatoren, waaronder ternaire (? :) en toewijzing (=), dus welke je kiest, kan de uitkomst van uitspraken beïnvloeden.

Hier is een ruby-operatorvoorrangstabel.

Zie deze vraagvoor een ander voorbeeld met and/&&.

Houd ook rekening met enkele nare dingen die kunnen gebeuren:

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

Beide van de vorige twee instructies evalueren tot true, maar de tweede stelt ain op falseaangezien =prioriteit is lager dan ||maar hoger dan or.


Antwoord 2, autoriteit 30%

Zoals de anderen al hebben uitgelegd, is het enigeverschil de prioriteit. Ik wil er echter op wijzen dat er eigenlijk tweeverschillen zijn tussen de twee:

  1. and, oren nothebben veellagere prioriteit dan &&, ||en !
  2. anden orhebben dezelfdevoorrang, terwijl &&hogereprioriteit dan ||

Over het algemeen is het een goede stijl om het gebruik van and, oren notte vermijden en &&, ||en !in plaats daarvan. (De kernontwikkelaars van Rails weigeren bijvoorbeeld patches die de trefwoordformulieren gebruiken in plaats van de operatorformulieren.)

De reden waarom ze überhaupt bestaan, is niet voor booleaanse formules, maar voor controlestroom. Ze kwamen Ruby binnen via Perl’s bekende do_this or do_thatidioom, waar do_thisfalseof niloplevert als er een fout is en alleen danwordt in plaats daarvan do_thatuitgevoerd. (Analoog is er ook het idioom do_this and then_do_that.)

Voorbeelden:

download_file_via_fast_connection or download_via_slow_connection
download_latest_currency_rates and store_them_in_the_cache

Soms kan dit de controle iets vloeiender maken dan het gebruik van ifof unless.

Het is gemakkelijk in te zien waarom de operators in dit geval de “verkeerde” (d.w.z. identieke) prioriteit hebben: ze verschijnen sowieso nooit samen in dezelfde uitdrukking. En als ze welsamen verschijnen, wil jeze over het algemeen gewoon van links naar rechts evalueren.


Antwoord 3, autoriteit 16%

and/orzijn voor de controlestroom.

Ruby staat dit niet toe als geldige syntaxis:

false || raise "Error"

Dit is echter geldig:

false or raise "Error"

Je kunt het eerste laten werken, met ()maar het gebruik van oris de juiste methode.

false || (raise "Error")

Antwoord 4, autoriteit 5%

puts false or true–> afdrukken: false

puts false || true–> afdrukken: waar


Antwoord 5, autoriteit 4%

De manier waarop ik deze operators gebruik:

||, &&zijn voor booleaanse logica. or, andzijn voor de controlestroom. Bijv.

do_smth if may_be || may_be— we evalueren de toestand hier

do_smth or do_smth_else— we definiëren de workflow, die gelijk is aan
do_smth_else unless do_smth

om een eenvoudig voorbeeld te geven:

> puts "a" && "b"
b
> puts 'a' and 'b'
a

Een bekend idioom in Rails is render and return. Het is een sneltoets om return if renderte zeggen, terwijl render && returnwerkt niet. Zie “Dubbele renderfouten vermijden” in de Rails-documentatie voor meer informatie.


Antwoord 6

oris NIET hetzelfde als ||. Gebruik alleen de operator ||in plaats van de operator or.

Hier zijn enkele redenen. De:

    De operator

  • orheeft een lagere prioriteit dan ||.
  • orheeft een lagere prioriteit dan de =toewijzingsoperator.
  • anden orhebben dezelfde prioriteit, terwijl &&een hogere prioriteit heeft dan ||.

Antwoord 7

Zowel orals ||evalueren naar waar als een van de operanden waar is. Ze evalueren hun tweede operand alleen als de eerste onwaar is.

Net als bij andis het enige verschil tussen oren ||hun prioriteit.

Om het leven interessant te maken, hebben anden ordezelfde prioriteit, terwijl &&een hogere prioriteit heeft dan ||.


Antwoord 8

Om toe te voegen aan het antwoord van mopoke, het is ook een kwestie van semantiek. orwordt als een goede gewoonte beschouwd omdat het veel beter leest dan ||.

Other episodes