2012-05-24 1 views
5

Я пытаюсь инициализировать синглтон в рубине. Вот код:инициализация 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 

Проблема в том, что инициализация никогда не вызывается, и поэтому синглтон никогда не инициализируется. Я попытался называть инициализацию init, 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 - это совсем другое время выполнения для МРТ. Вот почему я сказал, что это не актуально как ответ на вопрос 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

+1 для ссылки на стандартный lib :) –

+0

Я должен был сказать, что у меня нет доступа к стандартным libs, потому что это [rubymotion] (http://rubymotion.com/). Но второй метод работал, так что большое спасибо. – pachun

+0

Я не могу поверить, что RubyMotion поставляется без поддержки стандартных библиотек. Существует ограниченная поддержка драгоценных камней, но Ruby без стандартных библиотек не так увлекательна, как альтернатива Obj-C: нет сокетов, нет JSON, нет ...? – Koraktor

Смежные вопросы