views:

38

answers:

2

How can a class method (inside a module) update an instance variable? Consider the code bellow:

module Test

  def self.included(klass)
    klass.extend ClassMethods
  end

  module ClassMethods

    def update_instance_variable
     @temp = "It won't work, bc we are calling this on the class, not on the instance."
     puts "How can I update the instance variable from here??"
    end

  end

end


class MyClass
  include Test
  attr_accessor :temp
  update_instance_variable

end

m = MyClass.new # => How can I update the instance variable from here??
puts m.temp     # => nil
+2  A: 

You'd have to pass your object instance to the class method as a parameter, and then return the updated object from the method.

Brian Driscoll
A: 

That does nto quite make sense. You use the initialize method to set default values.

class MyClass
  attr_accessor :temp

  def initialize
    @temp = "initial value"
  end

end

The initialize method is automatically run for you when you create a new object. When your class declaration is run, there are no, and cannot be any, instances of the class yet.

If you want to be able to change the default values later you can do something like this:

class MyClass
  attr_accessor :temp

  @@default_temp = "initial value"

  def initialize
    @temp = @@default_temp 
  end

  def self.update_temp_default value
    @@default_temp = value
  end

end

a = MyClass.new
puts a.temp
MyClass.update_temp_default "hej"
b = MyClass.new
puts b.temp

prints

initial value
hej

If you also want that to change already created instances' variables you need additional magic. Please explain exactly what you wish to accomplish. You are probably doing it wrong :)

ormuriauga