2013-12-16 3 views
1

Я включаю чей-то модуль, который, кажется, разбит на несколько файлов. Это выглядит примерно так:Способ доступа к ошибкам из модуля?

alfred.rb:

require 'alfred/ui' 

module Alfred 
    <code> 
end 

Alfred/ui.rb:

module Alfred 
    class Logger 
    def info(msg) 
     logger.info msg 
    end 
    end 
end 

Я пытаюсь получить доступ к методу info из моего кода, который имеет require "alfred" наверху, используя этот синтаксис:

Alfred::Logger.info("my message") 

который не работает, d приводит к #<NameError: uninitialized constant Alfred::Logger>.

Во-вторых, я бы хотел, чтобы кто-нибудь мог объяснить , как точно Ruby «конструирует» модуль, который разделен на несколько файлов, подобных этому. Входит ли код от alfred/ui.rb в конце alfred.rb в начале, где находится линия require? Все ли это объединяется каким-то другим способом? Может быть, это даже не имеет значения, но, похоже, это поможет мне обернуть вокруг себя голову.

Полный код модуля, который я использую, - at Github в случае, если кто-либо заинтересован.

Может кто-нибудь объяснить, почему я не могу использовать метод таким образом и что можно сделать, чтобы исправить его?

+0

Я получаю еще одну ошибку 'NoMethodError: undefined method' info 'для Alfred :: Logger: Class'. Откуда вы это делаете? –

+0

, но в guthub repo Я не вижу определения класса 'Logger' внутри модуля' Alfred'. Я использую только 'class LogUI <:: Logger' ... Попробуйте' Alfred :: LogUI.info («мое сообщение») ' –

+0

О, интересно, похоже, класс обновлен с момента последнего его загрузки. Я скачаю последние и дам это, когда я буду дома сегодня вечером. – ebarrere

ответ

0

#info - это метод , то есть он существует только в экземплярах класса Logger. Если вы хотите называть его непосредственно из своего кода, вы должны позвонить Alfred::Logger.new.info "some message", но это кажется немного странным. Обычно этот тип используется внутри библиотеки.

Если бы был определен как метод класса:

module Alfred 
    class Logger 
    def self.info(msg) 
     logger.info msg 
    end 
    end 
end 

тогда вы могли бы назвать это, как вы пытаетесь.

+0

Для вашего кода вы можете попробовать что-то вроде этого: '@my_logger = Alfred :: Logger.new' в верхней части кода, затем всюду do '@my_logger.info« foo! »' –

+0

А, спасибо за объяснение. У меня были методы экземпляра/класса в моей голове. Однако я все еще не могу создать экземпляр регистратора, используя предоставленный вами синтаксис. Я получаю ту же «неинициализированную константу Alfred :: Logger», как и раньше. Есть идеи по этому поводу? – ebarrere

Смежные вопросы