ruby Hash включает еще один хэш, глубокую проверку - PullRequest
6 голосов
/ 30 сентября 2010

Каков наилучший способ сделать такую ​​глубокую проверку:

{:a => 1, :b => {:c => 2, :f => 3, :d => 4}}.include?({:b => {:c => 2, :f => 3}}) #=> true

спасибо

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

Я думаю, я понимаю, что вы имеете в виду из этого одного примера (как-то). Мы проверяем, находится ли каждый ключ в субхеше в суперхеше, а затем проверяем, совпадают ли соответствующие значения этих ключей каким-либо образом: если значения являются хешами, выполните еще одну глубокую проверку, в противном случае проверьте, равны ли значения:

class Hash
  def deep_include?(sub_hash)
    sub_hash.keys.all? do |key|
      self.has_key?(key) && if sub_hash[key].is_a?(Hash)
        self[key].is_a?(Hash) && self[key].deep_include?(sub_hash[key])
      else
        self[key] == sub_hash[key]
      end
    end
  end
end

Вы можете увидеть, как это работает, потому что оператор if возвращает значение: последний оцененный оператор (я не использовал троичный условный оператор, потому что это сделало бы это намного более уродливым и трудным для чтения).

0 голосов
/ 24 июля 2013

Мне нравится этот:

class Hash
  def include_hash?(other)
    other.all? do |other_key_value|
      any? { |own_key_value| own_key_value == other_key_value }
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...