Как сделать экземпляр объекта хеш-ключом в Ruby? - PullRequest
33 голосов
/ 24 февраля 2010

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

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

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

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

следует напечатать 8

Ответы [ 2 ]

57 голосов
/ 24 февраля 2010

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

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

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

0 голосов
/ 24 февраля 2010

Добавьте метод под названием 'hash' в ваш класс:

class Foo
  def hash
    return whatever_munge_of_instance_variables_you_like
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...