1

ラッパーを介して別の Web サーバーと繰り返し通信する Rails アプリがあり、リクエストごとに再作成されないように、ラッパーを Singleton クラスに貼り付けたいと考えています。簡単に、私は考えました:

class AppWrapper < Wrapper
  include Singleton
end
...
wrapper = AppWrapper.instance "url"

それだけでは機能しません:

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'

問題の94行目は

@__instance__ = new # look Ma, no argument

これを回避するにはどうすればよいですか? AppWrapper で初期化を再定義しても解決しないようです。また、Wrapper をいじって「URL の設定」を「初期化」から分離するのは最適ではないようです。

4

4 に答える 4

2

シングルトンに引数を渡す

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)
于 2011-08-05T11:39:01.687 に答える
1

私はまだRubyについて頭を悩ませていたときにこの質問をしましたが、今ではとても素朴に思えます. 簡単な解決策は、Wrapper オブジェクトをメンバー変数に格納し、||=まだ設定されていない場合にのみ初期化するために使用することです。

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
于 2011-03-05T00:27:03.083 に答える
1

factory ではなくシングルトンが必要ですか。これを参照

于 2009-12-07T10:17:47.320 に答える
0

解決策としてWrapperを編集することについて言及されているので、Wrapperを直接使用してこれを行うことはできませんか?

class Wrapper; include Singleton; end

そうでない場合は、次のようなものを使用できます。これにより、 AppWrapper.new が複数回呼び出されないようになります。

class AppWrapper
  def self.new(*args)
    class << app_wrapper = Wrapper.new(*args)
      include Singleton
    end
    app_wrapper
  end
end

シングルトンの「Klass.instance」メソッドが必要な場合は、Wrapper#initialize でパラメーターを取り出すか、Singleton#instance を再定義してオプションで引数を取得し、94 行目の new の呼び出しに渡す必要があります。

于 2009-12-07T11:37:19.673 に答える