Próbuję porównać dwa skróty Ruby przy użyciu następującego kodu:
#!/usr/bin/env ruby
require "yaml"
require "active_support"
file1 = YAML::load(File.open('./en_20110207.yml'))
file2 = YAML::load(File.open('./locales/en.yml'))
arr = []
file1.select { |k,v|
file2.select { |k2, v2|
arr << "#{v2}" if "#{v}" != "#{v2}"
}
}
puts arr
Na ekranie wyświetlany jest pełny plik z pliku 2. Wiem na pewno, że pliki są różne, ale skrypt nie wydaje się wychwytywać tego.
Odpowiedzi:
Możesz porównać skróty bezpośrednio dla równości:
Możesz przekonwertować skróty na tablice, a następnie uzyskać ich różnicę:
Dalsze uproszczenie:
Przypisywanie różnicy poprzez strukturę trójskładnikową:
Robi to wszystko w jednej operacji i pozbywa się
difference
zmiennej:źródło
hash1.to_a - hash3.to_a
ihash3.to_a - hash1.to_a
może jednak zwracać niepuste wartościhash1.size == hash3.size
. Część po EDYCJI jest ważna tylko wtedy, gdy skróty mają różne rozmiary..to_a
zakończy się niepowodzeniem, gdy równe skróty mają klucze w innej kolejności:{a:1, b:2} == {b:2, a:1}
=> prawda,{a:1, b:2}.to_a == {b:2, a:1}.to_a
=> fałszflatten
i*
? Dlaczego nie po prostuHash[A.to_a - B.to_a]
?Możesz wypróbować klejnot hashdiff , który umożliwia dokładne porównanie skrótów i tablic w hashu.
Oto przykład:
źródło
got_hash.should eql expected_hash
zeHashDiff.diff(got_hash, expected_hash).should eql []
teraz uzyskać wyjście, które pokazuje dokładnie to, czego potrzebują. Idealny!use_lcs: false
flagi może znacznie przyspieszyć porównania na dużych hasach:Hashdiff.diff(b, a, use_lcs: false)
Jeśli chcesz poznać różnicę między dwoma hashami, możesz to zrobić:
źródło
Railsy wycofują tę
diff
metodę.Aby uzyskać szybką jedną linijkę:
źródło
to_s
.{a:1, b:2} == {b:2, a:1}
=> true,{a:1, b:2}.to_s == {b:2, a:1}.to_s
=> falseMożesz użyć prostego przecięcia tablicy, w ten sposób możesz wiedzieć, co różni się w każdym skrócie.
źródło
Miałem ten sam problem i wysłałem żądanie ściągnięcia do szyn
https://github.com/elfassy/rails/commit/5f3410e04fe8c4d4745397db866c9633b80ccec6
źródło
Jeśli potrzebujesz szybkiej i brudnej różnicy między hashami, która poprawnie obsługuje zero w wartościach, możesz użyć czegoś takiego
źródło
Jeśli chcesz ładnie sformatowanego pliku różnicowego, możesz to zrobić:
A w swoim kodzie:
Chodzi o to, aby użyć niesamowitego drukowania do formatowania i porównywania wyników. Różnica nie będzie dokładna, ale jest przydatna do debugowania.
źródło
... a teraz w formie modułu do zastosowania w różnych klasach kolekcji (między innymi Hash). To nie jest głęboka inspekcja, ale jest prosta.
źródło
Opracowałem to, aby porównać, czy dwa skróty są równe
Użycie:
źródło
Odpowiedź na to pytanie znalazła się w „ Porównaniu skrótów ruby ”. Railsy dodają
diff
metodę do skrótów. To dobrze działa.źródło
a co z konwersją obu hash to_json i porównaniem jako ciągiem znaków? ale pamiętaj o tym
źródło
Oto algorytm do głębokiego porównania dwóch haszów, który również porówna zagnieżdżone tablice:
Realizacja:
źródło
Co powiesz na inne, prostsze podejście:
źródło