Programming from 30

自分の備忘録が、誰かの為になれば・・

Ruby hashクラス 【 hash[hoge] += 数値 】の謎

hashの勉強をしていて、ん????なんだこれ??見た事あるけど、いまいち頭に入ってこない😩!!となったので、手を動かして理解まで進めてみた!
よくわからなかったのはこんなコード!

hash = Hash.new(0)

array = "Mississippi".chars

array.each do |j|
  hash[j] += 1
end

p hash

#=> {"M"=>1, "i"=>4, "s"=>4, "p"=>2}

こういったコードを見た時、戻り値の表示が腑に落ちず、なぜこのように返ってくるのかとても疑問でした。
問題は

hash[j]  += 1

の部分!array.each で"Mississippi"の一字ずつ変数jに入れ、hash[j] += 1の処理をする・・・ん?わからない・・。どうしてhashの形で合計されて出力されるのか。
初心者だからか、sum += 1なら見慣れているけど、hash[j] += 1ということは
hash[j] = hash[j] + 1という事。最初の"M"を入れるとhash[M] = hash[M] + 1になる。この結果が{"M" => 1}となる事が見慣れてないせいか、理解に苦しんだ。+= 数字をする事で、なぜvalueが1になるのか。sは"Mississippi"の中に4回も現れ、結果として"s" => 4と出力されているが、hash[:s] => 1 = hash[s] + 1を繰り返して、加算されている。どうせならhash[j] +=> 1こんな感じにしてくれると、記号でしっくりくる。でも、やっぱりわからないので、コンソールで色々といじってみたらなんとなく理解できた!

# まずはhash.new(0)でデフォルト値を設定!しないと計算ができない。
h = Hash.new(0)
# 今のところ当然中身は何もなし
p h     #=>  {}
h.keys    #=> []
h.values   #=> []
# hのkeyをsに設定するとデフォルトの0がvalueとして入る
h[:s]   #=> 0 

# ここでh[:s]に + 1をしてみる
h[:s] +=  1    =>  1
# ↑増えました!!という事は
h[:s] += 1     =>  2
h[:s] += 1     =>  3
h[:s] += 1     =>  4
# ↑ちゃんと1ずつ増えます!
ここでp hをすると
p h
=>   {:s  =>   4}
となりました!👍

コードと出力の結果の間を細かく確かめながらいくと、どう処理が行われて結果として出力されているのかがわかりました!違和感のあるコードは分解していこうと肝に命じて一件落着😄