プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

CodeIQに出題されている問題をやってみた その③

続き

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はメソッド内で作られて、閉じるそうです。うーむ難しい。