2016-11-05 71 views
0

考慮下面的Ruby代碼:在Ruby中的單例類中調用單例方法?

module MyModule 
    class << self 

    def process_item(item) 
     item.capitalize 
    end 

    def foo=(item) 
     @foo_ref=process_item(item) 
    end 

    def foo 
     @foo_ref 
    end 

    self.foo = "initial foo" 
    end 
end 

我想設置的單類定義默認foo_ref變量。如果我改變self.foo = "Initial foo"foo = "Initial foo"然後我創建了單獨的類中的局部變量,而不是調用setter方法

singleton class': undefined method `foo=' for #(NoMethodError)

:但是,Ruby解釋引發了以下錯誤。

此外,我意識到我可能必須將process_item方法放在單元類定義之外的模塊定義中,以便它不會成爲單例方法,而是輔助方法。

該代碼的正確方法是什麼(能夠在單例類定義中調用單例方法,並且在單例類定義中使用輔助方法)?

+0

在類定義中,'self'是類,所以就像錯誤消息所說的那樣,您正在對單例類調用'foo ='方法,並且此方法不存在。 –

回答

1

您可以定義默認值:

module MyModule 
    class << self 

    def process_item(item) 
     item.capitalize 
    end 

    def foo=(item) 
     @foo_ref=process_item(item) 
    end 

    def foo 
     @foo_ref ||= "initial foo" 
    end 
    end 
end 

你所試圖做的是爲foo設置爲單例類,而不是設置FOO的類。

+0

事實上,將'foo_ref'實例變量設置爲初始值是一個不錯的解決方案。謝謝! 是否有任何其他方式從類定義中設置此變量(訪問元類而不是單例類)? – NickJaremek

+0

你也可以使用'self.foo ='來形成'MyModule'範圍。 (在'class << self'定義之後) –

+0

看起來非常明顯!非常感謝你幫助我:D – NickJaremek

相關問題