/ / मान के रूप में एक और के अंदर एक सरणी धक्का - रूबी, सरणियों, अपरिवर्तनीयता

मूल्य के रूप में किसी अन्य के अंदर एक सरणी को धक्का देना - रूबी, सरणी, अपरिवर्तनीयता

मैं मान के रूप में किसी अन्य सरणी के अंदर एक सरणी को कैसे जोड़ूं और संदर्भ के रूप में नहीं? एक उदाहरण के नीचे:

a = []
m = []
i = 1

# first loop
a[0] = i
a[1] = i + 1
m << a #=> [[1,2]]

i += 1

# second loop
a[0] = i
a[1] = i + 1
m << a #=> [[2,3],[2,3]]

मुझे कुछ उम्मीद थी [[1,2],[2,3]] बजाय।

उत्तर:

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

आप यह समझने में सक्षम हो सकते हैं कि विभिन्न वस्तुओं की आईडी की जांच करके यहाँ क्या हो रहा है।

a = []
a.object_id    #=> 2164985760
m = []
i = 1

पहला लूप

a[0] = i       #=> 1
a[1] = i + 1   #=> 2
a.object_id    #=> 2164985760
m << a         #=> [[1,2]]
m.object_id    #=> 2165031720
m[0].object_id #=> 2164985760

दूसरा पाश

i += 1
a[0] = i       #=> 2
a[1] = i + 1   #=> 3
a.object_id    #=> 2164985760
m << a         #=> [[2, 3], [2, 3]]
m.object_id    #=> 2165031720
m[0].object_id #=> 2164985760
m[1].object_id #=> 2164985760

अब केवल एक बदलाव के साथ इसे फिर से कोशिश करें। जैसा कि @sawa सुझाव देता है, जोड़ें a = [] दूसरे लूप से पहले। (निम्नलिखित ऑब्जेक्ट आईडी निश्चित रूप से उपरोक्त लोगों से अलग होंगे।)

a = []
a.object_id     #=> 2164690760
m = []
i = 1

पहला लूप

a[0] = i       #=> 1
a[1] = i + 1   #=> 2
a.object_id    #=> 2164690760
m << a         #=> [[1, 2]]
m.object_id    #=> 2164655180
m[0].object_id #=> 2164690760

दूसरा पाश

a = []
a.object_id    #=> 2161060600
i += 1         #=> 2
a[0] = i       #=> 2
a[1] = i + 1   #=> 3
a.object_id    #=> 2161060600
m << a         #=> [[1, 2], [2, 3]]
m.object_id    #=> 2164655180
m[0].object_id #=> 2164690760
m[1].object_id #=> 2161060600

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

पहले को बदलें m << a साथ में m << a.dup। यह एक प्रतिलिपि धक्का देगा (या dupका लाइसेंस) a पर m, जो अलग है a, इसलिए जब आप संशोधित करते हैं a आपने "वस्तु को संशोधित नहीं किया है" m। इसे देखने का एक तरीका इस प्रकार है:

a = []
m = []
m << a
a << 0
m #=> [[0]]

x = a.dup
m << x
m #=> [[0], [0]]

a << 1
m #=> [[0, 1], [0]]

x << 2
m #=> [[0, 1], [0, 2]]

उत्तर № 3 के लिए 1

सौंपना a एक और सरणी के लिए।

m = []

i = 1
a = []
a[0] = i
a[1] = i + 1
m << a

i += 1
a = []
a[0] = i
a[1] = i + 1
m << a

जवाब के लिए 0 № 4

अगर आपको कुछ उम्मीद थी [[1,2],[2,3]] लूपिंग के बाद, आपको संभवतः रूबी की कार्यक्षमता का उपयोग करना चाहिए .map पाश और एक सरणी लौटने के लिए।

इस तरह से आपको मध्यवर्ती चर (या यहां तक ​​कि, आपके उदाहरण में काउंटर) के प्रबंधन के बारे में चिंता करने की आवश्यकता नहीं होगी:

loop_count = 2 # or whatever currently determines how many loops you make
m = (1..loop_count).map do |i|
[i, i+1]
end

m #=> [[1,2],[2,3]]