CodeIQに出題されている問題をやってみた その③
続き
chars
文字列を1字づつ配列に変換します
irb(main):001:0> string = "hoge" => "hoge" irb(main):002:0> string.chars => ["h", "o", "g", "e"]
each_with_object
問題文、当初魔法のようにしか見えませんでした。
# コメントは期待する処理結果 # count_all_chars("Mississippi") #=> {"M"=>1,"i"=>4,"s"=>4,"p"=>2} # count_all_chars("PeterPiper") #=> {"P"=>2,"e"=>3,"t"=>1,"r"=>2,"i"=>1,"p"=>1} # count_all_chars("doodle_doo") #=> {"d"=>3,"o"=>4,"l"=>1,"e"=>1,"_"=>1} def count_all_chars( string ) string.chars.【空欄C】(Hash.new(0)){ |c,h| h[c]+=1 } end
引数にHashをとるとかどうなっとんねんって思いました。
解答サイトにある通りeach_with_objectリファレンスを読みますと、「each_with_object(obj) {|(*args), memo_obj| ... } -> object」とあります。 なるほどでした。これで引数とブロックの作りの意味がわかります。objはHashで、ブロック内のmemo_obj、つまりコードで言えばhで渡されます。
これならHash.newはメソッド内で作られて、閉じるそうです。うーむ難しい。