Определение метода внутри модуля в ruby (NoMethodError)
Я изучаю рубин, я придумываю то, чего не понимаю. Я знаю, что модули в ruby используются для namespacing с помощью :: (или.) И смешивания с директивой include.
Проблема возникает, когда я группирую некоторые методы внутри модуля, не помещая их внутри класса.
Вот пример:
module Familiar
#this will not work
def ask_age
return "How old are you?"
end
#this will work
def Familiar::greeting
return "What up?"
end
end
# this call returns **NoMethodError**
puts(Familiar::ask_age())
# this call works fine
puts(Familiar::greeting())
Почему мне нужно включить пространство имен для определения метода, я уже в пространстве имен Знакомый, почему я должен повторять свое "я" и помещать Знакомое:: приветствие
Вы можете проверить мой пример онлайн по этой ссылке: http://codepad.org/VUgCVPXN
Ответы
Ответ 1
Ruby-документация по модулю отвечает на это в своем вступительном тексте.
Эта форма:
module Familiar
def ask_age
return "How old are you?"
end
end
определяет #ask_age
как метод экземпляра для знакомого. Однако вы не можете создавать экземпляры модулей, поэтому вы не можете напрямую обращаться к их методам экземпляра; вы смешиваете их с другими классами. Методы экземпляров в модулях более или менее недоступны.
Эта форма для сравнения:
module Familiar
def self.ask_age
return "What up?"
end
end
определяет ::ask_age
как функцию модуля. Он напрямую вызывается и не появляется в включенных классах, когда модуль перемещается в другой класс.