2012-08-01 15 views
12

What's the difference between Ruby's dup and clone methods?dup और clone के व्यवहार में अंतर का वर्णन करता है। लेकिन मुझे dup का उपयोग कब करना चाहिए, और इसके बजाय मुझे clone का उपयोग कब करना चाहिए?डुप्ली का उपयोग कब करें, और रूबी में क्लोन का उपयोग कब करें?

वास्तविक परियोजनाओं के उदाहरण जो चर्चा करते हैं कि उन्होंने क्लोन के बजाय डुप्ली का उपयोग क्यों किया, या इसके विपरीत, इस प्रश्न के लिए आदर्श होगा।

वैकल्पिक रूप से, दो अलग-अलग विधियों का अस्तित्व क्यों उपयोगी होगा इसका एक स्पष्टीकरण उपयोगी होगा। यह रुबी के रचनाकारों के बयान, या रूबी को प्रभावित करने वाली भाषाओं में dup और clone जैसी विधियों की जांच का उल्लेख कर सकता है।

+0

संभावित डुप्लिकेट [रूबी के डुप्लिक और क्लोन विधियों के बीच क्या अंतर है?] (Http://stackoverflow.com/questions/10183370/whats-the-difference-between-rubys-dup-and-clone-methods) – OlehZiniak

उत्तर

7

यह सच है कि एक वस्तु का clone प्रतियां frozen राज्य, पाया, जबकि dup नहीं करता है:

o = Object.new 
o.freeze 

o.clone.frozen? 
#=> true 

o.dup.frozen? 
#=> false 

clone ऑब्जेक्ट के सिंगलटन विधियों की प्रतिलिपि भी करेगा जबकि dup नहीं है:

o = Object.new 
def o.foo 
    42 
end 

o.clone.respond_to?(:foo) 
#=> true 

o.dup.respond_to?(:foo) 
#=> false 

जो मुझे लगता है कि clone को कभी-कभी dup से "गहरी" प्रति प्रदान करने के रूप में समझा जाता है।

Comment on ActiveRecord::Base#initialize_dup from Rails 3:

ठगा वस्तुओं कोई आईडी सौंपा और नए रिकॉर्ड के रूप में इलाज कर रहे हैं है यहाँ विषय के बारे में कुछ उद्धरण हैं। नोट कि यह एक "उथला" प्रतिलिपि है क्योंकि यह ऑब्जेक्ट के गुण को कॉपी करता है, न कि इसके संगठन। "गहरी" प्रतिलिपि की सीमा विशिष्ट है और इसलिए इसकी आवश्यकता के लिए के अनुसार लागू करने के लिए एप्लिकेशन को छोड़ दिया गया है।

An article about deep copies in Ruby:

उल्लेख, clone लायक एक और तरीका नहीं है। clone विधि एक महत्वपूर्ण भेद के साथ dup जैसी ही चीज करता है: यह अपेक्षा की जाती है कि ऑब्जेक्ट इस विधि को ओवरराइड कर देगा जो गहरी प्रतियां कर सकता है।

But then again, theres deep_dup in Rails 4:

वस्तु की एक गहरी प्रतिलिपि रिटर्न अगर यह duplicable है। यदि यह डुप्लिकेशनल नहीं है, तो self लौटाता है।

and also ActiveRecord::Core#dup and #clone in Rails 4:

clone - रूबी के क्लोन विधि के समान। यह एक "उथला" प्रति है। चेतावनी दीजिये कि आपके गुणों की प्रतिलिपि नहीं बनाई गई है। [...] अगर आपको अपने गुणों की एक प्रति की आवश्यकता है, तो कृपया #dup विधि का उपयोग करें।

इसका मतलब है कि यहाँ, शब्द dup फिर एक गहरी क्लोन करने के लिये किया जाता है। जहां तक ​​मैं देख सकता हूं, समुदाय में कोई आम सहमति नहीं है, सिवाय इसके कि आपको किसी भी व्यक्ति के विशिष्ट दुष्प्रभाव की आवश्यकता होने पर clone और dup का उपयोग करना चाहिए।

अंत में, मुझे dupclone से रूबी कोड में अधिक बार देखा जाता है। मैंने अब तक clone का उपयोग कभी नहीं किया है, और जब तक मुझे स्पष्ट रूप से आवश्यकता नहीं है तब तक मैं नहीं करूँगा।

+0

अब यह मुझे लगता है कि आपको 'dup' का उपयोग करना होगा, जब तक आपके पास 'क्लोन' ('डुप्ली' सरल नहीं लगता है) का उपयोग करने के कारण हैं। लेकिन शायद ऐसा इसलिए है क्योंकि अब मैं हैश को डुप्लिकेट करने से चिंतित हूं। इसलिए मुझे जमे हुए राज्य और सिंगलटन वर्ग की परवाह नहीं है। –

4

दोनों DUP & क्लोन एक वस्तु के उथले प्रतिलिपि बनाने के लिए इस्तेमाल किया जा सकता। दोनों ओबीजे के आवृत्ति चर की प्रतिलिपि बनाते हैं। लेकिन हमें उनके उपयोग में चुनिंदा होना चाहिए।

इन के बीच कुछ अंतर

1) क्लोन प्रतियां दोनों स्थिर और एक वस्तु के रूप में DUP केवल प्रतियां एक वस्तु का राज्य दागी जहां के दागी राज्य कर रहे हैं।

2) क्लोन के साथ आप किसी ऑब्जेक्ट के किसी भी सिंगलटन विधियों की प्रतिलिपि बना सकते हैं लेकिन डीयूपी इसका समर्थन नहीं करता है।

क्लोन का उपयोग किसी ऑब्जेक्ट को डुप्लिकेट करने के लिए किया जाता है, जिसमें आंतरिक स्थिति भी शामिल है, डीयूपी आम तौर पर नया उदाहरण बनाने के लिए वंश ऑब्जेक्ट की कक्षा का उपयोग करता है।

मुझे ActiveRecord पंक्ति को डुप्लिकेट करने के लिए डीयूपी का उपयोग करते समय कुछ कड़वी अनुभव था, यह मूल को खोने में समाप्त हुआ, जिसने क्लोन के साथ ठीक काम किया।

के रूप में मैं अपने आप को भ्रम में लिपटे, मैं यह स्पष्ट कर एक Article of Open Source is Wide Open

+0

"रूबी में प्रतिलिपि बनाने के लिए तीन शिष्टाचार हैं: # डप, # क्लोन और '='।" - '=' प्रतिलिपि कैसे करता है? –

+0

मुझे '=' प्रतिलिपि में गहराई से नहीं मिलता है, लेकिन यह एक उथली प्रतिलिपि बनाता है। शुरुआत के लिए यहां एक [अच्छा उदाहरण] (http://thingsaaronmade.com/blog/ruby-shallow-copy-surprise.html) है, लेकिन संक्षेप में असाइनमेंट ऑपरेटर मान की एक प्रति नहीं बनाता है, यह केवल प्रतियां ऑब्जेक्ट का संदर्भ –

+0

बस एक नोट: 'मार्शल :: लोड (मार्शल डंप (foo))' काम करता है, लेकिन डेटाबेस मॉडल के साथ परेशानी का कारण बन सकता है। – sandstrom

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