0

私は以下のようなコードを持っています:

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 methodLogger:Class (NoMethodError) に対して呼び出された in new'

私はRubyバージョンを使用しています:

ruby 1.8.6 (2009-08-04 パッチレベル 383) [x86_64-linux]

4

1 に答える 1

3

Module: Singletonのドキュメントを見てみましょう。モジュールを含めると、initializeメソッドをプライベートにすることで、クラスのインスタンスを 1 つだけ作成できるようになります。したがって、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 に答える