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 回答