开发者

How can a class method (inside a module) update an instance variable?

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 variabl开发者_开发技巧e from here??
puts m.temp     # => nil


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


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 :)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜