在ruby中使用Singleton记录器

时间:2013-08-10 11:15:25

标签: ruby logging

我有以下代码:

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 new'中调用了Logger:Class   (NoMethodError)

我正在使用Ruby版本:

  

ruby​​ 1.8.6(2009-08-04 patchlevel 383)[x86_64-linux]

1 个答案:

答案 0 :(得分:3)

让我们看一下Module: Singleton的文档。包括模块确保通过将initialize方法设为私有,只能创建一个类的实例。因此,您收到NoMethodError - new is private错误。进一步说:

  
    

实例是在第一次调用Klass.instance()时创建的。

  

而不是.new,而是拨打.instance

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

现在您可以调用MyClass.new,它将返回您的记录器对象。但是,这样,您无法传递其他参数。所以这里的问题确实是,为什么它首先需要成为一个单身人士呢?