Rubyのハッシュでデフォルト値をセットしておく方法が色々あって辛い

ハッシュのデフォルト値をセット出来る方法が3種類あって。 便利だとは思うが中々辛い。

こんな感じ。

# encoding: utf-8

# Rubyはハッシュにデフォルトバリューをセットしておける, 不宣言のキーを読んだ時に出る値
# オブジェクトにデフォルト値をセットしておく
h = Hash.new(1)
h["a"] = 20

p h["a"]
# bとcからhデフォルト値の1が出る
p h["b"]
p h["c"]

# デフォルト値を設定するブロックを用意しておく事も出来る

h = Hash.new{|hash, key|
    # ブロックパラメータで生成されたハッシュとキーを受け取ってそれを元に値を生成する
    # この場合hの存在しないキーを呼び出した場合ブロックパラメータkeyがupcaseされてブロックパラメータhash(これが自分自身)にセットされる
    hash[key] = key.upcase
}

h["a"] = 20
p h["a"]
# xとyがupcaseされたキーでx, yがバリューとしてセットされる
p h["x"]
p h["y"]
# この場合はfetchの第二引数が優先される
p h.fetch("z", "(undef)")