2014/8/7追記:
Enumeratorクラスのwith_indexメソッドの方が美しいです。each_char.each_with_indexなんて泥臭い事をせずとも...with_indexがあるんじゃよ - Bye Bye Moore
> str = ('a'..'z').to_a.join => "abcdefghijklmnopqrstuvwxyz"
という文字列があったとします。
このままでは文字毎にeach_with_indexやcollectができません。
ただ、クラスにはEnumratorクラスのメソッドである
- each_char
- each_byte
があるため一個一個切り出す事が可能です。
これらで糖衣させてあげれば上記便利メソッドの活用が可能となります。
str.each_char.reject{|i| i < 'w'}.join => "wxyz"
> str.each_char.each_with_index{|i,count| printf "%2d:%2s\n", count+1,i} 1: a 2: b 3: c 4: d ... 25: y 26: z
Rubist的には、黒魔術に慣れる為にもenum_forやto_enumで渡す方が良いのかも知れません
[0,1,2,3,4,5].enum_for(:each_slice, 2).each_with_index do |e,i| p [e,i] end #=> # [[0, 1], 0] # [[2, 3], 1] # [[4, 5], 2]