类方法(在模块内)如何更新实例变量?

时间:2010-08-03 18:59:34

标签: ruby metaprogramming module

类方法(在模块内)如何更新实例变量?考虑下面的代码:

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 个答案:

答案 0 :(得分:2)

您必须将对象实例作为参数传递给类方法,然后从方法中返回更新的对象。

答案 1 :(得分:0)

这没有任何意义。 您可以使用initialize方法设置默认值。

class MyClass
  attr_accessor :temp

  def initialize
    @temp = "initial value"
  end

end

创建新对象时会自动为您运行initialize方法。 当你的类声明运行时,该类没有,也不可能是任何实例。

如果您希望以后能够更改默认值,可以执行以下操作:

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

打印

initial value
hej

如果您还希望更改已创建的实例变量,则需要额外的魔法。请准确解释您希望完成的任务。你可能做错了:))