2013-08-10 3 views
0

У меня есть код, как показано ниже:Singleton использования регистратора в рубине

require 'logger' 
require 'singleton' 

class Logger 
    include Singleton 
    @@old_initialize = Logger.instance_method :initialize 

    def initialize 
     @@old_initialize.bind(self).call(STDERR) 
    end 
end 

class MyClass 
    def initialize 
     @logger = Logger.new("output.log") 
    end 
end 

я получаю следующее сообщение об ошибке при запуске MyClass.

в initialize': private method новый»призвал Logger: Класс (NoMethodError)

Я использую Рубин Версия:

рубин 1.8.6 (2009-08-04 383 номера патчей) [x86_64-linux]

+0

В чем вопрос? (TM) – sawa

+0

Вопрос: «Почему я получаю NoMethodError»? Можете ли вы помочь в разрешении? – user2562153

+0

Не называйте 'new'? Вместо этого используйте ': send', но убедитесь, что вы на самом деле хотите это сделать, и это не нарушает все остальное? Не делайте это синглтон, где вызов 'new' не имеет никакого смысла, потому что может быть только один? –

ответ

3

Посмотрим на документацию Module: Singleton. Включение модуля гарантирует, что только один экземпляр вашего класса может быть создан путем использования метода initialize. Следовательно, вы получаете ошибку NoMethodError - new is private. Далее он говорит:

Экземпляр создается при при первом вызове Klass.instance().

Таким образом, вместо .new вы делаете вызов .instance

class MyClass 
    def initialize 
    @logger = Logger.instance() 
    end 
end 

Теперь вы можете вызвать MyClass.new и он будет возвращать ваш объект лесоруба. Таким образом, вы не можете передать дополнительный параметр. Итак, вопрос здесь в том, почему в первую очередь должен быть Синглтон?

+0

Все, что мне нужно, это создать/использовать функцию регистрации в моей базе кода. Мы никогда не пробовали это раньше. Мое приложение работает в пакетном режиме и взаимодействует с 10-15 классами. Я хотел использовать logger, и я где-то натолкнулся на приведенный выше код, создав singleton logger. Я не уверен, что мне нужен синглтон или нет. Мне нужно создать средство ведения журнала во всех классах моего приложения. Любой хороший пример, демонстрирующий пример моей потребности, будет более полезным. ПРИМЕЧАНИЕ. Мне также необходимо регистрировать имя класса, метод и номер строки во время ведения журнала. Как достичь этого? – user2562153

+0

@ user2562153 Затем просто используйте ванильный регистратор, не изменяйте его http://rubylearning.com/satishtalim/ruby_logging.html –

+0

Я посмотрел на регистратор. Мне кажется простым. Но мне нужно сделать собственное ведение журнала с моими собственными уровнями, сообщение с указанием модуля :: module :: class, method и номера строки, из которого произошло конкретное ведение журнала. Могу ли я добиться этого с помощью регистратора? – user2562153

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