Ruby on Rails: argumento Pasando a Singleton
-
13-09-2019 - |
Pregunta
Tengo una aplicación Rails que habla repetidamente a otro servidor Web a través de un envoltorio, y me gustaría pegar la envoltura en una clase Singleton así que no es recreado para cada solicitud. Es bastante fácil, pensé:
class AppWrapper < Wrapper
include Singleton
end
...
wrapper = AppWrapper.instance "url"
Sólo que no funciona:
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 necesita un argumento, y al parecer no está consiguiendo pasa a través, ya que la línea 94 en cuestión dice
@__instance__ = new # look Ma, no argument
¿Cómo trabajo alrededor de esto? La redefinición de inicializar en AppWrapper no parece ayudar, y rededor Envoltura para separar "conjunto de direcciones URL" de "inicializar" parece subóptima.
Solución 3
Hice esta pregunta mientras yo todavía estaba recibiendo mi cabeza alrededor de Ruby, y parece tan ingenuo ahora. La solución fácil es simplemente almacenar el objeto de la envoltura en una variable miembro y utilizar ||=
para inicializar sólo si no se ha fijado todavía:
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
Otros consejos
se pasa el argumento de 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)
¿Estás seguro de que necesita un producto único y no una fábrica. este
Desde que usted menciona algo acerca de la edición de la envoltura como una solución, no puede usted sólo tiene que utilizar la envoltura directamente y hacer esto?
class Wrapper; include Singleton; end
Si no es así, usted podría utilizar algo como esto, que acaba de asegurarse AppWrapper.new no se llama más de una vez:
class AppWrapper
def self.new(*args)
class << app_wrapper = Wrapper.new(*args)
include Singleton
end
app_wrapper
end
end
Si necesita el producto único método "Klass.instance", que tendrá que tomar o sacar el parámetro en la envoltura de # inicializar, o simplemente redefinir Singleton # instancia para tomar argumentos opcionalmente y los pasa a la llamada de nuevo en línea 94.