Ваш первый пример определяет два метода экземпляра и делает их также доступными как методы класса (или модуля) через 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
.