расширить себя в модуле - PullRequest
       2

расширить себя в модуле

1 голос
/ 05 апреля 2019

Кажется, что эти две части кода выполняют одну и ту же работу, но я хотел бы понять, почему я предпочел бы использовать ту или иную

Первый пример:

module MyModule 
  extend self

  def first_method
  end

  def second_method
  end

end

Второй пример:

module MyModule 

  def self.first_method
  end

  def self.second_method
  end

end

1 Ответ

7 голосов
/ 05 апреля 2019

Ваш первый пример определяет два метода экземпляра и делает их также доступными как методы класса (или модуля) через extend:

module MyModule 
  def first_method; end
  def second_method; end
end

MyModule.instance_methods         #=> [:second_method, :first_method]
MyModule.methods - Module.methods #=> []

MyModule.extend MyModule

MyModule.instance_methods         #=> [:second_method, :first_method]
MyModule.methods - Module.methods #=> [:second_method, :first_method]

В то время как ваш второй пример просто определяет два метода класса (или модуля), а не методы экземпляра:

module MyModule 
  def self.first_method; end
  def self.second_method; end
end

MyModule.instance_methods         #=> []
MyModule.methods - Module.methods #=> [:second_method, :first_method]

Первый вариант может быть полезен, если вы хотите предоставить некоторые служебные функции, которые можно вызвать как:

MyModule.first_method

или быть включенным в другие модули / классы:

class Foo
  include MyModule

  def another_method
    first_method     # <- no explicit receiver needed
  end
end

Ruby также предоставляет вспомогательный метод module_function для определения методов таким образом:

module MyModule
  def first_method
  end
  module_function :first_method
end

Он добавляет метод в качестве методов класса и делает метод экземпляра закрытым . Так работают методы в Kernel.

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