超类不匹配,结构,重装和Spork

假设有以下课程

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

当我load "./derp.rb"两次时程序失败并出现TypeError: superclass mismatch for class Derp load "./derp.rb" TypeError: superclass mismatch for class Derp 。 好的,这可以通过require来管理。 但是如何使用Spork为每次测试重新加载这些类? require显然不会工作因为它缓存加载的文件。

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

您可以将Struct.new返回的class保存到变量中,并且可以使用它始终是同一个class

 irb(main):004:0> Id = Struct.new :id # 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重新加载文件时warning: already initialized constant Test3

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

您可以确保只创建一次struct类。

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

对于那些在Google上发现这一点的人来说,这就是为我解决的问题:

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