【问题标题】:Ruby hash of hash of hashRuby hash of hash of hash
【发布时间】:2012-03-21 17:08:09
【问题描述】:

我怎样才能得到一个散列的散列?

我的测试返回

nil: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

【问题讨论】:

  • 你为什么用Hash.new()而不是{}
  • @NiklasB。也许 OP 会向Hash#new 传递额外的参数并发布简化的sn-p 代码
  • @galymzhan:我真的很怀疑,看到他之后手动初始化了默认值。

标签: ruby hashmap hash-of-hashes


【解决方案1】:

我想你想要这样的东西:

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

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

【讨论】:

  • 哈希不会很好地分解为(v, y)
【解决方案2】:

您构建哈希的方式似乎很实用。可能导致错误的是这个循环:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多