2013-12-14 9 views
14

कोड '////'.split('/') परिणाम [] में परिणाम। जबकि मुझे उम्मीद है कि यह ['', '', '', '', ''] होगा। यदि यह रूबी की एक विशेषता है, तो ऐसा क्यों डिज़ाइन किया गया है?'////'.split('/') क्यों उत्पादन करता है []?

+0

+1 .. एक अच्छा सवाल पूछने के लिए ... :) –

+2

हालांकि सवाल दिलचस्प है, यह सबसे अच्छा रूप में नहीं है जिसे पूछा जा सकता था। आपका प्रश्न पाठक को गुमराह कर सकता है कि इस प्रभाव के लिए लगातार चार स्लेश महत्वपूर्ण हैं, लेकिन ऐसा नहीं है। आपको छोटे स्लैश अनुक्रम के साथ एक ही परिणाम मिल जाएगा। – sawa

उत्तर

3

यह डिज़ाइन पिछली डिलीमीटर के साथ तारों को पार्स करने की सुविधा प्रदान करता है। उदाहरण के लिए:

'1␣2␣3␣␣'.split('␣') अब ['1', '2', '3', '', ''] के बजाय ['1', '2', '3'] दे देंगे।

यह सुविधा केवल वर्कफ़्लो के सरलीकरण के लिए है।

हालांकि, मुझे यह सुविधा पसंद नहीं है क्योंकि यह इस विधि की शुद्धता को तोड़ती है। उपरोक्त प्रभाव को प्राप्त करने के लिए, आपको '1␣2␣3␣␣' और split('␣') के बीच अतिरिक्त rstrip('␣') की आवश्यकता है।

+8

'('␣') 'प्यारा लग रहा है। –

17

आप डेलीमीटर द्वारा डिलीमीटरों की स्ट्रिंग को विभाजित नहीं कर सकते हैं।

आप समारोह विभाजित करने के लिए इस व्यवहार

'////'.split('/',-1) 
=> 
["", "", "", "", ""] 

प्राप्त करने के लिए सीमा पैरामीटर शामिल न करने पर दूसरा पैरामीटर के रूप में सीमा पास करना चाहिए अनुगामी रिक्त क्षेत्रों को दबा दिया जाता है। यदि सीमा एक सकारात्मक संख्या है, तो अधिकतर फ़ील्ड लौटा दी जाएंगी (यदि सीमा 1 है, तो संपूर्ण स्ट्रिंग को सरणी में एकमात्र प्रविष्टि के रूप में वापस कर दिया जाता है)। यदि ऋणात्मक है, तो लौटाए गए फ़ील्ड की संख्या की कोई सीमा नहीं है, और पीछे के नल फ़ील्ड को दबाया नहीं जाता है

+2

* + 1 * .. मैंने किया ... :) लेकिन आप [डॉक्टर] से http://www.ruby-doc.org/core-2.0.0/String.html#method-i- विभाजित) जैसे - ** यदि सीमा पैरामीटर छोड़ा गया है, तो पीछे वाले क्षेत्रों को पीछे छोड़ दिया जाता है **। यदि सीमा एक सकारात्मक संख्या है, तो अधिकतर फ़ील्ड लौटा दी जाएंगी (यदि सीमा 1 है, तो संपूर्ण स्ट्रिंग को सरणी में एकमात्र प्रविष्टि के रूप में वापस कर दिया जाता है)। ** यदि ऋणात्मक है, तो लौटाए गए फ़ील्ड की संख्या की कोई सीमा नहीं है, और पीछे के नल फ़ील्ड को दबाया नहीं जाता है। ** –

+0

धन्यवाद। वास्तव में उपयोगी टिप्पणी। – SergeyKutsko

10

split विधि के व्यवहार की जांच से पता चलता है कि यह अनुकूलन का परिणाम है, यह केवल अंतिम मैच के बाद रिक्त सरणी तत्वों को फसल करता है नीचे दिखाया गया है:

'////'.split('/') 
=> [] 

'//a//'.split('/') 
=> ["", "", "a"] 
संबंधित मुद्दे