25

配列内のn番目ごとの要素を調べたいと思います。C ++では、次のようにします。

for(int x = 0; x<cx; x+=n){
    value_i_care_about = array[x];
    //do something with the value I care about.  
}

Rubyでも同じことをしたいのですが、「ステップ」する方法が見つかりません。whileループはその仕事をすることができますが、既知のサイズでそれを使用するのは不快であり、これを行うためのより良い(よりRubyの)方法があると期待しています。

4

7 に答える 7

51

範囲にはstep、インデックスをスキップするために使用できるメソッドがあります。

(0..array.length - 1).step(2).each do |index|
  value_you_care_about = array[index]
end

または、範囲を快適に使用できる場合...は、以下をもう少し簡潔にします。

(0...array.length).step(2).each do |index|
  value_you_care_about = array[index]
end
于 2012-10-23T00:25:56.850 に答える
20
array.each_slice(n) do |e, *_|
  value_i_care_about = e
end
于 2012-10-23T10:12:52.330 に答える
6

列挙子を返すRangeクラスのstep()メソッドを使用するだけです

(1..10).step(2) {|x| puts x}
于 2015-02-03T16:31:15.077 に答える
2

反復ごとに数値の範囲をスキップしながら反復できます。例:

1.step(10, 2) { |i| print "#{i} "}

http://www.skorks.com/2009/09/a-wealth-of-ruby-loops-and-iterators/

だから次のようなもの:

array.step(n) do |element|
  # process element
end
于 2012-10-23T00:11:49.907 に答える
0

これは、モジュロ演算子を使用するための優れた例です。%

この概念を理解すると、それらを内外で知る必要なしに、多数の異なるプログラミング言語に適用できます。

step = 2
["1st","2nd","3rd","4th","5th","6th"].each_with_index do |element, index|
  puts element if index % step == 1
end

#=> "2nd"
#=> "4th"
#=> "6th"
于 2012-10-23T00:34:23.003 に答える
0
class Array
def step(interval, &block)
    ((interval -1)...self.length).step(interval) do |value|
        block.call(self[value])
    end
end
end

クラスArrayにメソッドを追加できます

于 2014-10-15T18:17:35.767 に答える
0

どうですか:

> [1, 2, 3, 4, 5, 6, 7].select.each_with_index { |_,i| i % 2 == 0 }
=> [1, 3, 5, 7]

イテレータの連鎖は非常に便利です。

于 2015-06-23T17:36:48.017 に答える