0

我正在尝试编写一个具有一些元编程功能的 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]

4

1 回答 1

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(例如种子 a class_test_accessor,然后根据实例进行修改),请告诉我,我会尽力提供帮助。

于 2013-11-05T19:23:38.123 回答