2011-06-26 86 views
0

儘管我已經將FooFactory類聲明爲「Singleton」,但它的類變量@@ foo每次都會被實例化。這是爲什麼?在Ruby中實現單例模式

主要單例類:

require 'singleton' 

class FooFactory 
    include Singleton 
    @@foo = nil 

    def get_foo 
    print @@foo.nil?.to_s 
    @@foo ||= "I am a string" 
    return @@foo 
    end 
end 

控制器代碼:

class PagesController < ApplicationController 
    def home 
    @foo = FooFactory.instance.get_foo 
    end 
end 

視圖代碼:

<%= @foo %> 

我期望在FooFactoryprint方法應該返回false在之後已經第一次實例化了。但每次刷新pages/home視圖時,控制檯都會繼續打印true

+0

您是否嘗試過使用普通Ruby運行類似的代碼(即沒有Rails,並且不包括任何你不需要的東西),並看到你得到了什麼? –

回答

6

在開發模式下,每個請求都重載類,失去了可能填充到其中的任何類狀態。這可以通過查找該行development.rb改變:

config.cache_classes = false 

,改變它true,這是它是如何在production.rb通常設置。將其設置爲false的原因很方便:您可以編輯代碼並刷新以查看更改,而無需重新啓動服務器。

但是在Rails中,將狀態放入類中並期望它停留在請求之間並不常見,因爲虛擬機器來來去去,而線程化虛擬機可能無法以線程安全的方式訪問類的狀態。這些問題有解決方法,但通常有更好的方法來做任何你正在做的事情。

+0

謝謝..你能否介紹一些關於你在最後一段提到的東西的網頁。 – brayne