Рубин типичный эккл? и == реализации

Я читал о различиях между 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
6
задан Jeff Storey 28 June 2012 в 02:24
поделиться