tags:

views:

48

answers:

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
+4  A: 

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
Andreas
thanks... that makes sense. I chose to implement it slightly different... see above :)
Alex Baranosky
You're right. It's doing the same, but looks nicer, especially with many attributes (less duplication).
Andreas
+1  A: 

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