2011-09-07 11 views
5

जब मैं लिखने के लिए निम्न कोड:रूबी सरणी अजीब बात (अनंत सरणी)

x= [1,2,3] 
x << x 
puts x 
puts x[3] 
puts x[3][3][3][3][3][3][3][3][3][3] 

मैं इस उत्पादन प्राप्त करें:

[1, 2, 3, [...]] 
[1, 2, 3, [...]] 
[1, 2, 3, [...]] 

मैं नहीं करना चाहिए केवल [1,2,3, [1,2,3]] और स्पष्टीकरण क्या होगा?

उत्तर

10

इस बारे में कुछ भी अजीब बात नहीं है। सरणी का चौथा तत्व सरणी है, इसलिए जब आप चौथे तत्व के लिए पूछते हैं, तो आपको सरणी मिलती है, और जब आप चौथे तत्व के चौथे तत्व के लिए पूछते हैं, तो आपको सरणी मिलती है, और जब आप चौथे के लिए पूछते हैं चौथे तत्व के चौथे तत्व के चौथे तत्व का तत्व ... आपको सरणी मिलती है।

उतना सरल।

केवल थोड़ी असामान्य बात यह है कि Array#to_s इस तरह के रिकर्सन का पता लगाता है और अनंत लूप में जाने के बजाय, एक इलिप्सिस देता है।

+2

रूबी 1.9, 'ऐरे # <=>', '#eql? 'और' # हैश' भी' हैश 'और' स्ट्रक्चर 'के लिए रिकर्सन के साथ सौदा करता है ... सुनिश्चित नहीं है कि आप क्यों विचार करते हैं यह "असामान्य" है! http://blog.marc-andre.ca/2009/05/lost-in-recursion.html –

+0

मुझे नहीं लगता कि "असीमित रिकर्सिव स्व-रेफरेंसियल सरणी" एक सामान्य उपयोग केस है जो सामान्य प्रोग्रामर इस पर विचार करेगा: -) मैंने 'to_s' कार्यान्वयन के अपने हिस्से को लिखा है, लेकिन मैंने कभी * के लिए विशेष आवरण नहीं माना। अगर कोई अनंत डेटा संरचना के स्ट्रिंग प्रस्तुति के लिए पूछता है, तो उन्हें अनंत लूप मिलेगा। अवधि। मेरा मतलब है, एक अनंत 'एन्युमरेटर' के लिए 'नक्शा' एक असीमित बड़ी सरणी देता है, और कोई भी इसके बारे में दो बार नहीं सोचता है, क्या यह कुछ हद तक समान नहीं है? –

+0

मुझे लगता है कि यह अच्छा है कि रूबी अच्छी तरह से रिकर्सिव संरचनाओं से संबंधित है। मुझे यकीन नहीं है कि वे बहुत असामान्य हैं, उदा। संरचनाएं जो उनके माता-पिता और बच्चों को पकड़ती हैं। यदि यह मामला नहीं था, तो स्मृति गणना को संभालने के लिए रेफ गिनती की आवश्यकता होगी :-) –

7

जब आप x << x लिखते हैं तो आप x को अपने संदर्भ के साथ जोड़ रहे हैं, एक रिकर्सिव/अनंत सरणी बनाते हैं।

x << x.dup के साथ इसकी तुलना करें जो x की प्रति x पर प्रतिलिपि बनाता है। यह [1,2,3,[1,2,3]]

+0

हाँ यह सही है, लेकिन अगर मैं 'x + = x' लिख रहा था, तो यह वही नहीं होना चाहिए? मेरा मतलब है कि एक अन्य प्रकार की रिकर्सिव सरणी बनाना। – Dragos

+0

'x + = x'' x = x + x' के समतुल्य है, जिसका अर्थ है 'x' से तत्वों के साथ' x' से तत्वों में शामिल होकर एक नया सरणी बनाएं और फिर 'x' को इस नव निर्मित सरणी को संदर्भित करें तो आप '[1, 2, 3, 1, 2, 3]' के साथ समाप्त होते हैं। '<<' किसी ऑब्जेक्ट के अंत में दिए गए ऑब्जेक्ट को धक्का देता है (कोई नई सरणी नहीं बनाई गई है।) [डॉक्स के लिए +] देखें (http://www.ruby-doc.org/core/classes/Array.html# एम 000271) और [<<] के लिए दस्तावेज़ (http://www.ruby-doc.org/core/classes/Array.html#M000225)। – mikej

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