2011-12-13 110 views
1

考虑到我有这些散列:如何实现Hash#all?多维哈希?

h1 = {"a" => { "b" => 1, "c" => {"d" => 2, "e" => 3} } } 
h2 = {"a" => { "b" => 1, "c" => nil } } 

而且我希望这些结果:

h1.multi_all? # true 
h2.multi_all? # false 

我将如何实现multi_all方法?

回答

3
class Hash 
    def multi_all? &block 
    all? do |key, value| 
     if value.is_a?(Hash) 
     value.multi_all?(&block) 
     elsif block == nil 
     value 
     else 
     block[key, value] 
     end 
    end 
    end 
end 
2
class Hash 
    def values_r # recursive values 
    self.values.map do |x| 
     x.is_a?(Hash) ? x.values_r : x 
    end 
    end 
end 

h1.values_r.flatten.all? 

PS:你知道吗all?方法也接受块吗?

+0

还是这样? `class Hash def r_all? self.values.map do | x | x.is_a?(哈希)? x.r_all? :x end.all? 结束 结束` – maprihoda 2011-12-13 20:33:30

+0

您的变体忽略`&block` – 2011-12-13 20:50:11