2016-11-05 78 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