假设有下面的类超类不匹配,结构,重装和叉勺
# derp.rb
class Derp < Struct.new :id
end
当我load "./derp.rb"
两倍程序失败TypeError: superclass mismatch for class Derp
。好的,这可以使用require
进行管理。但是,如何使用Spork为每次测试运行重新加载这些类? require
显然不起作用,因为它会缓存加载的文件。
假设有下面的类超类不匹配,结构,重装和叉勺
# derp.rb
class Derp < Struct.new :id
end
当我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 `<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
您可以确保struct类只创建一次。
Test1 < $test1 ||= Struct.new(:id)
这个工作,但会造成警告。像这样的警告:已经初始化常量WebCalendarHelper :: MonthCalendar :: HEADER – rposborne 2013-09-24 03:13:35
对于那些在谷歌找到这一点,这就是解决了这个问题对我来说:
module MyModule
class MyClass
MyClassStruct ||= Struct.new(:id)
SomeStruct < MyClassStruct
...
end
end
我明白了。但是这对Spork来说无能为力:为每种Struct创建常量都会使目标失败 – synapse 2012-03-20 14:01:08
@synapse'Struct.new'总是返回新类。也许你可以将相同类型的方法(可以用访问器创建)分割为模块并将它们“包含”。 – 2012-03-20 14:10:06