2010-11-18 11 views
0

Je suis un débutant à propos de ruby. La fonction initialize de la classe singleton ne devrait-elle pas avoir d'arguments? voici mon code:un problème à propos de singleton en ruby ​​

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

Je pense que devrait être correct.but le rubis aussi me dire:

/usr/lib/ruby/1.8/singleton.rb:94:in `initialiser « : mauvais nombre d'arguments (0 pour 1) (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

Répondre

2

Comme il s'agit d'un singleton, il n'est pas nécessaire de passer des paramètres à initialiser, car il retournera toujours le même objet.

Si vous voulez changer quelque chose dans la classe chaque fois que vous l'appelez, vous pouvez définir une nouvelle méthode.

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

Je ne suis pas Bien sûr ce que vous essayez de faire, mais il existe de nombreuses autres façons d'obtenir une instance singleton sans utiliser le module Singleton.

Personnellement, je aime cette méthode:

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

Si vous pouviez donner un peu plus d'informations sur pourquoi vous essayez de faire ce que vous faites, il pourrait être utile.

+1

juste pour étudier ... ~ _ ~ –

+0

Si vous étudiez, vous devriez également lire sur pourquoi le singleton est « mauvais ». Ce n'est pas un gros problème dans des langages comme ruby ​​mais en java/C# ce n'est pas recommandé. – jonnii

+5

-1: Cette roue réinventée n'est pas adaptée aux threads. –