Ruby on Rails: Argument übergeben Singletons
-
13-09-2019 - |
Frage
Ich habe eine Rails-Anwendung, die immer wieder im Gespräch mit einem anderen Web-Server über einen Wrapper, und ich mag den Wrapper in einer Singleton-Klasse halten, so dass es für jede Anforderung nicht neu erstellt wird. Leicht genug, dachte ich:
class AppWrapper < Wrapper
include Singleton
end
...
wrapper = AppWrapper.instance "url"
Nur funktioniert es nicht:
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 braucht ein Argument, und anscheinend ist es nicht durchlaufen zu werden, da die Leitung 94 in Frage, sagt
@__instance__ = new # look Ma, no argument
Wie kann ich dieses Problem umgehen? Die Neudefinition initialisieren in AppWrapper scheint nicht zu helfen, und um mit Wrapper Ausmisten „gesetzt URL“ trennen von „initialisieren“ scheint suboptimal.
Lösung 3
, fragte ich diese Frage, während ich immer noch meinen Kopf um Rubin bekommen, und es scheint nun so naiv. Die einfache Lösung ist zu speichern, nur das Wrapper-Objekt in einer Membervariable und verwenden ||=
es nur zu initialisieren, wenn es noch nicht festgelegt wurde:
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
Andere Tipps
Passing 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)
Sind Sie sicher, dass Sie einen Singleton benötigen und keine Fabrik. Siehe diese
Da Sie etwas über das Bearbeiten Wrapper als Lösung erwähnen, können Sie nicht nur Wrapper verwenden, um direkt und das tun?
class Wrapper; include Singleton; end
Wenn nicht, Sie so etwas wie diese verwenden könnte, die nur machen wird sicher AppWrapper.new nicht mehr als einmal aufgerufen:
class AppWrapper
def self.new(*args)
class << app_wrapper = Wrapper.new(*args)
include Singleton
end
app_wrapper
end
end
Wenn Sie die Singleton „Klass.instance“ Methode benötigen, werden Sie nehmen entweder den Parameter in Wrapper # nehmen initialisieren, oder einfach nur Singleton # Instanz neu definieren Argumente optional zu nehmen und übergibt sie an neue auf den Anruf auf 94 Linie.