如何在类中运行方法时记录消息?

时间:2012-07-18 12:35:08

标签: ruby logging instance-variables self

我写了以下代码。当我运行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

2 个答案:

答案 0 :(得分: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

如果您有兴趣,我可以在不同的变量范围here上找到更长的答案。

答案 1 :(得分:0)

您必须创建班级的新对象。 执行此操作时,将调用initialize

否则@logger将不会被初始化。

hello = Hello.new
hello.run