シングルトンモジュールでのクラスミキシングは、「クラス」メソッドと保証された初期化呼び出しまたはインライン初期化のいずれかを備えたクラスまたはモジュールと機能的に同等であることに注意してください。シングルトンのこの使用法を比較してください:
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
、オブジェクトの初期化を最初に要求するまで遅らせることです。
したがって、クラスまたはモジュールに「class」メソッドがあり、それらを使用してそのオブジェクトの状態を変更する場合(たとえば、クラスから継承するすべてのサブクラスを追跡するクラス)、基本的にシングルトンを使用しています。