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

Ruby 在类中运行方法时,如何记录消息?,ruby,logging,instance-variables,self,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' calle

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

在构造函数中设置的
@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

如果您感兴趣,我有一个关于不同变量作用域的较长答案。

您必须为类创建一个新对象。 执行此操作时,将调用
初始化

否则,
@logger
将不会初始化

hello = Hello.new
hello.run

谢谢,我也会读你较长的答案。似乎我只是需要更好地理解Ruby类和变量作用域。因为
run
方法是一种类方法,所以您的示例不起作用def self.method\u name由
ClassName.method\u name
调用。