Явное использование `self` в имени метода в определении класса

Этот код взят из книги Rails Crash Course:

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

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

Идея заключается в том, что подкласс Accessor может создавать методы получения и установки, вызывая accessor метод с именем атрибута, для которого мы хотим сгенерировать методы getter и setter:

class Element < Accessor
  accessor :name
...

Но почему использование self в def self.accessor(attr)?

1 ответ

Решение

Потому что вы хотите определить методы доступа для всех экземпляров класса; Вы не хотите определять их для определенных экземпляров и не определять их для других экземпляров. Следовательно, определение методов доступа - это то, что вы хотите сделать с классом, а не с экземпляром; таким образом accessor должен быть методом класса, а не методом экземпляра. Он будет вызываться в теле класса при использовании.

Другие вопросы по тегам