Несоответствие суперкласса, структура, перезагрузка и Spork - PullRequest
6 голосов
/ 20 марта 2012

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

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

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

Ответы [ 3 ]

6 голосов
/ 20 марта 2012

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

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

Вы можете сохранить 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
3 голосов
/ 02 августа 2013

Вы можете убедиться, что класс структуры создается только один раз.

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

1 голос
/ 08 апреля 2017

Для тех, кто нашел это в Google, вот что решил для меня:

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