鉴于此哈希:
hash1= { node1: { node2: { node3: { node4: { node5: 1 } } } } }
我们使用方括号访问内部节点,如下所示:
hash1[:node1][:node2][:node3][:node4]
现在我有一个哈希,我知道它总是嵌套,因为它是来自SOAP Web服务的XML响应,但是哈希的深度和节点的名称都不相同。因此,如果我可以向应用程序的用户询问散列深度并将其存储在变量中,那就太好了。然后能够hash1[:hash_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}
要求用户输入用逗号分隔的散列深度,将其存储在字符串中,拆分,制作数组,克隆原始散列,然后按下每个级别并修改散列,直到找到所需的节点。有没有办法用方括号表示法并使用变量存储深度而不修改哈希值或需要克隆它?
修改: 有人回答以下内容(再也看不到他的帖子了?)
hash_depth="[:node1][:node2][:node3][:node4]"
eval "hash1#{hash_depth}"
答案 0 :(得分:1)
虽然MyApplication.Interfaces
可以完成您需要的所有操作,但还有另一种方法,因为您已经拥有逗号分隔列表的工作代码:
eval
现在您可以将现有功能应用于hash_depth="[:node1][:node2][:node3][:node4]"
csh = hash_depth.gsub(/\A\[:|\]\[:|\]\Z/, { '][:' => ',' })
#⇒ "node1,node2,node3,node4"
。
答案 1 :(得分:1)
如果这是一个webapp,我认为你应该准备一个简短的textareas列表,它以一个文本项开头,用户可以通过点击一个按钮继续向列表中添加一个新项。这些区域将由用户填写,并将被发送。
然后,你可能会通过一些序列化的形式收到这个。你解码这个来获得一个字符串数组:
<a></a>
你可以通过这样做来达到内部元素:
str_a = ["node1", "node2", "node3", "node4"]