Подтвердить что ты не робот

Как проверить, полностью ли включен хэш в другой хеш?

Я использую 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"?

4b9b3361

Ответ 1

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

(hash1.to_a - hash2.to_a).empty?

Ответ 2

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

hash2.values_at(*hash1.keys) == hash1.values

Ответ 3

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

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

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

{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true

Ответ 4

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

Ответ 5

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

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