12

Rubyのシングルトンについて読んでいました。以前は実際に使用する必要はありませんでしたが、興味を持って調べて、過去に使用すべきかどうか、または将来使用できるかどうかを確認することにしました。のために使用される。

私がこれを使用することを考えることができる唯一の時は:

  • 特別なオブジェクトが必要なとき。例:「スマート」Hashオブジェクト。通常のRubyハッシュのように機能し、いくつかの癖があります。
  • クラスのインスタンスが1つだけ存在できるようにしたい場合。

ただし、上記のいずれかが必要かどうかはわかりません。

4

4 に答える 4

12

シングルトンモジュールでのクラスミキシングは、「クラス」メソッドと保証された初期化呼び出しまたはインライン初期化のいずれかを備えたクラスまたはモジュールと機能的に同等であることに注意してください。シングルトンのこの使用法を比較してください:

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」メソッドがあり、それらを使用してそのオブジェクトの状態を変更する場合(たとえば、クラスから継承するすべてのサブクラスを追跡するクラス)、基本的にシングルトンを使用しています。

于 2012-11-09T22:31:12.563 に答える
6

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

たとえば、いわゆる「クラスメソッド」は、実際にはRubyには存在しません。これらは、クラスオブジェクトのシングルトンクラスの単なる通常のインスタンスメソッドです。(代わりに「クラスメソッド」と言う方がはるかに簡単です。)

構文を使用してメソッドを定義するたびdef foo.barに、のシングルトンクラスにメソッドを追加しますfoo

于 2012-11-09T19:09:50.597 に答える
5

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

于 2012-11-09T19:02:54.823 に答える
1

2番目の箇条書きは正確に一致しています。シングルトンクラスを完全に静的なオブジェクトと考えてください。rubyのブールオブジェクトとヌルオブジェクトは例です。

于 2012-11-09T19:11:14.360 に答える