当我调用 self.class.instance_variable_set("@var", ...)
从类方法内部,该变量实际存储在哪里?是在类里面吗?在那个类的实例上?我似乎无法通过以下任何方式找到它:
e = Example.new
e.instance_variables
e.class.class_variables
我什至尝试使用 (class << self; self; end)
技巧,但我找不到任何东西(http://ruby-metaprogramming.rubylearning.com/html/seeingMetaclassesClearly.html)。
这是代码片段(可以按我的需要工作)但我不确定为什么它可以工作:)
module HandyModule
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def use_template(template_name)
self.class.instance_variable_set("@_template", template_name)
end
def build(attributes = {})
template_name = self.class.instance_variable_get("@_template")
# do stuff with the template
end
end
end
class Example
include HandyModule
use_template :contact_form
end
基本上我可以包含这个方便的模块,然后我有一个名为 use_template
的类方法我可以用它指定我的构建方法要使用的模板。
最佳答案
当您在类定义中调用 use_template
时,self
是类 Example
。当你调用self.class
时,它是Example.class
,或者Class
。您将实例变量定义为类的类。
class Class
p @_template
end
# prints :contact_form
您可能应该只使用 self
而不是 self.class
。
关于Ruby 元编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5931067/