Pytanie Jak sprawdzić, czy skrót jest "całkowicie" zawarty w innym haszowaniu?


Używam Ruby on Rails 3.1.0 i chciałbym sprawdzić, czy hash jest "całkowicie" zawarte w innym hashu i zwrócić boolean wartość.

Powiedzmy, że mam te hashe:

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

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

Chciałbym sprawdzić, czy hash1 jest zawarty w hash2 nawet jeśli w hash2 istnieje więcej wartości niż hash1 (w powyższym przypadku odpowiedź, której szukam, powinna być true)? Czy jest to możliwe do zrobienia używając "tylko jednej linii kodu" \ "metoda Ruby"?


19
2017-09-28 14:26


pochodzenie


Być może możesz połączyć hash1 w hash2 (hash2.merge(hash1)) i zobacz, czy się zmieniło. To bardzo naiwny sposób robienia tego, ale jeśli jest to jedna linia kodu, którą chcesz, to prawdopodobnie najprostszy sposób.


Odpowiedzi:


To wystarczy

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

35
2017-09-28 15:02



Miły. Dlatego dodałem część "Mogę wymyślić" do mojej odpowiedzi ;-) - Michael Kohl
Znakomity! Po prostu spędziłem godzinę bawiąc się zebrać  zawierać?  values_at i przyjaciół ... bez rozsądnego rezultatu. Aby w końcu trafić w tę odpowiedź. Tak prosty. - Kocur4d


Najprostszy sposób, jaki mogę wymyślić, to:

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

3
2017-09-28 14:45





bardziej eleganckim sposobem jest sprawdzenie równości, gdy jeden hash łączy inny.

na przykład przepisać Hash to? metoda instancji dla tego.

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

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

3
2018-02-03 04:31





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

2
2017-09-28 14:34





Nie jestem pewien, czy rozumiem ideę włączenia w haszyszu. Aby sprawdzić, czy ma te same klucze (zwykły problem). Wszystkie klucze w hash1 są zawarte w hash2: hash1.keys - hash2.keys == []

Następnie, jeśli chcesz porównać te wartości, wykonaj sugerowane w poprzednim poście: hash1.values ​​- hash2.values_at (* hash1.keys) == []


0
2017-09-28 15:06