2

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
Andrew Grimm
  • 78,473
  • 57
  • 200
  • 338
Alex Baranosky
  • 48,865
  • 44
  • 102
  • 150

2 Answers2

4

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
Zargony
  • 9,615
  • 3
  • 44
  • 44
2

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!

Andrew Grimm
  • 78,473
  • 57
  • 200
  • 338