类方法(在模块内)如何更新实例变量?考虑下面的代码:
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
答案 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
如果您还希望更改已创建的实例变量,则需要额外的魔法。请准确解释您希望完成的任务。你可能做错了:))