Создание метода equals без необходимости делать частные поля открытыми - PullRequest
2 голосов
/ 06 августа 2010

Я пишу класс Ruby и хочу переопределить метод ==.Я хочу сказать что-то вроде:

class ReminderTimingInfo
   attr_reader :times, :frequencies #don't want these to exist

   def initialize(times, frequencies)
      @times, @frequencies = times, frequencies
   end

   ...

   def ==(other)
      @times == other.times and @frequencies == other.frequencies
   end
end

Как я могу сделать это, не публикуя время и частоту для общего просмотра?

СЛЕДУЙТЕ ЗА:

class ReminderTimingInfo

  def initialize(times, frequencies)
    @date_times, @frequencies = times, frequencies
  end

  ...

  def ==(other)
    @date_times == other.times and @frequencies == other.frequencies
  end

  protected

  attr_reader :date_times, :frequencies
end

Ответы [ 2 ]

4 голосов
/ 06 августа 2010

Если вы установили доступ к времени и частоте для защищенных, они будут доступны только из экземпляров этого класса и потомков (что должно быть в порядке, поскольку потомки могут в любом случае обращаться к переменным экземпляра и должны знать, как правильно их обрабатывать).

class ReminderTimingInfo

  # …

protected
  attr_reader :times, :frequencies

end
2 голосов
/ 07 августа 2010

Вы могли бы сделать

  def ==(other)
    @date_times == other.instance_eval{@date_times} and @frequencies == other.instance_eval{@frequencies}
  end

Но почему-то я подозреваю, что упускает смысл!

...