Рубиновый вопрос метапрограммирования - PullRequest
3 голосов
/ 09 мая 2011

Когда я вызываю self.class.instance_variable_set("@var", ...) из метода класса, где эта переменная на самом деле хранится?Это на самом классе?На примере этого класса?Кажется, я не могу найти его ни с одним из следующих:

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

Я даже пытался использовать трюк (class << self; self; end), но ничего не могу найти (http://ruby -metaprogramming.rubylearningcom*

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, с помощью которого я могу указать, какой шаблон будет использоваться моим методом сборки.

1 Ответ

3 голосов
/ 09 мая 2011

Когда вы вызываете use_template внутри определения класса, self - это класс Example.Когда вы звоните self.class, это Example.class или Class.Вы определяете переменную экземпляра для класса классов.

class Class
  p @_template
end
# prints :contact_form

Вы, вероятно, должны использовать просто self вместо self.class.

...