2015-10-27 34 views
1

循环在具有特定键值对的文本文件上运行三次。每个循环都会返回一个新的哈希,它将打印在下面我想将这些散列存储到另一个散列中。 group1group2group3是哈希键:无法在Ruby中创建散列哈希

"group1" 
{ 
    "path"=>"/tmp/", 
    "max_hits"=>262144, 
    "min_hits"=>5240 
} 

"group2" 
{ 
    "basic_size_limit"=>262144, 
    "path"=> "/usr/bin/ruby", 
    "max_hits"=>2412, 
    "min_hits"=>871 
} 

"group3" 
{ 
    "path"=>"/usr/tmp/", 
    "basic_time_limits"=>[26214400, 26214401, 26214402], 
} 

我初始化上述哈希作为groups = Hash.new,而不是我想将它们存储到哈希散列。我想初始化更大的哈希像group_of_groups = Hash.new{|hash, key| hash[key] = Hash.new}

group_of_groups = Hash.new{|hash, key| hash[key] = Hash.new} 
Loop i in 1 .. 3 
    groups = Hash.new 
    #### 
     Do something and add to the hash groups 
    #### 
    key_name = "group" + i 
    group_of_groups[key_name] = groups 
end Loop 

但它只是给了我{"group1"=>{}, "group2"=>{}, "group3"=>{}}

如何解决这个问题?

+1

目前还不清楚重视你已经离开。个人散列中的3个群体是否是变量?请编辑以显示更多真实的Ruby代码并展示这3个哈希的源代码(我也看到''path'=“/ usr/bin/ruby​​”'带有不正确的运算符'='而不是'=>') –

+0

这些是我印刷的三种不同的哈希值。我纠正了'='n'=>'的错误。我在这里提供更多信息 –

+0

我明白它们是3种不同的哈希值,但它们是以变量存储的,还是以Array的形式存储? –

回答

3

如果你有3个变量组1的3个哈希值,组2,&组3,你可以做一个哈希值,像这样的哈希值:

group1 = { 
    "path"=>"/tmp/", 
    "max_hits"=>262144, 
    "min_hits"=>5240 
} 

group2 = { 
    "basic_size_limit"=>262144, 
    "path"=> "/usr/bin/ruby", 
    "max_hits"=>2412, 
    "min_hits"=>871 
} 

group3 = { 
    "path"=>"/usr/tmp/", 
    "basic_time_limits"=>[26214400, 26214401, 26214402], 
} 

group_of_groups = {"group1"=>group1, "group2"=>group2, "group3"=>group3} 

# result 
{ 
    "group1" => { 
     "path"=>"/tmp/", 
     "max_hits"=>262144, 
     "min_hits"=>5240 
    }, 
    "group2" => { 
     "basic_size_limit"=>262144, 
     "path"=> "/usr/bin/ruby", 
     "max_hits"=>2412, 
     "min_hits"=>871 
    }, 
    "group3" => { 
     "path"=>"/usr/tmp/", 
     "basic_time_limits"=>[26214400, 26214401, 26214402], 
    }, 
} 

请记住,一切都在Ruby是通过引用,所以修改group_of_groups内部的散列也将修改原始散列。

+1

您的回答给了我解决方案的提示。我实际上是在每个循环结束时清除哈希,因此它结束了,但由于通过引用传递而在各处被删除! –

2

如果你想一次初始化一切,你可以写为:

group_of_groups = { 
    "group1" => { 
     "path"=>"/tmp/", 
     "max_hits"=>262144, 
     "min_hits"=>5240 
    }, 
    "group2" => { 
     "basic_size_limit"=>262144, 
     "path"=> "/usr/bin/ruby", 
     "max_hits"=>2412, 
     "min_hits"=>871 
    }, 
    "group3" => { 
     "path"=>"/usr/tmp/", 
     "basic_time_limits"=>[26214400, 26214401, 26214402], 
    } 
} 

换行符弄清楚什么是属于什么,但不是必需的。

0

除了其他的答案,你也可以做到这一点,如果你需要以编程方式生成散列:

group1 = { 
    "path"=>"/tmp/", 
    "max_hits"=>262144, 
    "min_hits"=>5240 
} 

group2 = { 
    "basic_size_limit"=>262144, 
    "path"=> "/usr/bin/ruby", 
    "max_hits"=>2412, 
    "min_hits"=>871 
} 

group3 = { 
    "path"=>"/usr/tmp/", 
    "basic_time_limits"=>[26214400, 26214401, 26214402], 
} 

group_of_groups = 
    ["group1", "group2", "group3"].each_with_object({}) do |sub_hash_name, new_hash| 
     new_hash[sub_hash_name] = instance_eval(sub_hash_name) 
    end 

# Result 
{ 
    "group1" => { 
     "path"=>"/tmp/", 
     "max_hits"=>262144, 
     "min_hits"=>5240 
    }, 
    "group2" => { 
     "basic_size_limit"=>262144, 
     "path"=> "/usr/bin/ruby", 
     "max_hits"=>2412, 
     "min_hits"=>871 
    }, 
    "group3" => { 
     "path"=>"/usr/tmp/", 
     "basic_time_limits"=>[26214400, 26214401, 26214402], 
    }, 
} 
+1

在这种情况下使用eval是不合适或不可取的。 – Gravatite

+0

@Gravatite因为它很脆弱 - 如果有人决定更改局部变量的名称,他们可能不知道更改数组的字符串值? – josiah

+1

有两个原因。首先,Ruby支持正确的反射,所以没有理由使用eval来获取变量。第二个问题更多的是一个哲学问题,因为eval通常会导致各种来自安全漏洞的恶果,难以诊断错误和所有其他问题。快速的谷歌搜索应该提供更多深入的文章,介绍何时适合使用eval。 – Gravatite