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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top