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) 
相關問題