Je veux juste faire un point spécifique sur la boucle for in dans Ruby. Cela peut sembler une construction similaire à d'autres langages, mais en fait c'est une expression comme toutes les autres constructions en boucle de Ruby. En fait, le for in fonctionne avec des objets Enumerable tout comme chaque itérateur.
La collection passée à for in peut être n'importe quel objet qui a une méthode itérateur pour chaque. Les tableaux et les hachages définissent chaque méthode, et de nombreux autres objets Ruby le font également. La boucle for / in appelle la méthode each de l'objet spécifié. Lorsque cet itérateur fournit des valeurs, la boucle for affecte chaque valeur (ou chaque ensemble de valeurs) à la variable (ou aux variables) spécifiée (s), puis exécute le code dans body.
C'est un exemple stupide, mais illustre le point que la boucle for in fonctionne avec N'IMPORTE QUEL objet qui a une méthode each, tout comme la façon dont chaque itérateur fait:
class Apple
TYPES = %w(red green yellow)
def each
yield TYPES.pop until TYPES.empty?
end
end
a = Apple.new
for i in a do
puts i
end
yellow
green
red
=> nil
Et maintenant, chaque itérateur:
a = Apple.new
a.each do |i|
puts i
end
yellow
green
red
=> nil
Comme vous pouvez le voir, les deux répondent à chaque méthode qui renvoie des valeurs au bloc. Comme tout le monde l'a dit ici, il est certainement préférable d'utiliser chaque itérateur sur la boucle for in. Je voulais juste ramener à la maison le point qu'il n'y a rien de magique dans la boucle for in. Il s'agit d'une expression qui appelle chaque méthode d'une collection, puis la transmet à son bloc de code. Par conséquent, c'est un cas très rare que vous auriez besoin d'utiliser pour dans. Utilisez chaque itérateur presque toujours (avec l'avantage supplémentaire de l'étendue du bloc).