1

我有一个 Rails 应用程序,它通过包装器反复与另一个 Web 服务器通信,我想将包装器粘贴在 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'

Wrapper.initialize 需要一个参数,显然它没有通过,因为有问题的第 94 行说

@__instance__ = new # look Ma, no argument

我该如何解决这个问题?在 AppWrapper 中重新定义初始化似乎没有帮助,并且使用 Wrapper 将“set URL”与“initialize”分开似乎不是最理想的。

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

你确定你需要一个单例而不是工厂吗?参考这个

于 2009-12-07T10:17:47.320 回答
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 回答
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 回答