Я читал о различиях между eql?
и ==
в рубине, и я понимаю, что ==
сравнивает значения, в то время как eql?
сравнивает значение и тип
Согласно рубиновым документам:
Для объектов класса Object, eql? является синонимом ==. Подклассы обычно продолжают эту традицию, но есть и исключения.
Не похоже, что поведение, указанное в документах, автоматически наследуется, а скорее это всего лишь предложение о том, как реализовать эти методы. Означает ли это, что если вы переопределите либо ==
, либо eql?
Тогда вы должны переопределить оба?
В классе Человек
ниже, является ли это типичным способом переопределения eql?
и ==
, где менее ограничительный ==
просто делегирует более ограничительный eql?
(казалось бы, в обратном порядке иметь eql?
делегировать ==
, если ==
было реализовано только для сравнения значений, а не типов).
class Person
def initialize(name)
@name = name
end
def eql?(other)
other.instance_of?(self.class) && @name == other.name
end
def ==(other)
self.eql?(other)
end
protected
attr_reader :name
end