2012-12-25 8 views
5

私はこのコードを持っている:なぜこのRubyのハッシュは私が思ったものではありませんか?

$ze = Hash.new(Hash.new(2)) 

$ze['test'] = {0=> 'a', 1=>'b', 3 => 'c'} 

$ze[5][0] = 'one' 
$ze[5][1] = "two" 

puts $ze 
puts $ze[5] 

をそして、これが出力されます。

{"test"=>{0=>"a", 1=>"b", 3=>"c"}, 5=>{0=>"one", 1=>"two"}} 
{0=>"one", 1=>"two"} 

{"test"=>{0=>"a", 1=>"b", 3=>"c"}} 
{0=>"one", 1=>"two"} 

なぜ出力ではないでしょうか? $ze[5][0] = xxx

+7

グローバル変数を使用しないでください、彼らは醜いです! – Hauleth

答えて

5

あなたはまずセッター$ze[5][]=を呼び出し、$zeのゲッター[]を呼んでいます。 Hash's APIを参照してください。

$zeにキーが含まれていない場合は、Hash.new(2)で初期化したデフォルト値が返されます。

$ze[5][0] = 'one' 
# in detail 
$ze[5] # this key does not exist, 
     # this will then return you default hash. 
default_hash[0] = 'one' 

$ze[5][1] = 'two' 
# the same here 
default_hash[1] = 'two' 

あなたは$zeには何も追加されていませんが、あなたはそのデフォルトのハッシュにキー/値のペアを追加しています。 これもあなたがこれを行うことができる理由です。 $ze[5]と同じ結果になります。

puts $ze[:do_not_exist] 
# => {0=>"one", 1=>"two"} 
+0

ああ!私はあなたがデフォルトのハッシュを変更することさえできることを理解していませんでした。ありがとう。 – Turnsole

1
h = Hash.new(2) 
print "h['a'] : "; p h['a'] 

$ze = Hash.new(Hash.new(2)) 
print '$ze[:do_not_exist] : '; p $ze[:do_not_exist] 
print '$ze[:do_not_exist][5] : '; p $ze[:do_not_exist][5] 

$ze = Hash.new{|hash, key| hash[key] = {}} 
$ze['test'] = {0=> 'a', 1=>'b', 3 => 'c'} 
$ze[5][0] = 'one' 
$ze[5][1] = "two" 
print '$ze : '; p $ze 

実行:

$ ruby -w t.rb 
h['a'] : 2 
$ze[:do_not_exist] : {} 
$ze[:do_not_exist][5] : 2 
$ze : {"test"=>{0=>"a", 1=>"b", 3=>"c"}, 5=>{0=>"one", 1=>"two"}} 
関連する問題