0

I have the code like below:

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

I am getting following error while running MyClass.

in initialize': private methodnew' called for Logger:Class (NoMethodError)

I'm using Ruby Version:

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

4

1 回答 1

3

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

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

所以不是.new你打电话给.instance

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

现在您可以调用MyClass.new,它会返回您的记录器对象。但是,这种方式不能传递额外的参数。所以这里的问题真的是,为什么它首先需要是一个单例?

于 2013-08-10T12:57:05.740 回答