Определение метода внутри модуля в 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 как функцию модуля. Он напрямую вызывается и не появляется в включенных классах, когда модуль перемещается в другой класс.