Модули на Ruby

#ruby

#ruby

Вопрос:

Пожалуйста, объясните, почему self используется def self.included (klass) ниже.

 module A
  def self.included(klass)
    puts "A -> #{klass}"
    puts A
    puts self
  end
end

class X
  include A
end
  

Ответ №1:

При написании def self.included вы определяете метод, который является частью одноэлементного класса модуля A. Как правило, одноэлементные методы могут быть вызваны только путем выполнения A.included() но этот одноэлементный метод имеет специальное имя included , которое вызывает вызов интерпретатора Ruby, когда модуль включается в класс.

Обычный метод в модуле (определенный с помощью def foo ) может быть вызван только в том случае, если модуль включается во что-то другое.

Ответ №2:

Вот как вы объявляете метод модуля, который может быть вызван напрямую. Обычно методы, определенные в модуле, можно использовать, только если они включены в другой класс или модуль, как класс X в этом примере.

 module Example
  def self.can_be_called
    true
  end

  def must_be_included
    true
  end
end
  

В этом случае вы увидите следующие результаты:

 Example.can_be_called
# => true

Example.must_be_included
# => NoMethodError: undefined method `must_be_included' for Example:Module
  

self Однако объявленные методы не объединяются с классами или модулями, которые их включают. Таким образом, они предназначены для специального использования.