2012-07-18 55 views
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 

回答

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较长的答案,如果你有兴趣。

+0

谢谢,我也会阅读你更长的答案。好像我只需要更好地理解Ruby类和可变范围。 – pkhamre 2012-07-18 12:48:35

0

你必须创建你的类的新对象。 当你这样做initialize将被调用。

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

hello = Hello.new 
hello.run 
+1

由于'run'方法是一种类方法,因此您的示例将不起作用。 'ruby中的def self.method_name'由'ClassName.method_name'调用。 – Frost 2012-07-18 13:05:18

+0

你是对的,我没有注意到。 – lukad 2012-07-18 14:26:59

相关问题