क्या आप जानते हैं कि आप रूबी में किसी वस्तु की प्रतिलिपि बना सकते हैं? इतना ही नहीं, ऐसा करने के दो अलग-अलग तरीके हैं!
ये विधियां हैं :
dup
clone
हम एक पल में मतभेदों का पता लगाएंगे, लेकिन पहले…
आप किसी वस्तु का क्लोन क्यों बनाना चाहते हैं ?
रूबी में कई वस्तुएं परिवर्तनशील हैं, आप उन्हें बदल सकते हैं।
अगर आप किसी वस्तु को बदलना चाहते हैं लेकिन मूल की एक प्रति अपने पास रखें तब आप उसका क्लोन बना सकते हैं।
उदाहरण के लिए।
आप सभी तत्वों के साथ एक सरणी चाहते हैं लेकिन पहले वाला।
ऐसा करने का एक तरीका :
a = [1,2,3,4,5] a[1..-1] # [2,3,4,5]
एक और तरीका होगा :
b = a.clone b.shift # [1] b # [2,3,4,5]
दोनों उदाहरण आपको मूल सरणी रखने की अनुमति देते हैं।
जमे हुए ऑब्जेक्ट
डुप और क्लोन एक दूसरे के उपनाम नहीं हैं जैसे यह अन्य रूबी विधियों (मानचित्र/संग्रह) के साथ होता है, उनके बीच कुछ छोटे अंतर होते हैं।
समानता और अंतर की खोज करना दो चीजों के बीच अपनी समझ को बेहतर बनाने का एक शानदार तरीका है ।
दोनों विधियाँ किसी वस्तु को कॉपी करती हैं, अंतर यह है कि dup
ऑब्जेक्ट विशेषताओं की प्रतिलिपि नहीं बनाता है।
कौन सी वस्तु विशेषताएँ?
- जमे हुए स्थिति
- दागी स्थिति
- एकल वर्ग
यहां एक उदाहरण दिया गया है :
a = Object.new.freeze b = a.dup b.frozen? # false b = a.clone b.frozen? # true
रूबी 2.4 में clone
. के लिए एक विकल्प शामिल है क्लोन की गई वस्तु की जमी हुई स्थिति को अनदेखा करने के लिए।
उदाहरण :
a.clone(freeze: true) a.clone(freeze: false)
डीप बनाम शालो कॉपीिंग
किसी वस्तु की नकल करने के लिए आंख से मिलने के अलावा और भी बहुत कुछ है।
जब आप एक कॉपी बनाते हैं, तो dup
. के साथ या clone
, आप एक उथली प्रतिलिपि बना रहे हैं ।
इसका मतलब है कि अन्य वस्तुओं में निहित वस्तुओं की नकल नहीं की जाएगी।
दूसरे शब्दों में :
यदि आपके पास स्ट्रिंग्स की एक सरणी है, तो केवल सरणी की प्रतिलिपि बनाई जाएगी, न कि स्वयं स्ट्रिंग्स की।
खुद देखें:
original = %w(apple orange banana) copy = original.clone original.map(&:object_id) # [23506500, 23506488, 23506476] copy.map(&:object_id) # [23506500, 23506488, 23506476]
सरणी को क्लोन करने के बाद भी ऑब्जेक्ट आईडी समान हैं, इसलिए हमारे पास समान स्ट्रिंग्स हैं।
आप इसे इसके साथ हल कर सकते हैं:
strings.clone.map(&:clone)
इसका परिणाम सरणी और स्ट्रिंग दोनों पर क्लोन किया जा रहा है, लेकिन ध्यान दें कि यह केवल एक स्तर गहरा जाता है। आप विकल्प के रूप में ActiveSupport से deep_dup विधि आज़मा सकते हैं।
सारांश
आपने रूबी में वस्तुओं की क्लोनिंग के बारे में सीखा है! जिसमें डुप्ली और क्लोन विधियों और उथली कॉपी बनाम डीप कॉपी के बीच अंतर शामिल हैं।
पढ़ने के लिए धन्यवाद!