2012-03-21 217 views
3

如何散列散列散列?散列散列的红宝石散列

我测试返回

未定义的方法`[]”为零:NilClass(NoMethodError)

任何提示吗?

found = Hash.new() 
x = 1; 

while x < 4 do 
    found[x] = Hash.new() 
    y = 1 

    while y < 4 do 
    found[x][y] = Hash.new() 
    found[x][y]['name1'] = 'abc1' 
    found[x][y]['name2'] = 'abc2' 
    found[x][y]['name3'] = 'abc3' 

    y += 1 
    end 

    x += 1 
end 

found.each do |k, v, y| 
    puts "k : #{k}" 
    puts " : #{v[y['name1']]}" 
    puts " : #{v[y['name2']]}" 
    puts " : #{v[y['name3']]}" 
    puts 
end 
+1

为什么你使用'Hash.new()',而不是仅仅'{}'? – 2012-03-21 17:10:12

+0

@NiklasB。也许OP会将附加参数传递给'Hash#new',并发布简化的代码片段 – galymzhan 2012-03-21 17:16:56

+0

@galymzhan:我很怀疑,看到他手动初始化默认值后。 – 2012-03-21 17:19:02

回答

2

我想你想是这样的:

首先创建数据结构。您需要嵌套散列,因此您需要为每个散列键定义默认值。

found = Hash.new do |hash,key| 
    hash[key] = Hash.new do |hash,key| 
     hash[key] = Hash.new 
    end 
end 

运行搜索

(1..3).each do |x| 
    (1..3).each do |y| 
    found[x][y]['name1'] = 'abc1' 
    found[x][y]['name2'] = 'abc1' 
    found[x][y]['name3'] = 'abc1'  
    end 
end 

然后显示结果

found.each do |x, y_hash| 
    y_hash.each do |y, name_hash| 
    name_hash.each do |name, value| 
     puts "#{x} => #{y} => #{name} => #{value}" 
    end 
    end 
end 
+1

散列不会很好地解构成'(v,y)'。 – 2012-03-21 17:18:09

+0

是的,意识到我发布后,现在编辑 – opsb 2012-03-21 17:27:33

2

您构建hash的方式似乎是功能性的。什么可能会导致该错误是这样的循环:

found.each do |k, v, y| 

Hash#each产生键/值对,所以y将被分配nil,从而导致以下两行的错误。你大概的意思是像

found.each do |x, h1| 
    h1.each do |y, h2| 
    puts h2['name1'] 
    end 
end 

嵌套循环你也应该知道,在Ruby中的计数循环更简洁,你可以写这些类型:

found = Hash.new { |h,k| h[k] = {} } 

1.upto(3) do |x| 
    1.upto(3) do |y| 
    found[x][y] = { 
     'name1' => 'abc1', 
     'name2' => 'abc2', 
     'name3' => 'abc3', 
    } 
    end 
end