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
调用。