मुझे गैरी राइट द्वारा स्पष्टीकरण भी बहुत उपयोगी लगा।
http://www.ruby-forum.com/topic/1393096#990065
गैरी राइट का जवाब है -
http://www.ruby-doc.org/core/classes/Array.html
डॉक्स निश्चित रूप से अधिक स्पष्ट हो सकते हैं लेकिन वास्तविक व्यवहार आत्मनिर्भर और उपयोगी है। नोट: मैं स्ट्रिंग का 1.9.X संस्करण मान रहा हूं।
यह निम्नलिखित तरीके से नंबरिंग पर विचार करने में मदद करता है:
-4 -3 -2 -1 <-- numbering for single argument indexing
0 1 2 3
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
0 1 2 3 4 <-- numbering for two argument indexing or start of range
-4 -3 -2 -1
सामान्य (और समझने योग्य) गलती यह भी मानती है कि एकल तर्क सूचकांक के शब्दार्थ दो तर्क परिदृश्य (या श्रेणी) में पहले तर्क के शब्दार्थ के समान हैं
। वे व्यवहार में एक ही चीज नहीं हैं और प्रलेखन यह प्रतिबिंबित नहीं करता है। हालांकि त्रुटि निश्चित रूप से प्रलेखन में है और कार्यान्वयन में नहीं है:
एकल तर्क: सूचकांक स्ट्रिंग के भीतर एक एकल वर्ण स्थिति का प्रतिनिधित्व करता है। इसका परिणाम इंडेक्स या नील में पाया जाने वाला सिंगल कैरेक्टर स्ट्रिंग है क्योंकि दिए गए इंडेक्स में कोई कैरेक्टर नहीं है।
s = ""
s[0] # nil because no character at that position
s = "abcd"
s[0] # "a"
s[-4] # "a"
s[-5] # nil, no characters before the first one
दो पूर्णांक तर्क: तर्क स्ट्रिंग के एक हिस्से को निकालने या बदलने के लिए पहचानते हैं। विशेष रूप से, स्ट्रिंग के शून्य-चौड़ाई वाले हिस्से को भी पहचाना जा सकता है ताकि स्ट्रिंग के सामने या अंत सहित मौजूदा पात्रों के पहले या बाद में पाठ डाला जा सके। इस स्थिति में, पहला तर्क किसी वर्ण स्थिति की पहचान नहीं करता है, बल्कि वर्णों के बीच की जगह की पहचान करता है जैसा कि ऊपर चित्र में दिखाया गया है। दूसरा तर्क लंबाई है, जो 0 हो सकता है।
s = "abcd" # each example below assumes s is reset to "abcd"
To insert text before 'a': s[0,0] = "X" # "Xabcd"
To insert text after 'd': s[4,0] = "Z" # "abcdZ"
To replace first two characters: s[0,2] = "AB" # "ABcd"
To replace last two characters: s[-2,2] = "CD" # "abCD"
To replace middle two characters: s[1..3] = "XX" # "aXXd"
एक श्रेणी का व्यवहार बहुत दिलचस्प है। शुरुआती बिंदु पहले तर्क के समान है जब दो तर्क प्रदान किए जाते हैं (जैसा कि ऊपर वर्णित है), लेकिन सीमा का अंतिम बिंदु एकल अनुक्रमित या "किनारे की स्थिति" के रूप में दो पूर्णांक तर्कों के साथ 'वर्ण स्थिति' हो सकता है। यह अंतर इस बात से निर्धारित होता है कि डबल-डॉट रेंज या ट्रिपल-डॉट रेंज का उपयोग किया जाता है या नहीं:
s = "abcd"
s[1..1] # "b"
s[1..1] = "X" # "aXcd"
s[1...1] # ""
s[1...1] = "X" # "aXbcd", the range specifies a zero-width portion of
the string
s[1..3] # "bcd"
s[1..3] = "X" # "aX", positions 1, 2, and 3 are replaced.
s[1...3] # "bc"
s[1...3] = "X" # "aXd", positions 1, 2, but not quite 3 are replaced.
यदि आप इन उदाहरणों के माध्यम से वापस जाते हैं और डबल या श्रेणी अनुक्रमण उदाहरणों के लिए सिंगल इंडेक्स शब्दार्थ का उपयोग करने पर जोर देते हैं तो आप भ्रमित हो जाएंगे। आपको वास्तविक व्यवहार को मॉडल करने के लिए ascii आरेख में प्रदर्शित वैकल्पिक नंबरिंग का उपयोग करने के लिए मिला है।