2012-03-20 29 views
6

aşağıdaki sınıfÜst sınıf uyumsuzluğu, Struct ve Spork

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

İki kez programı TypeError: superclass mismatch for class Derp ile başarısız load "./derp.rb" var varsayalım. Tamam, bu require ile yönetilebilir. Ancak Spork ile her test için bu tür sınıfları nasıl yeniden yükleyebilirim? require açıkçası işe yaramaz, çünkü yüklenen dosyaları önbelleğe alır. Her yükünüz için yeni sınıf yaratıyor

cevap

6

.

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

Sen kaydedebilir Struct.new bir değişkene class döndü ve o hep aynı class olacak kullanabilirsiniz.

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 

veya Size dosyasını yeniden zaman sadece warning: already initialized constant Test3 verecektir yerine class anahtar kelimenin Struct.new blok stilini kullanabilirsiniz.

+0

. Ama bu bana Spork ile yardım etmeyecek: Yapısal her tür için sabitler yaratmak, – synapse

+0

'u synapse 'Struct.new' her zaman yeni bir sınıf döndürüyor. belki de aynı tür yöntemleri (erişimciler ile oluşturulabilir) modüllere bölebilir ve bunlara “dahil edebilirsin”. –

3

Yapı sınıfının yalnızca bir kez oluşturulduğundan emin olabilirsiniz. Google'da bu bulgu olanlar için

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

+0

Bu, ancak uyarılara neden olur. Bu uyarıyı beğendi: zaten başlatılmış sabit WebCalendarHelper :: MonthCalendar :: HEADER – rposborne

0

, bu benim için çözülmüş budur: Anlıyorum

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