"base.send: include, InstanceMethods" ---> Что это делает? - PullRequest
11 голосов
/ 10 июня 2009

Я смотрю на модуль X, который содержит два модуля с именами "InstanceMethods" и "ClassMethods".

Последнее определение в модуле X таково:

  def self.included(base)
    base.send :include, InstanceMethods
    base.send :extend,  ClassMethods
  end

Что это делает?

Ответы [ 3 ]

9 голосов
/ 10 июня 2009

included вызывается всякий раз, когда модуль входит в другой модуль или класс. В этом случае он попытается вызвать метод base include для получения методов модуля, переменных и констант из InstanceMethods, добавленных в base, а затем попытается вызвать метод base extend чтобы получить методы экземпляра из ClassMethods, добавленного к base.

Это также могло быть

def self.included( base )
  base.include( InstanceMethods )
  base.extend( ClassMethods )
end
1 голос
/ 10 июня 2009

'send' вызывает свой первый аргумент как метод для объекта, к которому он был вызван, а остальные аргументы передаются в качестве аргументов методу. Так что в этом случае

base.send :include, InstanceMethods

эквивалентно

base.include(InstanceMethods)

, который добавляет методы из модуля InstanceMethods к базовому объекту

0 голосов
/ 10 июня 2009

Определяет метод класса, который принимает параметр "base". Затем он вызывает методы include и extend для base, передавая в качестве аргументов модуль InstanceMethods и ClassMethods соответственно. Вызов include добавит методы экземпляра, определенные в InstanceMethods, к base. Я не знаком с методом extend, но я предполагаю, что он тоже будет делать что-то подобное, но для методов класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...