2010-11-18 8 views
0

私はルビーについて初心者です。 シングルトンクラスの初期化関数に引数を渡してはいけませんか?ここ は私のコードです:ルビーのシングルトンに関する問題

require 'singleton' 
class AAA 
    attr :string , true 
    include Singleton 
    def initialize(stirng) 
     @string = "aaa"; 
    end 
end 
a = AAA.instance("simpleton"); 
puts a.string 

私はルビーにも教えてcorrect.butされるべきだと思う:

を初期化する `/usr/lib/ruby/1.8/singleton.rb:94:in 「:引数の数が間違って(1 0)(例外ArgumentError)

from /usr/lib/ruby/1.8/singleton.rb:94:in `new' 
from /usr/lib/ruby/1.8/singleton.rb:94:in `instance' 

T___T

答えて

2

シングルトンであるため、常に同じオブジェクトを返すため、初期化するパラメータを渡す必要はありません。

クラスを呼び出すたびにクラスの内容を変更したい場合は、新しいメソッドを定義することができます。ただ勉強のため

require 'singleton' 
class AAA 
    attr :string , true 
    include Singleton 
    def initialize 
     @string = "aaa"; 
    end 
    def self.change(string) 
     instance.string = string 
     instance 
    end 
end 
a = AAA.change("simpleton"); 
puts a.string 
0

私はありませんあなたがやろうとしていることは確かですが、Singletonモジュールを使用せずにシングルトンインスタンスを取得するには他にもたくさんの方法があります。私個人的にはこの方法のように

:あなたは少しより多くの情報を与えることができれば、あなたがやっている何をしようとしている理由

class Foo 
    def self.instance 
    @__instance__ ||= new 
    end 
end 

についてそれが役に立つかもしれません。

+1

...〜_〜 –

+0

あなたはまた、シングルトンパターンは「悪い」である理由をよく読んでする必要があり勉強している場合。 Rubyのような言語ではそれほど大きな問題ではありませんが、Java/C#ではそれはお勧めできません。 – jonnii

+5

-1:この発明されたホイールはスレッドセーフではありません。 –