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