我正在尝试编写一个带有一些元编程功能的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]
答案 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
然后修改每个实例)让我知道,我会尽力帮助。