Ответ 1
Этого будет достаточно
(hash1.to_a - hash2.to_a).empty?
Я использую 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"?
Этого будет достаточно
(hash1.to_a - hash2.to_a).empty?
Самый простой способ, который я могу представить, это:
hash2.values_at(*hash1.keys) == hash1.values
более элегантным способом является проверка равенства, когда один хэш объединяет другой.
например. переписать Hash включить? метод экземпляра для этого.
class Hash
def include?(other)
self.merge(other) == self
end
end
{:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true
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
Я не уверен, понимаю ли я идею включения в хэш. Чтобы увидеть, есть ли у него одинаковые клавиши (обычная проблема). Все ключи в hash1 включены в hash2: hash1.keys - hash2.keys == []
Затем, если вы хотите сравнить эти значения, как показано в предыдущем сообщении: hash1.values - hash2.values_at (* hash1.keys) == []