2012-03-20 12 views
6

वहाँ निम्नलिखित वर्गसुपर क्लास बेमेल, संरचना, पुन: लोड और Spork

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

जब मैं दो बार load "./derp.rb" कार्यक्रम TypeError: superclass mismatch for class Derp के साथ विफल है मान लीजिए। ठीक है, इसे require के साथ प्रबंधित किया जा सकता है। लेकिन मैं स्पार्क के साथ प्रत्येक परीक्षण चलाने के लिए इस तरह के वर्गों को फिर से लोड कैसे कर सकता हूं? require स्पष्ट रूप से काम नहीं करेगा कारण यह भरी हुई फाइलों संचित करता है।

उत्तर

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

आप को बचा सकता है आपके 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 

या आप class कीवर्ड की जगह Struct.new ब्लॉक शैली का उपयोग कर सकते यह केवल warning: already initialized constant Test3 दे देंगे जब आप अपनी फ़ाइल को फिर से लोड ।

irb(main):023:0> Test3 = Struct.new(:id) do 
        def my_methods 
        "this is a method" 
        end 
        end 
+0

अच्छा। लेकिन यह मेरे Spork साथ मदद नहीं करेगा: struct के प्रत्येक प्रकार के लिए स्थिरांक बनाने थोड़े उद्देश्य – synapse

+0

@synapse 'Struct.new' हमेशा नया वर्ग लौटने को हरा दिया। हो सकता है कि आप मॉड्यूल में उसी प्रकार के तरीकों को विभाजित कर सकें (एक्सेसर्स के साथ बनाया जा सकता है) और 'उन्हें शामिल करें'। –

3

आप यह सुनिश्चित कर सकते हैं कि संरचना वर्ग केवल एक बार बनाया गया हो।

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

+0

यह काम करता है लेकिन चेतावनी का कारण बन जाएगा। इस चेतावनी की तरह: पहले से ही निरंतर वेबकेंडरहेल्पर प्रारंभ किया गया :: MonthCalendar :: HEADER – rposborne

0

गूगल पर इस खोजने वालों के लिए, यह है कि क्या यह मेरे लिए हल है:

module MyModule 
    class MyClass 
    MyClassStruct ||= Struct.new(:id) 
    SomeStruct < MyClassStruct 
    ... 
    end 
end 
संबंधित मुद्दे