В большинстве случаев объект, который необходимо сопоставить и / или хэшировать, состоит из переменных-членов, которые являются либо примитивами (целыми числами, строками и т. Д.), Либо сами по себе сопоставимы / хешируемы.В этих случаях этот модуль:
module Hashable
include Comparable
def ==(other)
other.is_a?(self.class) && other.send(:parts) == parts
end
alias_method :eql?, :==
def hash
parts.hash
end
end
может быть просто включен в ваш класс, чтобы позаботиться обо всей занятой работе.Все, что вам нужно сделать, это определить метод "parts", который возвращает все значения, составляющие состояние объекта:
class Foo
include Hashable
def initialize(a, b)
@a = a
@b = b
end
private
def parts
[@a, @b]
end
end
Объекты, построенные таким образом, сравнимы (они имеют <, <=, ==,> =,>,! = и equ?) и они могут быть хеш-ключами.