Ruby: différence entre @ cars.each faire | voiture | et pour voiture à @cars faire

StackOverflow https://stackoverflow.com/questions/1172324

  •  19-09-2019
  •  | 
  •  

Question

(Désolé pour la question de débutant.) Dans Ruby, quelle est la différence entre les boucles:

@cars.each do |car| 

et

for car in @cars do

est-il une différence d'efficacité, ou pourquoi avons-nous besoin de deux façons (ou plus) pour exprimer la même chose? La deuxième façon me semble plus élégant / naturel, mais je manque peut-être une observation cruciale, pourquoi la première peut être le meilleur choix.

Était-ce utile?

La solution

Plus les gens utilisent la notation @cars.each parce que d'autres méthodes généralise (comme #inject, #each_with_index, #map, etc, ainsi que callbacks non iterator).

pour / en est principalement juste du sucre syntaxique pour #each. La principale différence dans la façon dont les deux travaux est dans la portée des variables:

irb> @cars = %w{ ford chevy honda toyota }
#=> ["ford", "chevy", "honda", "toyota"]
irb> @cars.each { |car| puts car }
ford
chevy
honda
toyota
#=> ["ford", "chevy", "honda", "toyota"]
irb> car
NameError: undefined local variable or method `car` for #<Object:0x399770 @cars=["ford", "chevy", "honda", "toyota"]>
        from (irb):3
        from /usr/local/bin/irb:12:in `<main>`
irb> for car in @cars
     puts car.reverse
     end
drof
yvehc
adnoh
atoyot
#=> ["ford", "chevy", "honda", "toyota"]
irb> car
#=> "toyota"

pour / en laisse la variable iterator portée par la suite, alors que #each ne fonctionne pas.

Personnellement, je ne jamais utiliser Ruby pour / dans la syntaxe.

Autres conseils

Je pense qu'il est juste du sucre syntaxique. Il est fonctionnellement équivalent, et je ne suis pas au courant d'aucune différence de mise en œuvre dans l'interpréteur.

Note -. Vous pouvez perdre le 'faire' sur le second

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top