在 class 定义的方法名称中显式使用 `self`

Explicit use of `self` in method name in class definition

此代码来自 Rails 速成课程书籍:

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

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

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

class Element < Accessor
  accessor :name
...

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

因为你想为 a class 的所有实例定义访问器;您不想为某些实例定义它们而不想为其他实例定义它们。因此,定义访问器是你想针对 class 而不是实例做的事情;因此 accessor 必须是 class 方法,而不是实例方法。使用时会在class正文中调用。