Ruby Как вызывать методы модуля из класса в одном и том же пространстве имен - PullRequest
0 голосов
/ 10 сентября 2018

Я новичок в Ruby и пытаюсь понять методы модуля в ruby.

module M1
    def comments 
      if @comments
        @comments
      else
        @comments = []
      end
    end

    def add_comment(comment)
       comments << comment
    end

    class Audio

         <<How do i call add_comment or comments >>
         def someMethod
            add_comment "calling module method from class which is in  same namespace or module"
         end

    end

end

Получение следующего исключения, если я вызываю модуль или класс.(неопределенный метод `add_comment 'для M1: Модуль)

1 Ответ

0 голосов
/ 10 сентября 2018

Обычно вы можете скрыть это с помощью lazy initializer :

def comments 
  @comments ||= [ ]
end

Где это заполняет @comments пустым массивом, если он еще не определен.

Это делает метод add_comment избыточным, поскольку вы можете просто сделать:

comments << comment

Без какого-либо посредничества.

Теперь обратите внимание, что метод comments определен как метод mixin, а не как отдельный.Это означает, что он не существует, пока какой-либо другой модуль или класс не вызовет include для этого модуля.

Чтобы сделать его автономным:

def self.comments 
  @comments ||= [ ]
end

Теперь вы можете сделать это:

M1.comments << 'New comment'
...