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

syn*_*pse 6 ruby inheritance class spork

假设有以下课程

# derp.rb
class Derp < Struct.new :id
end
Run Code Online (Sandbox Code Playgroud)

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

Sel*_*lug 6

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>'
Run Code Online (Sandbox Code Playgroud)

您可以保存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
Run Code Online (Sandbox Code Playgroud)

或者您可以使用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
Run Code Online (Sandbox Code Playgroud)