在类定义中明确使用方法名中的`self`

时间:2015-03-06 11:45:01

标签: ruby self class-eval

此代码来自Rails Crash Course书:

class Accessor
  def self.accessor(attr)
    class_eval "
      def #{attr}
        @#{attr}
      end

      def #{attr}=(val)
        @#{attr} = val
      end
    "
  end
end

我们的想法是Accessor的子类可以通过使用我们希望生成getter和setter方法的属性名称调用accessor方法来创建getter和setter方法:

class Element < Accessor
  accessor :name
...

但是,为什么在self使用def self.accessor(attr)

1 个答案:

答案 0 :(得分:3)

因为你想为一个类的所有实例定义访问器;您不希望为某些实例定义它们,也不为其他实例定义它们。因此,定义访问器是你想对类而不是实例做的事情;因此accessor必须是类方法,而不是实例方法。它将在使用时在类体中调用。