1

我有一个Rails应用程序通过一个包装器反复与另一个Web服务器交谈,并且我想将包装器粘贴到Singleton类中,因此不会为每个请求重新创建它。很容易,我想:Ruby on 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' 

Wrapper.initialize需要一个自变量,显然它没有得到通过,因为有关行94说

@__instance__ = new # look Ma, no argument 

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

回答

1

我问这个问题,而我我仍然对Ruby感兴趣,现在看起来很天真。最简单的办法是只存储包装对象中的一个成员变量,并使用||=初始化它只有在它尚未设置:

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 
1

你确定你需要一个单身人士而不是工厂吗?请参考this

+0

应用程序将永远不需要多于一个包装,所以工厂似乎没有必要。 – jpatokal 2009-12-07 22:36:19

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#实例来选择参数,并将它们传递给在线94上的新调用。

+0

虽然我的应用程序永远不会需要多个包装器,但可以想象,未来的应用程序可能需要同时连接到多个包装器。是的,我确实需要实例方法,整个重点是访问Wrapper,而不必为每个调用重新创建对象。 – jpatokal 2009-12-07 22:38:20

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) 
相关问题