Je veux regarder chaque n-ième élément d'un tableau. En C++, je ferais ceci:
for(int x = 0; x<cx; x+=n){
value_i_care_about = array[x];
//do something with the value I care about.
}
Je veux faire la même chose dans Ruby, mais je ne trouve pas le moyen de "faire un pas". Une boucle while
pourrait suffire, mais je trouve cela déplaisant de l’utiliser pour une taille connue et j’attends à ce qu’il y ait un meilleur moyen (plus Ruby) de le faire.
Les plages ont une méthode step
que vous pouvez utiliser pour ignorer les index:
(0..array.length - 1).step(2).each do |index|
value_you_care_about = array[index]
end
Ou si vous maîtrisez ...
avec des plages, voici un peu plus concis:
(0...array.length).step(2).each do |index|
value_you_care_about = array[index]
end
array.each_slice(n) do |e, *_|
value_i_care_about = e
end
Utilisez simplement la méthode step () de la classe Range qui renvoie un énumérateur
(1..10).step(2) {|x| puts x}
Nous pouvons effectuer une itération en sautant une plage de nombres à chaque itération, par exemple:
1.step(10, 2) { |i| print "#{i} "}
http://www.skorks.com/2009/09/a-wealth-of-Ruby-loops-and-iterators/
Donc, quelque chose comme:
array.step(n) do |element|
# process element
end
C'est un excellent exemple d'utilisation de l'opérateur modulo %
Lorsque vous comprenez ce concept, vous pouvez l’appliquer dans un grand nombre de langages de programmation différents, sans avoir à les connaître.
step = 2
["1st","2nd","3rd","4th","5th","6th"].each_with_index do |element, index|
puts element if index % step == 1
end
#=> "2nd"
#=> "4th"
#=> "6th"
class Array
def step(interval, &block)
((interval -1)...self.length).step(interval) do |value|
block.call(self[value])
end
end
end
Vous pouvez ajouter la méthode à la classe Array
Qu'en est-il de:
> [1, 2, 3, 4, 5, 6, 7].select.each_with_index { |_,i| i % 2 == 0 }
=> [1, 3, 5, 7]
Le chaînage d'itérateurs est très utile.