Ruby 2.6+
Ruby's a présenté difference
en 2.6.
Cela donne une solution très rapide et très lisible ici, comme suit :
a = [1, 2, 3, 4, 5, 6]
b = [1, 2, 3, 4, 5, 6]
a.difference(b).any?
# => false
a.difference(b.reverse).any?
# => false
a = [1, 2, 3, 4, 5, 6]
b = [1, 2, 3]
a.difference(b).any?
# => true
Cependant, l'inverse n'est pas vrai :
a = [1, 2, 3]
b = [1, 2, 3, 4, 5, 6]
a.difference(b).any?
# => false
Cela signifie que pour obtenir la différence dans les deux sens, il est nécessaire de courir :
a.difference(b).any? || b.difference(a).any?
Exécution des tests de référence :
a = Array.new(1000) { rand(100) }
b = Array.new(1000) { rand(100) }
Benchmark.ips do |x|
x.report('sort') { a.sort == b.sort }
x.report('sort!') { a.sort! == b.sort! }
x.report('to_set') { a.to_set == b.to_set }
x.report('minus') { ((a - b) + (b - a)).empty? }
x.report('difference') { a.difference(b).any? }
x.report('difference two way') { a.difference(b).any? || b.difference(a).any? }
end
sort 10.175k (± 6.2%) i/s - 50.778k in 5.015112s
sort! 10.513k (± 6.8%) i/s - 53.212k in 5.089106s
to_set 4.953k (± 8.8%) i/s - 24.570k in 5.037770s
minus 15.290k (± 6.6%) i/s - 77.520k in 5.096902s
difference 25.481k (± 7.9%) i/s - 126.600k in 5.004916s
difference two way 12.652k (± 8.3%) i/s - 63.232k in 5.038155s
Ce que je retiens, c'est que difference
est un excellent choix pour un différentiel unidirectionnel.
Si vous devez vérifier dans les deux sens, c'est un équilibre entre les performances et la lisibilité. Pour moi, la lisibilité l'emporte, mais c'est une décision à prendre au cas par cas.
J'espère que cela aidera quelqu'un !