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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top