1

次のコードを書きました。実行するHello.runとメッセージをログに記録したいのですが、これは機能しません。

なぜこれが機能しないのですか?

class Hello
  def initialize
    @logger = Logger.new STDOUT
  end

  def self.run
    self.new
    @logger.warn 'Hello'
  end
end

Hello.run

これは、実行時に表示されるエラーメッセージです。Hello.run

NoMethodError: private method `warn' called for nil:NilClass
4

2 に答える 2

2

コンストラクターで設定する@logger変数はインスタンス変数でありself.run、クラスメソッドです。

インスタンス変数はクラスメソッドでは使用できないため、を実行しているときは、クラスの内部インスタンス変数Hello.runにアクセスできません。Hello

ロガーをクラス全体にしたい場合は、次のようにクラス変数として定義できます。

class Hello
  def initialize
    @@logger ||= Logger.new(STDOUT)
  end

  def self.run
    self.new # I don't get why you just create a new instance and throw it away
    @@logger.warn("Hello")
  end
end

興味があれば、ここでさまざまな変数スコープについてもっと長い答えがあります。

于 2012-07-18T12:43:07.860 に答える
0

クラスの新しいオブジェクトを作成する必要があります。これを行うと、これinitializeが呼び出されます。

それ以外の場合@loggerは初期化されません。

hello = Hello.new
hello.run
于 2012-07-18T12:46:21.857 に答える