Как мне реализовать Hash # all?для многомерных хешей? - PullRequest
1 голос
/ 14 декабря 2011

Учитывая, что у меня есть эти хэши:

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?

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011
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 голосов
/ 14 декабря 2011
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? также принимает блок?

...