假設有下面的類超類不匹配,結構,重裝和叉勺
# 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