2012-07-18 53 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

相關問題