Question

J'ai une application Rails qui à plusieurs reprises des pourparlers à un autre serveur Web par le biais d'une enveloppe, et je voudrais coller l'emballage dans une classe Singleton donc il est pas recréé pour chaque demande. Assez facile, je pensais:

class AppWrapper < Wrapper
  include Singleton
end
...
wrapper = AppWrapper.instance "url"

Seulement cela ne fonctionne pas:

wrong number of arguments (0 for 1)
/usr/lib/ruby/1.8/singleton.rb:94:in `initialize'
/usr/lib/ruby/1.8/singleton.rb:94:in `new'
/usr/lib/ruby/1.8/singleton.rb:94:in `instance'

Wrapper.initialize a besoin d'un argument, et apparemment il ne se passe est à travers, depuis la ligne 94 en question dit

@__instance__ = new # look Ma, no argument

Comment puis-je travailler autour de cela? Redéfinir l'initialisation dans AppWrapper ne semble pas aider, et bidouiller avec Wrapper pour séparer « URL set » de « initialiser » semble suboptimale.

Était-ce utile?

La solution 3

J'ai posé cette question alors que je recevais toujours ma tête autour de Ruby, et il semble si naïf maintenant. La solution facile est de stocker tout l'objet Wrapper dans une variable membre et utiliser ||= pour l'initialiser que si elle n'a pas encore été fixée:

class WrapperUserClass
  def initialize
     @wrapper = nil # Strictly speaking unnecessary, but it's a bit clearer this way
  end

  def wrapper
    @wrapper ||= Wrapper.new(foobar)
  end

  def do_something
    wrapper.booyakasha
  end
end

Autres conseils

Passage argument à singleton

class Parameterized_Singleton

def initialize(a)
  @pdf = a
  puts @pdf
end

def self.instance(p)

  begin
    @@instance  =Parameterized_Singleton.new(p)
    private_class_method :new
    rescue NoMethodError
     # return @@instance  # or you can return previous object
      puts "Object Already Created"
      exit
  end

  return @@instance
end

def scanwith(b)
  puts "scan"
end

def show_frequence_distribution
  puts "fd"
end

def show_object_number(a)
  puts "no"
end


end


Parameterized_Singleton.instance(20).show_object_number(10)
Parameterized_Singleton.instance(10).show_object_number(20)

Êtes-vous sûr que vous avez besoin d'un singleton et non une usine. ce reportez-vous

Puisque vous mentionnez quelque chose sur la modification Wrapper comme une solution, ne pouvez-vous utiliser juste Wrapper directement et faire cela?

class Wrapper; include Singleton; end

Dans le cas contraire, vous pouvez utiliser quelque chose comme ça, qui se contentera de se assurer AppWrapper.new n'est pas appelé plus d'une fois:

class AppWrapper
  def self.new(*args)
    class << app_wrapper = Wrapper.new(*args)
      include Singleton
    end
    app_wrapper
  end
end

Si vous avez besoin singleton « Klass.instance » méthode, vous devrez prendre soit prendre le paramètre # Wrapper initialiser, ou tout simplement redéfinir Singleton # exemple pour prendre des arguments en option et les transmet à l'appel à nouveau sur ligne 94.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top