2012-05-24 103 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