2012-03-20 11 views
6

Supongamos que es la siguiente clasesuperclase desajuste, Struct, recarga y Spork

# derp.rb 
class Derp < Struct.new :id 
end 

Cuando load "./derp.rb" dos veces el programa falla con TypeError: superclass mismatch for class Derp. Ok, esto podría ser manejado con require. Pero, ¿cómo puedo volver a cargar esas clases para cada prueba con Spork? require obviamente no funcionará porque almacena en caché los archivos cargados.

Respuesta

6

Struct.new está creando una nueva clase para cada carga.

irb(main):001:0> class Test1 < Struct.new :id; end 
nil 
irb(main):003:0> class Test1 < Struct.new :id; end 
TypeError: superclass mismatch for class Test1 
    from (irb):3 
    from /usr/bin/irb:12:in `<main>' 

Puede guardar su Struct.newclass regresaron a una variable y se puede utilizar que será siempre la misma class.

irb(main):004:0> Id = Struct.new :id 
#<Class:0x00000002c35b20> 
irb(main):005:0> class Test2 < Id; end 
nil 
irb(main):006:0> class Test2 < Id; end 
nil 

o puede utilizar Struct.new estilo de bloque en lugar de class palabra clave que sólo dará warning: already initialized constant Test3 cuando vuelve a cargar el archivo.

irb(main):023:0> Test3 = Struct.new(:id) do 
        def my_methods 
        "this is a method" 
        end 
        end 
+0

veo. Pero esto no me ayudará con Spork: crear constantes para cada tipo de Struct un poco derrota el propósito – synapse

+0

@synapse 'Struct.new' siempre devuelve una nueva clase. tal vez pueda dividir el mismo tipo de métodos (se puede crear con accesodores) en módulos y 'incluirlos '. –

3

Puede asegurarse de que la clase struct se crea solo una vez.

Test1 < $test1 ||= Struct.new(:id)

+0

Esto funciona pero causará advertencias. Como esta advertencia: constante ya inicializada WebCalendarHelper :: MonthCalendar :: HEADER – rposborne

0

Para aquellos encontrar esto en Google, esto es lo que lo resolvió para mí:

module MyModule 
    class MyClass 
    MyClassStruct ||= Struct.new(:id) 
    SomeStruct < MyClassStruct 
    ... 
    end 
end 
Cuestiones relacionadas