module HashRecursive
refine Hash do
def each(recursive=false, &block)
if recursive
Enumerator.new do |yielder|
self.map do |key, value|
value.each(recursive=true).map{ |key_next, value_next| yielder << [[key, key_next].flatten, value_next] } if value.is_a?(Hash)
yielder << [[key], value]
end
end.entries.each(&block)
else
super(&block)
end
end
alias_method(:each_pair, :each)
end
end
using HashRecursive
6 回答
关于我应该添加的顺序,在1.8中,项目将以随机顺序迭代(好吧,实际上是按照Fixnum的散列函数定义的顺序),而在1.9中,它将按照文字的顺序迭代 .
迭代哈希的最基本方法如下:
在散列上调用sort会将其转换为嵌套数组,然后按键对它们进行排序,因此您只需要:
如果你实际上不需要“----”部分,它可以只是:
我的一线解决方案:
hash.each { |key, array| puts "#{key}-----", array }
我觉得这很容易阅读 .
你也可以 refine
Hash::each
所以它将支持 recursive 枚举 . 这是我的Hash::each
(Hash::each_pair
)版本,支持 block 和 enumerator :这里有 examples 的
Hash::each
,有和没有recursive
标志:以下是问题本身的示例:
另请查看我的递归版
Hash::merge
(Hash::merge!
)here .