Как проверить, полностью ли включен хеш в другой хеш? - PullRequest
20 голосов
/ 28 сентября 2011

Я использую Ruby on Rails 3.1.0, и я хотел бы проверить, полностью ли включен хеш в другой хэш, и вернуть логическое значение.

Скажите, что у меня естьэти хэши:

hash1 = {
  :key1 => 'value1',
  :key2 => 'value2',
  :key3 => 'value3'
}

hash2 = {
  :key1 => 'value1',
  :key2 => 'value2',
  :key3 => 'value3',
  :key4 => 'value4',
  :key5 => 'value5',
  ...
}

Я хотел бы проверить, включен ли hash1 в hash2, даже если в hash2 больше значений, чем hash1 (в приведенном выше случаеответ, который я ищу, должен быть true)? Возможно ли сделать это , используя "одну строку кода" \ "метод Ruby" ?

Ответы [ 6 ]

38 голосов
/ 28 сентября 2011

Этого будет достаточно

(hash1.to_a - hash2.to_a).empty?
4 голосов
/ 28 сентября 2011

Самый простой способ, которым я могу придумать, будет:

hash2.values_at(*hash1.keys) == hash1.values
3 голосов
/ 03 февраля 2016

более элегантный способ проверить равенство, когда один хеш объединяет другой.

например, переписать Hash include?метод экземпляра для этого.

class Hash
  def include?(other)
    self.merge(other) == self
  end
end

{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true
2 голосов
/ 28 сентября 2011
class Hash
  def included_in?(another)
    # another has to have all my keys...
    return false unless (keys - another.keys).empty?
    # ..and have the same value for every my key
    each do |k,v|
      return false unless v == another[k]
    end
    true
  end
end

hash1.included_in?(hash2) # => true
hash2.included_in?(hash1) # => false
0 голосов
/ 03 марта 2019

Самое эффективное и элегантное решение, которое я нашел - без промежуточных массивов или избыточных циклов.

class Hash
  alias_method :include_key?, :include?

  def include?(other)
    return include_key?(other) unless other.is_a?(Hash)
    other.all? do |key, value|
      self[key] == value
    end
  end
end

Начиная с Ruby 2.3, вы можете использовать встроенный метод Hash#<=.

0 голосов
/ 28 сентября 2011

Я не уверен, что понимаю идею включения в хэш. Чтобы увидеть, есть ли у него такие же ключи (обычная проблема). Все ключи в hash1 включены в hash2: hash1.keys - hash2.keys == []

Тогда, если вы хотите сравнить эти значения, сделайте, как предложено в предыдущем посте: hash1.values ​​- hash2.values_at (* hash1.keys) == []

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...