4

名前がキーで値が「age」と「hobby」のキーを持つハッシュであるpersonというハッシュがあるとします。ハッシュパーソンのエントリは次のようになります

=> person["some_guy"] = {:hobby => "biking", :age => 30}

ハッシュ「person」のデフォルトを指定するにはどうすればよいですか?私は以下を試しました

=> person.default = {:hobby => "none", :age => 20}

しかし、それは機能しません。

編集:

私は1つの属性を設定し、他の属性が自動入力されることを期待していました。たとえば。

=> person["dude"][:age] += 5

これが私が見ていたものです

=> person["dude"]
=> {:hobby => "none", :age => 25}

大丈夫です。ただし、personプロンプトで入力すると、空のハッシュが表示されます。

=> person
=> {}

しかし、私が期待していたのは

=> person
=> {"dude" => {:hobby => "none", :age => 25}}
4

3 に答える 3

7

なぜそれがあなたのために働かないかもしれないか

オブジェクトにメソッドがない場合、Hash#defaultを呼び出すことはできません。person.is_a? Hashそれが機能する前にそれを確認する必要があります。代わりに配列がないのですか?

また、ハッシュのデフォルトでは何も入力されないことにも注意してください。キーが欠落しているときに返される値です。キーを作成する場合でも、値を入力する必要があります。

なぜそれが私のために働くのか

# Pass a default to the constructor method.
person = Hash.new({hobby: "", age: 0})
person[:foo]
=> {:hobby=>"", :age=>0}

# Assign a hash literal, and then call the #default method on it.
person = {}
person.default = {hobby: "", age: 0}
person[:foo]
=> {:hobby=>"", :age=>0}

あなたがおそらく欲しいもの

ハッシュのデフォルトは欠落しているキーにのみ適用され、欠落している値には適用されないため、ハッシュのハッシュを設定する場合は、別のアプローチをとる必要があります。1つのアプローチは、ブロックをハッシュコンストラクターに渡すことです。例えば:

person = Hash.new {|hash,key| hash[key]={hobby: nil, age:0}}
=> {}

person[:foo]
=> {:hobby=>nil, :age=>0}

person[:bar]
=> {:hobby=>nil, :age=>0}

person
=> {:foo=>{:hobby=>nil, :age=>0}, :bar=>{:hobby=>nil, :age=>0}}
于 2012-06-06T00:15:39.913 に答える
2

デフォルト値を.newメソッドに渡すことにより、インスタンス化時にハッシュのデフォルト値を指定できます。

person = Hash.new({ :hobby => '', :age => 0 })
于 2012-06-05T23:38:07.970 に答える
0

を使用Hash#default_procして、デフォルト値でハッシュを動的に初期化できます。

h = Hash.new
h.default_proc = proc do |ハッシュ、キー|
  hash [key] = hash.new(0)ただし、hash.include?鍵
終わり
h [0] [0]#=> 0
h [1] [0]#=> 0
h [0] [0] = 1
h [0] [0]#=> 1
h [1] [0]#=> 0
于 2016-02-19T11:34:20.460 に答える