Вот несколько объяснений:
Из ruby docs .
Модуль - это набор методов и констант.Методы в модуле могут быть методами экземпляра или методами модуля.Методы экземпляра отображаются как методы в классе, когда модуль включен, а методы модуля - нет. И наоборот, методы модуля могут вызываться без создания инкапсулирующего объекта, а методы экземпляра - нет.(См. Module # module_function.)
self.methodname
внутри модуля создает метод модуля.
В этом случае, когда вы вызываете M::helper
, вы фактически делаете M.helper
когда вы смотрите на это с точки зрения разработчика C ++.В данном случае получателем является объект Module (экземпляр модуля встроенного типа ruby).
Другой способ взглянуть на это - понять концепцию получателя, каждый вызов метода состоит из получателя и имени метода(+ опционально params и кодовый блок).Получатель может быть Module object
, Class object
или экземпляром определенного пользователем класса.
Вы можете вызывать методы Module (или Class) только для объекта Module (или Class).Вы можете вызывать любой метод (Module / Class / instance) в экземпляре.
Если вы хотите вызвать метод экземпляра, определенный в модуле, вы должны передать ему приемник с помощью including
этого модуля в некотором классе.и создание его экземпляра.
Так что в этом случае другое решение может быть:
module MM
def helper(param)
puts "hello #{param}"
end
class ReceiverClass
include MM # add helper() to ReceiverClass
end
class C < Struct.new(:param)
def work
ReceiverClass.new.helper(param)
end
end
end
c = MM::C.new("world")
c.work