2012-05-24 19 views
5

Estoy tratando de inicializar un singleton en ruby. Aquí hay un código:inicializando 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 

El problema es que nunca se invoca initialize y, por lo tanto, el singleton nunca se inicializa. Intenté nombrar el método init initialize, self.initialize, new y self.new. Nada funcionó. "Estoy siendo iniciada" no llegó a imprimirse y la variable nunca se inicializa cuando crea una instancia con

my_var = MyClass.instance 

¿Cómo puedo configurar el Singleton para que llegue inicializado? Ayuda apreciada,

Pachun

Respuesta

6

Rubymotion (1.24+) ahora parece apoyar using GCD for singleton creation

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

Es bueno saberlo, pero apenas relevante –

+0

@sardaukar ¿Cómo es esto no relevante? Esta debería ser la respuesta aceptada. –

+0

@RyanRomanchuk RubyMotion es un tiempo de ejecución muy diferente a MRI. Es por eso que dije que no es realmente relevante como respuesta a una pregunta de Ruby. Respuestas también: esta respuesta en particular solo es Mac OS X. ¿Derecha? –

15

Hay una standard library for singletons:

require 'singleton' 

class MyClass 
    include Singleton 
end 

Para fijar su código se puede utilizar el siguiente:

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 para hacer referencia a la lib estándar :) –

+0

Debería haber dicho que no tengo acceso a libs estándar porque es [rubymotion] (http://rubymotion.com/). Pero el segundo método funcionó, así que muchas gracias. – pachun

+0

No puedo creer que RubyMotion venga sin soporte para las bibliotecas estándar. Existe un soporte limitado para las gemas, pero Ruby sin las bibliotecas estándar no es tan emocionante como una alternativa para Obj-C: ¿Sin enchufes, sin JSON, sin ...? – Koraktor