Wat is het verschil tussen de operators or
en ||
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 a
in op false
aangezien =
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:
and
,or
ennot
hebben veellagere prioriteit dan&&
,||
en!
and
enor
hebben dezelfdevoorrang, terwijl&&
hogereprioriteit dan||
Over het algemeen is het een goede stijl om het gebruik van and
, or
en not
te 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_that
idioom, waar do_this
false
of nil
oplevert als er een fout is en alleen danwordt in plaats daarvan do_that
uitgevoerd. (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 if
of 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
/or
zijn 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 or
is 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, and
zijn 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 render
te zeggen, terwijl render && return
werkt niet. Zie “Dubbele renderfouten vermijden” in de Rails-documentatie voor meer informatie.
Antwoord 6
or
is NIET hetzelfde als ||
. Gebruik alleen de operator ||
in plaats van de operator or
.
Hier zijn enkele redenen. De:
-
De operator
or
heeft een lagere prioriteit dan||
.or
heeft een lagere prioriteit dan de=
toewijzingsoperator.and
enor
hebben dezelfde prioriteit, terwijl&&
een hogere prioriteit heeft dan||
.
Antwoord 7
Zowel or
als ||
evalueren naar waar als een van de operanden waar is. Ze evalueren hun tweede operand alleen als de eerste onwaar is.
Net als bij and
is het enige verschil tussen or
en ||
hun prioriteit.
Om het leven interessant te maken, hebben and
en or
dezelfde 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. or
wordt als een goede gewoonte beschouwd omdat het veel beter leest dan ||
.