def self.attr_accessor(*names)names.each do |name|define_method(name) {instance_variable_get("@#{name}")} # This is the getterdefine_method("#{name}=") {|arg| instance_variable_set("@#{name}", arg)} # This is the setterendend
class Cardef initialize@wheels = 4 # This is an instance variableendend
c = Car.newc.wheels # Output: NoMethodError: undefined method `wheels' for #<Car:0x00000000d43500>
我为什么要告诉你这些?因为我刚刚对named for Namable所做的几乎与attr_accessor对Module所做的完全相同。当你说attr_accessor时,你正在调用一个创建实例方法的类方法(继承自Module)。特别是,它为实例属性创建了一个getter和setter方法,你提供的名称作为参数,这样你就不必自己编写那些getter和setter方法。