Ruby 使用方括号表示法访问变量哈希深度值

Ruby 使用方括号表示法访问变量哈希深度值,ruby,hash,Ruby,Hash,考虑到这个散列: hash1= { node1: { node2: { node3: { node4: { node5: 1 } } } } } 我们使用方括号访问内部节点,如下所示: hash1[:node1][:node2][:node3][:node4] 现在我有一个哈希,我知道它总是嵌套的,因为它是来自SOAP Web服务的XML响应,但是哈希的深度和节点的名称都不相同。因此,如果我可以向应用程序的用户询问哈希深度并将其存储在变量中,那就太好了。然后能够执行hash1[:hash\u

考虑到这个散列:

hash1= { node1: { node2: { node3: { node4: { node5: 1 } } } } }
我们使用方括号访问内部节点,如下所示:

hash1[:node1][:node2][:node3][:node4]
现在我有一个哈希,我知道它总是嵌套的,因为它是来自SOAP Web服务的XML响应,但是哈希的深度和节点的名称都不相同。因此,如果我可以向应用程序的用户询问哈希深度并将其存储在变量中,那就太好了。然后能够执行
hash1[:hash\u depth]
并获得与上述相同的结果

我通过以下代码实现了我想要的:

str = 'node1,node2,node3,node4'
str_a = str.split(',')
hash_copy = hash1
str_a.each { |s| hash_copy = hash_copy.[](s.to_sym) }
hash_copy
=> {:node5=>1}
hash1[:node1][:node2][:node3][:node4]
=> {:node5=>1}
也就是说,要求用户输入以逗号分隔的哈希深度,将其存储在字符串中,拆分它,生成一个数组,克隆原始哈希,向下移动每一级并修改哈希,直到到达所需的节点。是否有一种方法可以使用方括号表示法并使用变量存储深度,而无需修改哈希或克隆哈希

编辑: 有人回答如下(再也看不到他的帖子了??)


尽管
eval
做了您需要的一切,但还有另一种方法,因为您已经有了逗号分隔列表的工作代码:

hash_depth="[:node1][:node2][:node3][:node4]"
csh = hash_depth.gsub(/\A\[:|\]\[:|\]\Z/, { '][:' => ',' })
#⇒ "node1,node2,node3,node4"

现在,您可以自由地将现有功能应用于
csh

如果这是一个webapp,我认为您应该准备一个短文本区域列表,从单个文本项开始,用户可以通过单击按钮不断向列表中添加新项。这些区域将由用户填写并发送

然后,您可能会通过某种序列化形式收到此消息。对其进行解码以获得字符串数组:

str_a = ["node1", "node2", "node3", "node4"]
您可以通过以下操作到达内部元素:

str_a.inject(hash1){|h, s| h[s.to_sym]} #=> {:node5 => 1}

在肯定句中使用
“哈希深度或节点名称保持不变”是不符合语法的。你的意思是它们不一样,换句话说,它们都不一样吗?@sawasorry英语不是我的第一语言。我编辑了我的帖子,希望这两个都没有,希望它现在有意义,语法也正确?如果不纠正我,请。您的编辑使该部分正常。你的措辞“散列深度”具有误导性。你的意思似乎是“一系列散列键”。如果你觉得其中任何一个有用,不要忘记选择一个答案。这不是我要求的,但如果我希望用户以红宝石方括号表示法输入散列深度,而不仅仅是用逗号分隔的节点名称,这将非常有用。谢谢你你认为这个答案可以用
Hash#dig
改进吗?
str_a.inject(hash1){|h, s| h[s.to_sym]} #=> {:node5 => 1}