最初看到attr_accessor 觉得很神奇。其实实现并没有很复杂,一言概之就是用了 define_method方法来定义一个方法。元编程的一种实现。

class User
  def self.setup_accessor var
    define_method var do
      instance_varialble_get "@#{var}"
    end

    define_method "#{var}=" do |value|
      instance_variable_set "@#{var}", value
    end
  end

  setup_accessor :name
  setup_accessor :age

  def initialize name, age
    @name = name
    @age = age
  end

end

Ruby 中关于类的操作基本都是方法,几乎不会直接操作实例变量。 元编程+插值字符串 在运行时生成各种方法。