Search code examples
rubyinstance-variablesattrattr-accessor

How do I set an attr_accessor for a dynamic instance variable?


I dynamically created an instance variable within my class:

class Mine
  attr_accessor :some_var

  def intialize
    @some_var = true
  end

  def my_number num
    self.instance_variable_set "@my_#{num}", num
  end
end

How do I make @my_#{num} now as an attr value?

e.g. I want to be able to do this:

dude = Mine.new
dude.my_number 1
dude.my_1
=> 1

Solution

  • this answer doesn't pollutes the class space, example.. if i do mine.my_number 4 then the other instances of Mine will not get the my_4 method.. this happens because we use the singleton class of the object instead of the class.

    class Mine
      def my_number num
        singleton_class.class_eval { attr_accessor "my_#{num}" }
        send("my_#{num}=", num)
      end
    end
    
    a = Mine.new
    b = Mine.new
    a.my_number 10 #=> 10
    a.my_10 #=> 10
    b.my_10 #=> NoMethodError