Rubyのハッシュイディオムのハッシュ?
-
05-07-2019 - |
質問
Rubyでハッシュのハッシュを作成すると、便利な2つ(またはそれ以上)の次元ルックアップが可能になります。ただし、挿入するときは、ハッシュに最初のインデックスが既に存在するかどうかを常に確認する必要があります。例:
h = Hash.new
h['x'] = Hash.new if not h.key?('x')
h['x']['y'] = value_to_insert
新しいハッシュが自動的に作成される場所では、次の操作を実行することをお勧めします。
h = Hash.new
h['x']['y'] = value_to_insert
同様に、最初のインデックスがまだ存在しない値を検索する場合、 '[]'エラーに対して未定義のメソッドを受け取るよりも、nilが返される方が望ましいでしょう。
looked_up_value = h['w']['z']
この動作を持つハッシュラッパークラスを作成できますが、このタスクを達成するための既存のRubyイディオムはありますか?
解決
Hash.new
を渡すことができます。 関数は、クエリされた値がまだ存在しない場合にデフォルト値を生成するために実行されるブロックです。
h = Hash.new { |h, k| h[k] = Hash.new }
もちろん、これは再帰的に実行できます。
/ EDIT:うわー、記事この質問に答えます。
完全を期すために、任意の深さのハッシュに関する記事のソリューションを次に示します。
hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)}))
クレジットはデータノイズからKentに送られます。
他のヒント
自動生存と呼ばれるように、祝福と呪いの両方です。問題は、「見て」いる場合です。定義される前の値では、この空のハッシュがスロットに残っているため、後でそれを取り除く必要があります。
少し無秩序を気にしないのであれば、クエリするときに期待される構造を構築できるようにするために、常にor-equalsスタイル宣言でジャムすることができます:
((h ||= { })['w'] ||= { })['z']
所属していません StackOverflow