Search code examples
rubyaccess-specifier

Making an equals method without needing to make private fields public


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

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