当我在类方法中调用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
,通过这个方法,我可以指定我的构建方法要使用哪个模板。