Подтвердить что ты не робот

Как сделать экземпляр объекта хеш-ключом в Ruby?

У меня есть класс Foo с несколькими переменными-членами. Когда все значения в двух экземплярах класса равны, я хочу, чтобы объекты были "равны". Я хотел бы, чтобы эти объекты были ключами в моем хеше. Когда я в настоящее время пытаюсь это сделать, хеш рассматривает каждый экземпляр как неравный.

h = {}
f1 = Foo.new(a,b)
f2 = Foo.new(a,b)

f1 и f2 должны быть равны в этой точке.

h[f1] = 7
h[f2] = 8
puts h[f1]

должен печатать 8

4b9b3361

Ответ 1

См. http://ruby-doc.org/core/classes/Hash.html

В Hash используется key.eql? проверять ключи для равенство. Если вам нужно использовать экземпляры ваших собственных классов как ключей в Hash, рекомендуется определить как eql? и хэш-методы. Хэш метод должен обладать тем свойством, что a.eql? (b) подразумевает a.hash == b.hash.

Выражение eql? метод прост в реализации: return true, если все переменные-члены одинаковы. Для хэш-метода используйте [@data1, @data2].hash, как предлагает Марк-Андре в комментариях.

Ответ 2

Добавьте метод, называемый хэш, в ваш класс:

class Foo
  def hash
    return whatever_munge_of_instance_variables_you_like
  end
end

Это будет работать так, как вы просили, и не будет генерировать разные хеш-ключи для разных, но идентичных объектов.