2010-08-21 13 views
6

मैं एक Moose वस्तु मिल गया है:दीप क्लोनिंग मूस वस्तु

class My::Game { 
    has 'players' => (isa => 'Set::Object', ...) 
    has 'action_sequence' => (isa => 'ArrayRef[My::Game::Action]', ...) 
} 

अब मैं $game2 = $game->clone; की तरह एक फोन के साथ इस वस्तु क्लोन करने के लिए सक्षम होना चाहते हैं मैं इसे गहरा क्लोन कैसे करूं ताकि ArrayRef में ऑब्जेक्ट्स क्लोन किए गए हों? और अधिक मुश्किल से, Set::Object?

मैंने MooseX::Clone पर देखा है, लेकिन मुझे स्पष्ट नहीं है कि इस मामले में इसे कैसे लागू किया जाए। उदाहरण कोड की सराहना की जाएगी।

धन्यवाद!

उत्तर

2

कि बस जोड़ने बाहर कर देता है कक्षा में MooseX::Clone भूमिका clone() विधि प्रदान करती है जो पुनरावर्ती गुणों को क्लोन करती है।

  • हैशफ/सररेफ विशेषताओं के लिए, यह संरचनाओं की प्रतिलिपि बनाता है।
  • स्केलर्स (संदर्भ सहित) के लिए यह संदर्भ की एक उथली प्रतिलिपि करता है।
  • यदि आप विशेषता में traits => ['Clone'] जोड़ते हैं, तो यह विशेषता मान पर clone() पर कॉल करके विशेषता को पुन: क्रमबद्ध कर देगा।

Set::Object क्लोनिंग का समर्थन करने के लिए, मैं एक विशेषता Clone विशेषता उपवर्गीकरण द्वारा CloneByCoercion बुलाया बना दी, प्रकार के साथ पैरामिट्रीकृत क्लोनिंग से पहले से/मजबूर करने के लिए।

तो यह उपयोग करने के लिए, मैं ने लिखा है:

has 'blah' => (isa => 'Set::Object', is => rw, 
    traits => ['CloneByCoercion' => {to=>'ArrayRef'}] 
); 

MooseX::Types::Set::Object करने और ArrayRef से coercions प्रदान करता है (हालांकि मैं इसे में एक बग पैच करने के लिए की जरूरत: ArrayRef को बलात्कार के लिए एक संदर्भ, नहीं एक सूची प्रदान करना चाहिए)

मैंने ऑब्जेक्ट-देखा हैश रखने के लिए भी संशोधित किया है, ताकि यह परिपत्र संदर्भों के साथ अंतःस्थापित ऑब्जेक्ट संरचनाओं को क्लोनिंग का समर्थन करता है।

मैं अंततः इस सामान को सीपीएएन पर डालने या मॉड्यूल में पैच सबमिट करने के लिए मिल जाएगा।

5

मैं टुकड़े यहाँ (MooseX::Clone, MooseX::Compile, और Set::Object) के किसी भी उपयोग नहीं किया है, इसलिए यहाँ सिर्फ मैं कहाँ शुरू कर दूं का एक मोटा रूपरेखा, है डॉक्स और मूस वास्तुकला का सामान्य ज्ञान की मेरी समीक्षा से:

  • MooseX :: क्लोन आपकी ऑब्जेक्ट को क्लोन() विधि देता है, जो क्लोन() को क्लोन() को क्लोन() को क्लोन() को क्लोन() के साथ कॉल करता है।
  • हां, तो आप अपनी विशेषताओं दोनों के लिए एक क्लोन() विधि जोड़ने की जरूरत है ...
  • यह मेरी महत्वाकांक्षी आशा कि MooseX :: क्लोन native attribute arrayrefs संभाल कर सकते हैं हो सकता है, लेकिन जब से यह शायद नहीं है, आप उस सुविधा को स्वयं विस्तारित कर सकते हैं (यानी यदि 'action_sequence' विकल्प traits => ['Array'] विकल्प है, तो यह पर्याप्त स्मार्ट है कि क्लोन विधि वास्तव में handles => { clone => [ 'map', 'clone' ] } के माध्यम से परिभाषित की जाती है - यानि प्रत्येक सदस्य तत्वों पर क्लोन() को कॉल करके विशेषता को क्लोन करें) - यहां संभावना है कि आप अपना पहला पैच
  • Set::Object के दस्तावेज़ों से पता चलता है कि आप Storable::dclone (जो आप हैं) के साथ विश्वसनीय रूप से ऑब्जेक्ट क्लोन कर सकते हैं सत्यापित करें, और अगर यह सही नहीं है तो लेखक और/या आपूर्ति पैच को फ़्लॉग करें)
  • और अब आपको सेट :: ऑब्जेक्ट विशेषता में क्लोन() विधि जोड़ने की आवश्यकता है, जो दस्तावेज़ आपको MooseX::Compile (और यहाँ है जहाँ आप irc.perl.org #moose पर आते हैं और हमें एक झटका-दर-झटका अपनी प्रगति का देना चाहिए, ताकि हम बाद में इसके बारे में एक वृत्तचित्र बना सकते हैं) :)
+0

मुझे लगता है कि आपको सेट :: ऑब्जेक्ट विशेषता पर 'StorableClone' विशेषता का उपयोग करने की आवश्यकता है; जो स्वचालित रूप से उस पर 'dclone' का उपयोग करना चाहिए। (StorableClone MooseX :: क्लोन का हिस्सा है।) – cjm

संबंधित मुद्दे