开发者

Ruby metaprogramming question

开发者 https://www.devze.com 2023-03-03 15:39 出处:网络
When I call self.class.instance_variable_set(\"@var\", ...) from inside a class method, where is that variable actually stored? Is it on the class itself? On the instance of that class? I can\'t seem

When I call self.class.instance_variable_set("@var", ...) from inside a class method, where is that variable actually stored? Is it on the class itself? On the instance of that class? I can't seem to find it with any of the following:

e = Example.new
e.instance_variables
e.class.class_variables

I even tried using the (class <<开发者_如何学编程; self; self; end) trick but I can't find anything (http://ruby-metaprogramming.rubylearning.com/html/seeingMetaclassesClearly.html).

Here is the code snippet (which works as I need) but I'm not sure why it works :)

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

Essentially I can include this handy module, and then I have a class method called use_template with which I can specify which template to be used by my build method.


When you call use_template inside the class definition, the self is the class Example. When you call self.class, it is Example.class, or Class. You define the instance variable to the class of the classes.

class Class
  p @_template
end
# prints :contact_form

You probably should use just self instead of self.class.

0

精彩评论

暂无评论...
验证码 换一张
取 消