我正在阅读
Ruby中的Singletons.我从来没有真的需要使用它们,但我很好奇,决定查找它们,看看我以前是否应该使用它们,或者如果我知道他们是什么,我可以在将来使用它们用于.
我唯一可以想到使用的是:
>?当我需要一个特殊的对象.示例:“smart”哈希对象,其行为就像一个普通的Ruby哈希与一些额外的怪癖.
>当我想使它只有一个类的一个实例可以存在.
但是,我并不确定我是否需要上述任一项.
解决方法
请注意,Singleton模块中的类混合在功能上等同于具有’class’方法的类或模块,以及有保证的初始化调用或内联初始化.比较Singleton的这种用法:
require 'singleton' class Bar include Singleton attr_reader :jam def initialize @jam = 42 end def double @jam *= 2 end end b1 = Bar.instance b1.double b2 = Bar.instance b2.double p b1.jam #=> 168
与这个无魔术模块:
module Foo @jam = 42 def self.double @jam *= 2 end def self.jam @jam end end Foo.double Foo.double p Foo.jam #=> 168
在这两种情况下,您都有一个保持状态的全局对象. (因为在全局范围中创建的每个常量,包括类和模块,都是一个全局对象.)
唯一的功能不同之处在于,对于Singleton,您会延迟对象的初始化,直到您第一次要求它为止.
所以,如果您在类或模块上有“类”方法,并且您使用这些方法来更改该对象的状态(例如,一个跟踪所有子类的类的跟踪),您基本上使用单例.