Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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]