プログラミング Ruby から:
カウント enum.count {| オブジェクト | ブロック } → int
obj と等しい、またはブロックが true 値を返す enum 内のオブジェクトの数を返します。
そのため、列挙子は各要素にアクセスし、ブロックが true を返した場合 (この場合、要素が配列インデックスと等しい場合)、カウントに 1 を追加します。
このパターンがあまり使用されているのを見たことがありません (あったとしても)。
[4, 1, 2, 0].each_with_index.select { |elem, index| elem == index }.count
編集
あなたのコメントから例を見てみましょう:
[4, 1, 2, 0].enum_for(:each_slice, 2).map do |a, b|
a + b
end
each_slice(2)
配列を一度に 2 要素取り、各スライスの配列を返します。
[4, 1, 2, 0].each_slice(2).map # => [[4,1], [2,0]]
結果を呼び出すmap
と、各サブ配列を操作してブロックに渡すことができます。
[4, 1, 2, 0].enum_for(:each_slice, 2).map do |a,b|
puts "#{a.inspect} #{b.inspect}"
end
結果は
4 1
2 0
a
b
ブロック引数が「スプラッティング」されているため、それらの値を取得します。
a, b = *[4, 1]
a # => 4
b # => 1
代わりに配列スライスを引数として取ることもできます:
[4, 1, 2, 0].enum_for(:each_slice, 2).map {|a| puts "#{a.inspect}"}
[4, 1]
[2, 0]
これを行うことができます:
[4, 1, 2, 0].enum_for(:each_slice, 2).map {|a| a.inject(:+) } #=> [5,2]
または、ActiveSupport (Rails アプリなど) をお持ちの場合は、
[4, 1, 2, 0].enum_for(:each_slice, 2).map {|a| a.sum }
これは、元の例よりもはるかに明確に思えます。