2

このSOの回答から、ネストされたハッシュ値をその場で作成できます。

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

したがって、たとえば:

hash = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }
hash['a']['b']['c'] = { 'key' => 'value' }
#=> {'a' => { 'b' => { 'c' => { 'key' => 'value' }}}}

ここまでは順調ですね。

私はこれを必要とする:

hash = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }
hash['a', 'b', 'c'] = { 'key' => 'value' }
#=> {'a' => { 'b' => { 'c' => { 'key' => 'value' }}}}

階層に存在する他のハッシュ値を保持し、必要に応じて新しいハッシュを作成することをお勧めします。

私はルビーのメタプログラミングにかなり慣れていないので、助けていただければ幸いです。

4

2 に答える 2

4

私が望むことを達成するための1つの方法は、同じ自動活性化ハッシュ手法を与えられ、再定義する必要なしHash#[]に、目的の配列の各要素を与えられたハッシュを単純にトラバースすることです。私が考えることができる最も慣用的な方法は、使用することArray#injectです:

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

# array of keys
keys = ['a', 'b', 'c']

# "Injection", a.k.a, "go deeper" ;)
keys.inject(hash) {|h, k|
  h[k]
}['key'] = 'value'   # assign 'value' to 'key' on last/deepest hash

p hash               # {"a"=>{"b"=>{"c"=>{"key"=>"value"}}}}

(構文エラーであるため)とはまったく同じではありませんが、hash['a', 'b', 'c']必要なものを収集します。

于 2013-03-22T02:28:03.163 に答える
1

これは、「階層に存在する他のハッシュ値を保持することを希望する」とはどういう意味かを正確に知らずに、私が得たものに最も近いものです。何らかの理由で、メソッドの戻り値は完全ではありませんが、私は少し疲れすぎて理由を理解できません(理由に関するコメントは大歓迎です)。

class MyH < Hash
  def []= (*keys, value)
    self.merge! keys.reverse.inject(value){|mem,obj| {obj => mem } }
    self
  end
end

hash = MyH.new
# => {}
hash['a', 'b', 'c'] = { 'key' => 'value' }
# => {"key"=>"value"}
hash
# => {"a"=>{"b"=>{"c"=>{"key"=>"value"}}}}
于 2013-03-22T02:02:13.607 に答える