Вопрос

Ruby 1.9.2 introduced order into hashes. How can I test two hashes for equality considering the order?

Given:

h1 = {"a"=>1, "b"=>2, "c"=>3}
h2 = {"a"=>1, "c"=>3, "b"=>2}

I want a comparison operator that returns false for h1 and h2. Neither of the followings work:

h1 == h2 # => true
h1.eql? h2 # => true
Это было полезно?

Решение

Probably the easiest is to compare the corresponding arrays.

h1.to_a == h2.to_a

Другие советы

You could compare the output of their keys methods:

h1 = {one: 1, two: 2, three: 3} # => {:one=>1, :two=>2, :three=>3}
h2 = {three: 3, one: 1, two: 2} # => {:three=>3, :one=>1, :two=>2}
h1 == h2 # => true
h1.keys # => [:one, :two, :three]
h2.keys # => [:three, :one, :two]
h1.keys.sort == h2.keys.sort # => true
h1.keys == h2.keys # => false

But, comparing Hashes based on key insertion order is kind of strange. Depending on what exactly you're trying to do, you may want to reconsider your underlying data structure.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top