Ruby on Rails: Passage argument singleton
-
13-09-2019 - |
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.
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.