21

より簡単な方法はありますか

if hash.key?('a')
  hash['a']['b'] = 'c' 
else  
  hash['a'] = {}
  hash['a']['b'] = 'c' 
end
4

5 に答える 5

39

最も簡単な方法は、ブロック引数を使用して 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 = { }

そして、has として何かを割り当てるためにアクセスすると、次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

于 2011-05-04T04:42:26.733 に答える
10

単純なものですが、ハッシュは有効なハッシュオブジェクトである必要があります

(hash["a"] ||= {})['b'] = "c"
于 2011-05-04T04:36:38.190 に答える
2

次のように作成するhashと、新しい (同じようにデフォルト値が設定された) ハッシュのデフォルト値が使用されます: (Phrogz の訂正に感謝します。構文が間違っていました)

hash = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }

それからあなたはすることができます

hash["a"]["b"] = "c"

追加のコードなしで。

于 2011-05-04T04:41:20.983 に答える
0
class NilClass
  def [](other)
    nil
  end
end

それを定義すると、すべてが自動的に機能します。nilただし、今後はハッシュとして使用すると空のハッシュとして動作することに注意してください。

于 2016-05-14T17:33:02.193 に答える