2012-05-24 100 views
5

我想初始化ruby中的單例。這裏有一些代碼:初始化ruby單例

class MyClass 
    attr_accessor :var_i_want_to_init 

    # singleton 
    @@instance = MyClass.new 
    def self.instance 
    @@instance 
    end 

    def initialize # tried 1. initialize, 2. new, 3. self.initialize, 4. self.new 
    puts "I'm being initialized!" 
    @var_i_want_to_init = 2 
    end 
end 

問題是初始化從不被調用,因此單例沒有初始化。我嘗試命名init方法initialize,self.initialize,new和self.new。沒有工作。 「我正在初始化」從來沒有印刷和可變從來沒有初始化的時候我

my_var = MyClass.instance 

實例我如何設置的單,以便它被初始化?幫助表示讚賞,

Pachun

回答

6

Rubymotion(1.24+)現在似乎支持using GCD for singleton creation

class MyClass 
    def self.instance 
    Dispatch.once { @instance ||= new } 
    @instance 
    end 
end 
+0

很高興知道,但幾乎沒有關係 –

+0

@sardaukar這與這不相關?這應該是被接受的答案。 –

+0

@RyanRomanchuk RubyMotion是一個非常不同的MRI運行時。這就是爲什麼我說它與Ruby問題的答案並不相關。 Ans也是 - 這個特殊的答案只適用於Mac OS X。對? –

15

有一個standard library for singletons

require 'singleton' 

class MyClass 
    include Singleton 
end 

要解決你的代碼,你可以使用如下:

class MyClass 
    attr_accessor :var_i_want_to_init 

    def self.instance 
    @@instance ||= new 
    end 

    def initialize # tried 1. initialize, 2. new, 3. self.initialize, 4. self.new 
    puts "I'm being initialized!" 
    @var_i_want_to_init = 2 
    end 
end 
+1

用於引用標準庫的:) –

+0

我應該說我沒有訪問標準庫,因爲它是[rubymotion](http://rubymotion.com/)。但第二種方法奏效了,非常感謝。 – pachun

+0

我不相信RubyMotion不支持標準庫。對寶石的支持有限,但沒有標準庫的Ruby對於Obj-C來說並不那麼令人興奮:沒有套接字,沒有JSON,沒有......? – Koraktor