Из программирования Ruby:
count enum.count {| объект | блок } → целое
Возвращает количество объектов в перечислении, которые равны obj или для которых блок возвращает истинное значение.
Таким образом, перечислитель посещает каждый элемент и добавляет 1 к счетчику, если блок возвращает значение true, что в данном случае означает, что элемент равен индексу массива.
Я не видел, чтобы этот паттерн использовался часто (если вообще использовался) — я был бы более склонен к следующему:
[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 }
Что кажется мне намного яснее, чем исходный пример.
person
zetetic
schedule
12.11.2012