208 votes

« pour » vs « chaque » dans Ruby

J’ai eu juste une petite question au sujet de boucles en Ruby. Y a-t-il une différence entre ces deux manières d’itération sur une collection ?

Je me demandais si ce sont exactement les mêmes, ou si peut-être il y a une différence subtile (éventuellement lorsque `` est nul).

322voto

Jeremy Ruten Points 59989

C'est la seule différence:

chaque:

irb> [1,2,3].each { |x| }
  => [1, 2, 3]
irb> x
NameError: undefined local variable or method `x' for main:Object
    from (irb):2
    from :0

pour:

irb> for x in [1,2,3]; end
  => [1, 2, 3]
irb> x
  => 3

Avec l' for boucle, la variable d'itérateur est toujours en vie après le bloc est terminé. Avec l' each boucle, il n'a pas, à moins qu'il ait déjà été définie comme une variable avant la boucle commencé.

Autres que que, for est juste la syntaxe de sucre pour l' each méthode.

Lors de l' @collection est nil les deux boucles de lever une exception:

Exception: undefined variable locale ou de la méthode `@de la collection " pour les principaux:Objet

47voto

ChristopheD Points 38217

Voir " Les maux de la boucle " pour une bonne explication (il y a une petite différence en ce qui concerne la portée des variables).

L'utilisation de each est considérée comme une utilisation plus idiomatique de Ruby.

31voto

Bayard Randel Points 5771

Votre premier exemple,

 @collection.each do |item|
  # do whatever
end
 

est plus idiomatique. Alors que ruby ​​prend en charge les constructions en boucle comme pour et pendant, la syntaxe de bloc est généralement préférée.

Une autre différence subtile réside dans le fait que toute variable que vous déclarez dans une boucle for sera disponible en dehors de la boucle, car celles dans un bloc itérateur sont effectivement privées.

6voto

Mr. Black Points 2342

Un plus différent ..

 number = ["one", "two", "three"]
 => ["one", "two", "three"] 

loop1 = []
loop2 = []

number.each do |c|
  loop1 << Proc.new { puts c }
end
 => ["one", "two", "three"] 

for c in number
  loop2 << Proc.new { puts c }
end
 => ["one", "two", "three"] 

loop1[1].call
two
 => nil 

loop2[1].call
three
 => nil 
 

source: http://paulphilippov.com/articles/enumerable-each-vs-for-loops-in-ruby

pour plus de clarté: http://www.ruby-forum.com/topic/179264#784884

2voto

BaroqueBobcat Points 6788

Il semble comme il n'y a pas de différence, for utilise each - dessous.

$ irb
>> for x in nil
>> puts x
>> end
NoMethodError: undefined method `each' for nil:NilClass
    from (irb):1
>> nil.each {|x| puts x}
NoMethodError: undefined method `each' for nil:NilClass
    from (irb):4

Comme Bayard dit, chacun est plus idiomatique. Il se cache de vous et ne nécessite pas de langue de spécialité caractéristiques. Par Télémaque Commentaire

for .. in .. jeux de l'itérateur en dehors de la portée de la boucle, de sorte

for a in [1,2]
  puts a
end

les feuilles a défini après la boucle est terminée. Où qu' each ne le fait pas. Ce qui est une autre raison en faveur de l'utilisation de each, parce que la variable temp vit une période plus courte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X