超类不匹配,结构,重装和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