Wat is het verschil tussen de operators &&
en and
in Ruby?
Antwoord 1, autoriteit 100%
and
is hetzelfde als &&
maar met lagere prioriteit. Ze gebruiken allebei kortsluitingsevaluatie.
WAARSCHUWING: and
heeft zelfs een lagere prioriteit dan =
, dus u zult meestal and
willen vermijden. Een voorbeeld van het gebruik van and
is te vinden in de Rails Guide onder “Dubbele renderfouten vermijden“.
Antwoord 2, autoriteit 69%
Het praktische verschil is de bindingskracht, die kan leiden tot eigenaardig gedrag als je er niet op voorbereid bent:
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
Hetzelfde werkt voor ||
en or
.
Antwoord 3, autoriteit 17%
De Ruby Style Guidezegt het beter dan ik zou kunnen:
Gebruik &&/|| voor booleaanse uitdrukkingen en/of voor controlestroom. (Regel van
thumb: Als u buitenste haakjes moet gebruiken, gebruikt u de verkeerde
operators.)
# boolean expression
if some_condition && some_other_condition
do_something
end
# control flow
document.saved? or document.save!
Antwoord 4, autoriteit 10%
||
en &&
binden met de prioriteit die u verwacht van booleaanse operatoren in programmeertalen (&&
is erg sterk, ||
is iets minder sterk).
and
en or
hebben een lagere prioriteit.
Bijvoorbeeld, in tegenstelling tot ||
, heeft or
een lagere prioriteit dan =
:
> a = false || true
=> true
> a
=> true
> a = false or true
=> true
> a
=> false
Evenzo heeft, in tegenstelling tot &&
, and
ook een lagere prioriteit dan =
:
> a = true && false
=> false
> a
=> false
> a = true and false
=> false
> a
=> true
Bovendien, in tegenstelling tot &&
en ||
, binden and
en or
met gelijke prioriteit :
> !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
De zwak bindende and
en or
kunnen nuttig zijn voor control-flow doeleinden: zie http://devblog.avdi.org/2010/08/02/using-and-and-or-in- robijn/.
Antwoord 5, autoriteit 5%
and
heeft een lagere prioriteit dan &&
.
Maar voor een bescheiden gebruiker kunnen er problemen optreden als het wordt gebruikt in combinatie met andere operators waarvan de prioriteit ertussen ligt, bijvoorbeeld de toewijzingsoperator:
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
Antwoord 6
and
heeft een lagere prioriteit, meestal gebruiken we het als een control-flow modifier zoals if
:
next if widget = widgets.pop
wordt
widget = widgets.pop and next
Voor or
:
raise "Not ready!" unless ready_to_rock?
wordt
ready_to_rock? or raise "Not ready!"
Ik gebruik liever if
maar niet and
, omdat if
begrijpelijker is, dus negeer ik gewoon and
en or
.
Raadpleeg “Gebruik van “and ” en “of” in Ruby” voor meer informatie.
Antwoord 7
Ik weet niet of dit de bedoeling van Ruby is of dat dit een bug is, maar probeer deze code hieronder. Deze code werd uitgevoerd op Ruby versie 2.5.1 en was op een Linux-systeem.
puts 1 > -1 and 257 < 256
# => false
puts 1 > -1 && 257 < 256
# => true