Несоответствие суперкласса, структура, перезагрузка и Spork

Предположим, есть следующий класс

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

Когда яload "./derp.rb" дважды программа терпит неудачу сTypeError: superclass mismatch for class Derp, Хорошо, это можно сделать сrequire, Но как я могу перезагрузить такие классы для каждого запуска теста с Spork?require очевидно, не будет работать, потому что он кэширует загруженные файлы.

Ответы на вопрос(3)

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

 rposborne24 сент. 2013 г., 05:13
Это работает, но вызовет предупреждения. Понравилось это предупреждение: уже инициализирована константа WebCalendarHelper :: MonthCalendar :: HEADER

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

Struct.new создает новый класс для каждой вашей нагрузки.

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>'

Вы можете сохранить свойStruct.new возвращенныйclass к переменной, и вы можете использовать, что всегда будет одинаковым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

или вы можете использоватьStruct.new стиль блока вместоclass Ключевое слово это даст толькоwarning: already initialized constant Test3 когда вы перезагрузите свой файл.

irb(main):023:0> Test3 = Struct.new(:id) do
                     def my_methods
                     "this is a method"
                     end
                   end
 Selman Ulug20 мар. 2012 г., 15:10
@synapseStruct.new всегда возвращает новый класс. возможно, вы можете разделить методы одного типа (могут быть созданы с помощью методов доступа) на модули иinclude их.
 synapse20 мар. 2012 г., 15:01
Понимаю. Но это не поможет мне с Spork: создание констант для каждого типа Struct своего рода побеждает цель

Ваш ответ на вопрос