Можно ли проверить позицию итератора в Ruby?

Есть ли способ получить позицию итератора (сколько раз он повторялся)?

values = (1..100)
values.each do |value|
  if ... % 10 == 1 then puts iterator.count end
end

Или вам нужно считать явно:

values = (1..100)
counter = 0
values.each do |value|
  if counter % 10 == 1 then puts counter end
  counter += 1
end

Есть ли более чистый подход?

Руби 1.9.2


person B Seven    schedule 22.06.2012    source источник


Ответы (1)


Используйте each_with_index.

values.each_with_index do |value, idx|
  puts idx if idx % 10 == 1
  # do something else
end

Или вы можете использовать более холодную альтернативу

values.each.with_index do |value, idx|
  # work
end

Я назвал его круче, потому что #with_index относительно менее известен и его можно комбинировать с map (и другими методами) для получения интересных результатов.

person Sergio Tulentsev    schedule 22.06.2012
comment
.with_index также работает для хэша: hash.each_key.with_index |key, idx| - person B Seven; 22.06.2012
comment
@BSeven: Более того, он работает с любым методом, который возвращает перечислитель :) - person Sergio Tulentsev; 22.06.2012
comment
два (второстепенных) примечания: 1) each_with_index также может использоваться с map (Ruby ›= 1.8.7). 2) values.each.with_index ведет себя фактически как values.map.with_index. - person tokland; 22.06.2012
comment
@tokland: спасибо! Почему-то я никогда не пробовал использовать map с each_with_index :) - person Sergio Tulentsev; 22.06.2012