"base.send: include, InstanceMethods" ---> Что это делает?

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

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

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

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

Ответ 1

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

Он также мог быть

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

Ответ 2

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

base.send :include, InstanceMethods

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

base.include(InstanceMethods)

Что добавляет методы в модуле InstanceMethods к объекту "base"

Ответ 3

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