मैं यह नहीं कह रहा हूं कि Array-> |value,index|और Hash-> |key,value|पागल नहीं है (होरेस लोएब की टिप्पणी देखें), लेकिन मैं कह रहा हूं कि इस व्यवस्था की उम्मीद करने के लिए एक समझदार तरीका है।
जब मैं सरणियों के साथ काम कर रहा हूं, तो मैं सरणी में तत्वों पर ध्यान केंद्रित कर रहा हूं (सूचकांक नहीं, क्योंकि सूचकांक क्षणभंगुर है)। विधि प्रत्येक सूचकांक के साथ है, अर्थात प्रत्येक + सूचकांक, या प्रत्येक, सूचकांक |, या |value,index|। यह भी अनुक्रमणिका के साथ एक वैकल्पिक तर्क के रूप में देखा जा सकता है, उदाहरण के लिए | के बराबर है। मूल्य, सूचकांक = नील | जो मूल्य, सूचकांक के अनुरूप है।
जब मैं हैश के साथ काम कर रहा होता हूं, तो मैं अक्सर मूल्यों की तुलना में कुंजियों पर अधिक ध्यान केंद्रित करता हूं, और मैं आमतौर पर key => valueया तो उस क्रम में कुंजियों और मूल्यों के साथ काम कर रहा हूं hash[key] = value।
यदि आप बत्तख-टाइपिंग चाहते हैं, तो ब्रेंट लॉन्गबोरो के रूप में या तो एक निर्धारित विधि का स्पष्ट रूप से एक परिभाषित विधि का उपयोग करें, या जैसा कि मैक्सकिंस ने दिखाया है।
रूबी प्रोग्रामर को सूट करने के लिए भाषा को समायोजित करने के बारे में है, न कि प्रोग्रामर को भाषा के अनुकूल होने के बारे में। यही कारण है कि बहुत सारे तरीके हैं। किसी चीज के बारे में सोचने के बहुत सारे तरीके हैं। रूबी में, आप सबसे करीबी चुनते हैं और बाकी कोड आमतौर पर बेहद करीने से और संक्षिप्त रूप से बाहर हो जाते हैं।
मूल प्रश्न के रूप में, "रूबी में एक सरणी के माध्यम से पुनरावृति करने के लिए" सही "तरीका क्या है?", ठीक है, मुझे लगता है कि कोर तरीका (यानी शक्तिशाली सिंटैक्टिक चीनी या वस्तु उन्मुख शक्ति के बिना) करना है:
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
लेकिन रूबी शक्तिशाली सिंटैक्टिक शुगर और ऑब्जेक्ट ओरिएंटेड पावर के बारे में है, लेकिन वैसे भी यहाँ हैश के बराबर है, और कुंजियों का आदेश दिया जा सकता है या नहीं:
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
तो, मेरा जवाब है, "रूबी में एक सरणी के माध्यम से पुनरावृति करने का" सही "तरीका आप (यानी प्रोग्रामर या प्रोग्रामिंग टीम) और परियोजना पर निर्भर करता है।" बेहतर रूबी प्रोग्रामर बेहतर विकल्प बनाता है (जिनमें से वाक्यगत शक्ति और / या जो वस्तु उन्मुख दृष्टिकोण है)। बेहतर रूबी प्रोग्रामर अधिक तरीकों की तलाश करना जारी रखता है।
अब, मैं एक और सवाल पूछना चाहता हूं, "रूबी पीछे की ओर एक सीमा के माध्यम से पुनरावृति करने का" सही "तरीका क्या है!" (यह सवाल है कि मैं इस पृष्ठ पर कैसे आया।)
यह करना अच्छा है (आगे के लिए):
(1..10).each{|i| puts "i=#{i}" }
लेकिन मैं ऐसा नहीं करना चाहता (पीछे की तरफ):
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
खैर, मुझे वास्तव में ऐसा करने में कोई आपत्ति नहीं है, लेकिन जब मैं पीछे की ओर जाना सिखा रहा हूं, तो मैं अपने छात्रों को एक अच्छा समरूपता दिखाना चाहता हूं (यानी कम से कम अंतर के साथ, उदाहरण के लिए केवल एक रिवर्स जोड़कर, या चरण -1, लेकिन बिना कुछ और संशोधित करना)। आप (समरूपता के लिए) कर सकते हैं:
(a=*1..10).each{|i| puts "i=#{i}" }
तथा
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
जो मुझे बहुत पसंद नहीं है, लेकिन आप ऐसा नहीं कर सकते
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
आप अंततः कर सकते हैं
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
लेकिन मैं वस्तु उन्मुख दृष्टिकोण (सिर्फ अभी तक) के बजाय शुद्ध रूबी सिखाना चाहता हूं। मैं पीछे की ओर चलना चाहूंगा:
- एक सरणी बनाने के बिना (0..1000000000 पर विचार करें)
- किसी भी रेंज के लिए काम करना
- किसी भी अतिरिक्त वस्तु उन्मुख शक्ति (यानी कोई वर्ग संशोधन) का उपयोग किए बिना
मेरा मानना है कि एक predविधि को परिभाषित किए बिना यह असंभव है , जिसका अर्थ है कि इसका उपयोग करने के लिए श्रेणी वर्ग को संशोधित करना। यदि आप ऐसा कर सकते हैं तो कृपया मुझे बताएं, अन्यथा असंभवता की पुष्टि की जाएगी, हालांकि यह निराशाजनक होगा। शायद रूबी 1.9 इसे संबोधित करता है।
(इसे पढ़ने में अपने समय के लिए धन्यवाद।)
array#each_with_indexउपयोग करता है|value, key|क्योंकि विधि का नाम आदेश का अर्थ है, जबकि वाक्यविन्यास कीhash#eachनकल करने के लिए इस्तेमाल किया गया आदेशhash[key] = value?