Ruby元编程 - 如何通过类方法设置实例的attr_accessor值?

时间:2013-11-05 18:56:24

标签: ruby metaprogramming

我正在尝试编写一个带有一些元编程功能的ruby模块,但我有点困惑。

module MetaModule
  extend ActiveSupport::Concern

  module ClassMethods
    def my_method(attribute)
      # Define an attr_accessor for the original class
      attr_accessor :test_accessor

      # This is clearly wrong, but I don't know what is correct
      self.test_accessor ||= []
      self.test_accessor << attribute
    end
  end
end

class MyClass
  include MetaModule

  my_method :name
  my_method :age
  my_method :city
end

我想要的输出是:MyClass.new.test_accessor => [:name, :age, :city]

1 个答案:

答案 0 :(得分:1)

我认为这里可能会有一些混淆。当然可以构建一个具有所需输出的模块,但最终它看起来像这样

module MetaModule
  extend ActiveSupport::Concern

  module ClassMethods
    def my_method(attribute)
      # Define an attr_accessor for the original class
      @class_test_accessor ||= []
      @class_test_accessor << attribute
    end

    def class_test_accessor
      @class_test_accessor
    end
  end

  def test_accessor
    self.class.class_test_accessor
  end
end

但您可能会注意到,我们最终会添加一个只访问类实例变量的实例方法。因为my_method是一个类方法,所以它的值不会因每个实例而改变。因此,我建议在实例中将其作为self.class.class_test_accessor进行访问。如果还有其他东西你希望用my_method完成(比如种子class_test_accessor然后修改每个实例)让我知道,我会尽力帮助。