class MyClass
def self.tracked_attr(name)
@tracked_attributes ||= []
@tracked_attributes << name
define_method(:"#{name}") do
puts "Accessing #{name}"
instance_variable_get(:"@#{name}")
end
define_method(:"#{name}=") do |value|
puts "Assigning #{name} with #{value}"
instance_variable_set(:"@#{name}", value)
end
end
end
class MySubClass < MyClass
tracked_attr :my_attribute
end
obj = MySubClass.new
obj.my_attribute = 42
puts obj.my_attribute
关键元编程方法解释
- define_method:这是Ruby元编程中非常重要的方法。它允许在运行时动态地定义实例方法。在上述代码中,通过
define_method(:"#{name}")
定义了读取属性的方法,通过define_method(:"#{name}=")
定义了设置属性的方法。这种方式使得可以在类定义之外,根据需要动态生成方法。
- instance_variable_get 和 instance_variable_set:用于在实例中动态获取和设置实例变量。通过
instance_variable_get(:"@#{name}")
获取名为@name
的实例变量值,通过instance_variable_set(:"@#{name}", value)
设置名为@name
的实例变量值为value
。这两个方法在动态生成的属性访问和赋值方法中起到关键作用,使得能够像常规属性访问那样操作实例变量。
- 类方法 self.tracked_attr:定义在
MyClass
类中的类方法,在子类MySubClass
中可以调用此方法来定义追踪属性。这个类方法负责收集被追踪的属性名,并为每个属性动态生成访问和赋值方法。它利用了Ruby的类是对象这一特性,使得可以在类对象上定义方法,从而控制类的行为。