2012-05-24 2 views
5

Ich versuche ein Singleton in Ruby zu initialisieren. Hier einige Code:Initialisierung Rubin Singleton

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 

Das Problem ist, dass initialize nie genannt wird und somit die Singleton nie initialisiert. Ich habe versucht, die Initialisierungsmethode initialize, self.initialize, new und self.new zu benennen. Nichts hat geklappt. „Ich bin initialisiert“ wurde nie gedruckt und die Variable nie initialisiert, wenn ich mit

instanziiert
my_var = MyClass.instance 

Wie kann ich Setup die Singleton, so dass es initialisiert wird? Hilfe geschätzt,

Pachun

Antwort

6

Rubymotion (1.24+) jetzt using GCD for singleton creation zu unterstützen scheint

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

Gut zu wissen, aber kaum relevant –

+0

@sardaukar Wie ist das nicht relevant? Dies sollte die akzeptierte Antwort sein. –

+0

@RyanRomanchuk RubyMotion ist eine sehr unterschiedliche Laufzeit zu MRI. Deshalb habe ich gesagt, dass es als Antwort auf eine Ruby-Frage nicht wirklich relevant ist. Ans auch - diese spezielle Antwort ist nur Mac OS X. Recht? –

15

Es gibt eine standard library for singletons:

require 'singleton' 

class MyClass 
    include Singleton 
end 

Um Ihren Code zu beheben Sie könnten die Verwendung folgende:

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

+1 für die Referenzierung der Standard-Lib :) –

+0

Ich hätte sagen sollen, ich habe keinen Zugriff auf Standard-Bibliotheken, weil es [Rubymotion] (http://rubymotion.com/) ist. Aber die zweite Methode hat funktioniert, also vielen Dank. – pachun

+0

Ich kann nicht glauben, dass RubyMotion keine Unterstützung für die Standardbibliotheken bietet. Es gibt begrenzte Unterstützung für Edelsteine, aber Ruby ohne die Standardbibliotheken ist nicht so aufregend als Alternative für Obj-C: Keine Sockel, kein JSON, kein ...? – Koraktor