Ruby元编程问题

3

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


不要忘记类也是对象。它们只是具有“Class”类的对象。 - Andrew Grimm
1个回答

3
当您在类定义内调用use_template时,self是类Example。当您调用self.class时,它是Example.classClass。您将实例变量定义为类的类。
class Class
  p @_template
end
# prints :contact_form

你应该只使用self而不是self.class

太棒了,现在我明白了。我只需要记住,这一切都与“self”的上下文有关。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接