अजीब व्यवहार वस्तुओं की प्रतिलिपि - रूबी, गहरी प्रतिलिपि

मैं एक ऐसी वस्तु को गहरी प्रतिलिपि बनाने की कोशिश कर रहा हूं जिसमें एक 3 डी सरणी है। लेकिन यह उम्मीद के अनुसार काम नहीं कर रहा है।

class A
def initialize
@a = [[[1]], [[2]]]
end

def modify3D
@a[0][0] = @a[1][0]
end

def modify2D
@a[0] = @a[1]
end

def dup
copy = super
copy.make_independent!
copy
end

def make_independent!
@a = @a.dup
end

def show
print "n#{@a}"
end
end

a = A.new
b = a.dup
#a.modify2D
b.show
a.modify3D
b.show

इस मामले में बी को संशोधित 3 डी कॉल द्वारा बदला जाता है।

[[[1]], [[2]]]
[[[2]], [[2]]]

अगर मैं संशोधित 2 डी लाइन को अनदेखा करता हूं तो सब कुछ ठीक काम करता है।

[[[1]], [[2]]]
[[[1]], [[2]]]

क्या कोई यह बता सकता है कि यहां क्या हो रहा है?

उत्तर:

जवाब के लिए 2 № 1

आपकी प्रतिलिपि पर्याप्त गहरी नहीं है। ऐरे # डुप्लिक केवल सरणी तत्वों को डुप्लिकेट करता है, सरणी तत्व नहीं। आप दो अलग-अलग सरणी के साथ समाप्त होते हैं जो अभी भी वही तत्व साझा करते हैं।

में यह जवाब मैंने दिखाया कि कैसे उपयोग करें marshaling एक गहरी प्रतिलिपि करने के लिए। यह विधि सभी काम करता है:

def deep_copy(o)
Marshal.load(Marshal.dump(o))
end

deep_copy किसी भी वस्तु के लिए काम करता है जो हो सकता हैमार्शल। अधिकांश अंतर्निहित डेटा प्रकार (ऐरे, हैश, स्ट्रिंग, और सी।) को मार्शल किया जा सकता है। किसी ऑब्जेक्ट जो आवृत्ति चर को मार्शल किया जा सकता है, उसे खुद ही मार्शल किया जा सकता है।

Deep_copy परिभाषित करने के बाद, इस लाइन को प्रतिस्थापित करें:

b = a.dup

इसके साथ:

b = deep_copy(a)

और जैसा कि आप उम्मीद करते हैं इसे काम करना चाहिए।


संबंधित सवाल
सबसे लोकप्रिय