我正在尝试为SOAP API创建一个更快的解析器,它将把xml转换为散列,并将键与基于YML结构的内存加载模式相匹配。我使用Nori将xml解析为散列:
hash1 = { :key1 => { :@attr1=> "value1", :key2 => { :@attribute2 => "value2" }}}
- (旧的ruby语法保持属性从键清除)*
同时,我有一个常量,它被加载到内存中,并存储了我的操作所需的相关密钥:
hash2 = {:key1 => { :key2 => { :@attribute2 => nil }}}
- (旧的ruby语法保持属性从键清除)*
我需要以最有效的方式将第一个哈希值与第二个哈希值进行匹配。根据我的理解,有几种方法可以做到这一点:
同时迭代两个哈希键,但使用第二个作为原点:
def iterate(hash2, hash1)
hash2.each do |k, v|
if v.is_a? Hash
iterate(hash2[k], hash1[k])
else
hash2[k] = hash1[k]
end
end
end
- (多行语法,¿clear?)*
一些问题浮现在我的脑海:
- 有没有一种更有效的方法来做到这一点,而不必迭代我所有的键?
- 这比直接访问密钥更有效吗?
- 有没有更好的方法在访问者模式中使用hash2将XML解析为散列?
2条答案
按热度按时间o0lyfsai1#
没有迭代的解决方案可以是递归选择:
一般来说,
select
被认为比each
更好,因为它有复杂的选择算法。实际上,两者之间的差异只有20%左右。bq3bfh9z2#
认识到这是一个古老的问题,但我正在寻找一个与模式匹配相关的问题的答案,并认为我应该分享Ruby 3的更新方法:
等等,匹配你需要考虑的各种哈希模式。当块退出时,attr_value将具有匹配属性的值。如果需要知道这是一个attribute2还是attribute3值,可能需要调整它。这也不再需要将这些模式定义为常量,并为代码期望处理的各种形式提供了一个中心位置。