web-dev-qa-db-fra.com

Faire une boucle dans un tableau avec step

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.

17
baash05

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
39
user1454117
array.each_slice(n) do |e, *_|
  value_i_care_about = e
end
15
sawa

Utilisez simplement la méthode step () de la classe Range qui renvoie un énumérateur

(1..10).step(2) {|x| puts x}
5
boctulus

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
1
bdeonovic

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"
0
doesterr
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

0
syllabix

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.

0
Jurriaan