より簡単な方法はありますか
if hash.key?('a')
hash['a']['b'] = 'c'
else
hash['a'] = {}
hash['a']['b'] = 'c'
end
より簡単な方法はありますか
if hash.key?('a')
hash['a']['b'] = 'c'
else
hash['a'] = {}
hash['a']['b'] = 'c'
end
最も簡単な方法は、ブロック引数を使用して Hash を構築することです。
hash = Hash.new { |h, k| h[k] = { } }
hash['a']['b'] = 1
hash['a']['c'] = 1
hash['b']['c'] = 1
puts hash.inspect
# "{"a"=>{"b"=>1, "c"=>1}, "b"=>{"c"=>1}}"
このフォームはnew
、デフォルト値として新しい空のハッシュを作成します。あなたはこれを望まない:
hash = Hash.new({ })
これは、すべてのデフォルト エントリに対してまったく同じハッシュを使用するためです。
また、Phrogz が指摘しているように、次のコマンドを使用して、自動有効化されたハッシュを自動有効化できますdefault_proc
。
hash = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
更新: に対する警告を明確にする必要があると思いますHash.new({ })
。あなたがこれを言うとき:
h = Hash.new({ })
これは、次のように言っているのとほとんど同じです。
h = Hash.new
h.default = { }
そして、h
as として何かを割り当てるためにアクセスすると、次h[:k][:m] = y
のように動作します。
if(h.has_key?(:k))
h[:k][:m] = y
else
h.default[:m] = y
end
そして、もしあなたならh[:k2][:n] = z
、あなたは割り当ててしまうでしょうh.default[:n] = z
。それはまだ間違っh
ていると言っていることに注意してください。h.has_key?(:k)
ただし、次のように言うと:
h = Hash.new(0)
h[k]
ここで変更することはなく、 から値を読み取るh
(必要に応じてデフォルトを使用する) か、 に新しい値を割り当てるだけなので、すべて問題なく動作しますh
。
単純なものですが、ハッシュは有効なハッシュオブジェクトである必要があります
(hash["a"] ||= {})['b'] = "c"
次のように作成するhash
と、新しい (同じようにデフォルト値が設定された) ハッシュのデフォルト値が使用されます: (Phrogz の訂正に感謝します。構文が間違っていました)
hash = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }
それからあなたはすることができます
hash["a"]["b"] = "c"
追加のコードなしで。
class NilClass
def [](other)
nil
end
end
それを定義すると、すべてが自動的に機能します。nil
ただし、今後はハッシュとして使用すると空のハッシュとして動作することに注意してください。