我有以下代码:
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]
答案 0 :(得分:3)
让我们看一下Module: Singleton的文档。包括模块确保通过将initialize
方法设为私有,只能创建一个类的实例。因此,您收到NoMethodError - new is private
错误。进一步说:
实例是在第一次调用
Klass.instance()
时创建的。
而不是.new
,而是拨打.instance
class MyClass
def initialize
@logger = Logger.instance()
end
end
现在您可以调用MyClass.new
,它将返回您的记录器对象。但是,这样,您无法传递其他参数。所以这里的问题确实是,为什么它首先需要成为一个单身人士呢?