2012-05-24 24 views
5

Próbuję zainicjować singleton w ruby. Oto kod:inicjowanie ruby ​​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 

Problem polega na tym, że inicjalizacja nigdy nie jest wywoływana, a tym samym singleton nigdy się nie inicjuje. Próbowałem nazywać metodę init initialize, self.initialize, new i self.new. Nic nie działało. „Jestem inicjowany” nigdy nie została wydrukowana, a zmienna nigdy inicjowany kiedy tworzony z

my_var = MyClass.instance 

Jak mogę skonfigurować Singleton tak że zostaje zainicjowana? Pomoc docenione,

Pachun

Odpowiedz

6

Rubymotion (1.24+) teraz wydaje się wspierać using GCD for singleton creation

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

Dobrze wiedzieć, ale mało istotne –

+0

@sardaukar Jak to jest nieistotne? To powinna być zaakceptowana odpowiedź. –

+0

@RyanRomanchuk RubyMotion to bardzo różne środowisko uruchomieniowe do MRI. Dlatego powiedziałem, że to nie jest tak istotne jak odpowiedź na pytanie o Ruby. Ans także - ta konkretna odpowiedź dotyczy tylko systemu Mac OS X. Dobrze? –

15

Jest standard library for singletons:

require 'singleton' 

class MyClass 
    include Singleton 
end 

naprawić swój kod można użyć następujących:

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 za odniesienie do standardowego lib :) –

+0

Powinienem był powiedzieć, że nie mam dostępu do standardowych bibliotek, ponieważ to [rubymotion] (http://rubymotion.com/). Ale druga metoda zadziałała, więc dziękuję bardzo. – pachun

+0

Nie mogę uwierzyć, że RubyMotion przychodzi bez wsparcia dla standardowych bibliotek. Wsparcie dla klejnotów jest ograniczone, ale Ruby bez standardowych bibliotek nie jest tak ekscytująca, jak alternatywa dla Obj-C: Brak gniazd, brak JSON, nie ...? – Koraktor