Verschil tussen “en” en && in robijn?

Wat is het verschil tussen de operators &&en andin Ruby?


Antwoord 1, autoriteit 100%

andis hetzelfde als &&maar met lagere prioriteit. Ze gebruiken allebei kortsluitingsevaluatie.

WAARSCHUWING: andheeft zelfs een lagere prioriteit dan =, dus u zult meestal andwillen vermijden. Een voorbeeld van het gebruik van andis 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).

anden orhebben een lagere prioriteit.

Bijvoorbeeld, in tegenstelling tot ||, heeft oreen lagere prioriteit dan =:

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

Evenzo heeft, in tegenstelling tot &&, andook een lagere prioriteit dan =:

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

Bovendien, in tegenstelling tot &&en ||, binden anden ormet 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 anden orkunnen nuttig zijn voor control-flow doeleinden: zie http://devblog.avdi.org/2010/08/02/using-and-and-or-in- robijn/.


Antwoord 5, autoriteit 5%

andheeft 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

andheeft 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 ifmaar niet and, omdat ifbegrijpelijker is, dus negeer ik gewoon anden 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

Other episodes