2013-04-30 6 views
6

मैं सिर्फ String#split साथ निम्नलिखित अजीब व्यवहार की खोज:विभाजन (') क्यों (स्मार्ट) होने का प्रयास कर रहा है?

"a\tb c\nd".split 
=> ["a", "b", "c", "d"] 

"a\tb c\nd".split(' ') 
=> ["a", "b", "c", "d"] 

"a\tb c\nd".split(/ /) 
=> ["a\tb", "c\nd"] 

The source (2.0.0 से string.c) 200 से अधिक लाइनों लंबा है और इस तरह एक मार्ग शामिल हैं:

/* L 5909 */ 
else if (rb_enc_asciicompat(enc2) == 1) { 
    if (RSTRING_LEN(spat) == 1 && RSTRING_PTR(spat)[0] == ' '){ 
     split_type = awk; 
    } 
} 

बाद में, awk विभाजन प्रकार के लिए कोड में, वास्तविक तर्क का भी उपयोग नहीं किया जाता है और यह एक सादा split के समान है।

  • क्या कोई और महसूस करता है कि यह किसी तरह टूटा हुआ है?
  • क्या इसके लिए अच्छे कारण हैं?
  • क्या ऐसा लगता है कि "जादू" रूबी में ज्यादातर लोगों के विचार से अधिक बार होता है? बाहर documentation
+0

ऐसा कुछ क्यों है जो "बहुत स्मार्ट" है? यह एक इच्छित डिफ़ॉल्ट व्यवहार है जिसे आप ओवरराइड कर सकते हैं यदि आप इसे विभाजित पाठ के लिए उपयोग करने के लिए वैकल्पिक पैटर्न पास करके चुनते हैं। –

+0

बहुत स्मार्ट के साथ मेरा मतलब है रूबी अनुमान है कि मैं सभी सफेद जगहों पर विभाजित करना चाहता हूं, जहां मैं सचमुच इसे रिक्त स्थान पर विभाजित करने के लिए कह रहा हूं। –

+0

मैं इस प्रश्न को बंद करने के लिए वोट देने जा रहा हूं क्योंकि मुझे यह महसूस हो रहा है कि शायद इस प्रश्न का सामान्य, संतोषजनक उत्तर नहीं है। आपके सभी उत्तरों और टिप्पणियों के लिए धन्यवाद! –

उत्तर

4

यह पर्ल के split() व्यवहार के साथ संगत है। जो बदले में Gnu awk'ssplit() पर आधारित है। तो यह यूनिक्स में उत्पत्ति के साथ एक लंबी अवधि की परंपरा है।

एक और विशेष मामले के रूप में, विभाजन कमांड लाइन टूल awk के डिफ़ॉल्ट व्यवहार को जब पद्धति या तो छोड़ दिया जाता है या एक शाब्दिक एक भी अंतरिक्ष चरित्र की रचना की स्ट्रिंग emulates:

से perldoc split पर

(जैसे '' या "\ x20", लेकिन उदाहरण नहीं//)। इस मामले में, EXPR में कोई अग्रणी व्हाइटस्पेस विभाजन से पहले हटा दिया गया है, और इसके बाद PATTERN को के रूप में माना जाता है यदि यह/\ + था; विशेष रूप से, इसका मतलब है कि किसी भी संगत व्हाइटस्पेस (केवल एक ही स्थान चरित्र नहीं) को विभाजक के रूप में उपयोग किया जाता है। हालांकि, इस विशेष उपचार को स्ट्रिंग के बजाय पैटर्न// निर्दिष्ट करके "/" केवल स्पेस कैरेक्टर को विभाजक होने की अनुमति देकर बचाया जा सकता है।

+1

मैंने पर्ल के विभाजन के साथ थोड़ा सा खेला और देखा कि यह वास्तव में पर्ल में समझ में आता है, क्योंकि इसे तर्क की आवश्यकता है। एक खाली स्ट्रिंग काम नहीं करेगी क्योंकि यह एक और विशेष मामला है (रूबी में वर्णों की एक सरणी देता है)। पर्ल में तर्क के बिना विभाजन को कॉल करने की सबसे नज़दीकी बात 'विभाजित (अपरिचित, $ str)' थी, लेकिन यह वास्तव में 'विभाजन (' ', $ str)' की तरह व्यवहार करती है, जैसे 'विभाजन (' ', $ str)' मुझे लगता है कि यह काफी संगत नहीं है :)। आखिरकार, इस बारे में बहस करते हुए कि चीजें इस तरह क्यों हैं और पेर्ल में पहले से ही बहुत पहले किया गया था इसलिए मैं यहां रुक जाऊंगा :) –

+0

आपका उत्तर अभी भी सबसे अच्छा है इसलिए मैं इसे स्वीकार करूंगा। धन्यवाद! –

+0

दिलचस्प इतिहास। – davogones

2

चेक, विशेष रूप से इस हिस्से:

तो पैटर्न, एक स्ट्रिंग है जब str बंटवारे तो इसकी सामग्री सीमांकक के रूप में इस्तेमाल कर रहे हैं। यदि पैटर्न एक ही स्थान है, तो str को व्हाइटस्पेस पर विभाजित किया गया है, जिसमें अग्रणी व्हाइटस्पेस और संगत व्हाइटस्पेस वर्णों के दृश्यों को अनदेखा किया गया है।

यदि पैटर्न छोड़ा गया है, तो $ का मूल्य; प्रयोग किया जाता है। अगर $; शून्य है (जो डिफ़ॉल्ट है), str को व्हाइटस्पेस पर विभाजित किया गया है जैसे कि '' निर्दिष्ट किया गया था।

आप स्ट्रिंग को विभाजित करने के लिए regexp का उपयोग कर सकते हैं।

+0

धन्यवाद! मैंने प्रलेखन पढ़ा है। मेरा सवाल अधिक है "क्या हमें जाना चाहिए और इसे ठीक करना चाहिए, या इसके लिए कोई अच्छा कारण है?" –

+0

कम से कम हम जानते हैं कि इसका इरादा है। हम इस कारण को खोजने का प्रयास कर सकते हैं कि मैटज़ ने क्यों डिज़ाइन किया था, और हम यह भी दावा कर सकते हैं कि यह अजीब है। लेकिन आप "जाओ और इसे ठीक नहीं कर सकते"। जो भी तय करता है वह मैटज़ है। – sawa

+0

बेशक मैट एमआरआई के भविष्य के बारे में फैसला करता है। लेकिन हम अभी भी संभावित सुधारों पर एक बिंदु तक चल सकते हैं;) –

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

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