Question

I'm writing a Ruby class, and want to override the == method. I want to say something like:

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

How can I do this without making both times and frequencies publicly viewable?

FOLLOW UP:

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
Was it helpful?

Solution

If you set times and frequencies accessors to protected, they'll be only accessible from instances of that class and descendants (which should be ok, since descendants can access the instance variables anyway and should know how to handle it correctly).

class ReminderTimingInfo

  # …

protected
  attr_reader :times, :frequencies

end

OTHER TIPS

You could do

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

But somehow I suspect that that's missing the point!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top