2012-11-09 9 views
10

私はRubyでSingletonsについて読んでいました。以前はそれらを使用する必要は全くありませんでしたが、私は好奇心を持って見て、それらを見て、過去に使用していたはずか、あるいは私が知っていれば将来使用することができるかどうかを確かめました何か彼らはのために使用されています。これを使用するには、私は考えることができるRubyでシングルトンクラスを使用するのはいつ賢明でしょうか?

唯一の時間は次のとおりです。

  • 私は特別なオブジェクトを持っている必要があります。例: "スマート" Hashオブジェクト。通常のRubyハッシュのように動作し、いくつかの追加の癖があります。
  • 私はそのようにしたいので、クラスのインスタンスは1つしか存在できません。

しかし、私は上記のいずれかの必要性を本当に確信していません。

+0

あなたはすべてのオブジェクトが持っているシングルトンクラスについて話していますか、それともこれまで可能なインスタンスを1つしか持たない擬似グローバルをクラスに宣言させるシングルトンライブラリについて話していますか? – Phrogz

+0

@Phrogzについて「これまで可能なインスタンスが1つしかない疑似グローバルなクラスを宣言できるシングルトンライブラリ」しかし、私はそれがライブラリであることを知らなかった?私はそれが内蔵のルビー機能だと思った。 – omninonsense

+1

私は標準ライブラリの一部である[このモジュール](http://ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html)を参照していますが、['singleton_class '](http://ruby-doc.org/core-1.9.3/Object.html#method-i-singleton_class)と関連する[methods](http://ruby-doc.org/core-1.9.3 /Object.html#method-i-singleton_methods)(これはRubyコアの一部です)。 – Phrogz

答えて

10

シングルトンモジュールで混合するクラスは、 'class'メソッドと保証された初期化呼び出しまたはインライン初期化を持つクラスまたはモジュールと機能的に同等であることに注意してください。シングルトンのこの使用方法の比較:

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'メソッドがあり、それを使ってそのオブジェクトの状態を変更する場合(例えば、それを継承するすべてのサブクラスを追跡するクラスなど)は、基本的にシングルトン。

4

あなたが言ったように、クラスのインスタンスを1つだけ持つ必要がある場合は、シングルトンクラスが必要です。広く受け入れられているフレームワークにおけるSingletonクラスの非常に良い例は、Rails Loggerクラスです。

5

あなたは常にシングルトンクラスをRubyで使用します。実際、すべてのオブジェクトはシングルトンクラスを持っています。 (注:パフォーマンス上の理由から、シングルトンクラスは実際に最初にアクセスしたときにのみ作成されますが、それはパフォーマンスの最適化であるため、シングルトンクラスを参照しようとするたびにそのクラスが表示されます)

たとえば、「クラスメソッド」は実際にはRubyには存在しません。それらは、クラスオブジェクトのシングルトンクラスの正規のインスタンスメソッドです。

def foo.barという構文を持つメソッドを定義するたびに、シングルトンクラスfooにメソッドを追加していきます。

+0

私はそれを認識していますが、クラスに割り当てることを除いて、単一のオブジェクトにメソッドを定義する必要があるときは、おそらく具体的な例であると考えていません。 – omninonsense

+3

時には、実際には純粋な「関数」であり、オブジェクトに属しておらず、状態を持たないものです。しかし、あなたはまだそれらを名前空間に入れたいと思っています。例えば、 'Math'モジュールです。 –

+0

ああ、私は実際にそれを使用しました、今私はそれを考える。さて、私は今、ばかげています。 :sadface: – omninonsense

1

あなたの2番目の箇条書きポイントは正確にポイントです。シングルトンクラスを完全に静的なオブジェクトと考えることができます。 rubyのBooleanオブジェクトとNullオブジェクトは例です。

+1

実際、 'true'、' false'、 'nil'はすべて正規クラス(' TrueClass'、 'FalseClass'、' NilClass')の正規のインスタンスです。彼らはシングルトンクラスで定義されている可能性がありますが、それは何らかの理由でより良いデザインになるかもしれません。 –

関連する問題