Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Stringクラスの文字毎にeach_with_indexやcollectを扱う

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]