2012-09-05 38 views
7

मैं कोड निम्नलिखित संकलित करने के लिए प्रयास करें:std.algorithm.joiner (स्ट्रिंग [], स्ट्रिंग) - क्यों परिणाम तत्व dchar हैं और char नहीं?

import std.algorithm; 
void main() 
{ 
    string[] x = ["ab", "cd", "ef"]; // 'string' is same as 'immutable(char)[]' 
    string space = " "; 
    char z = joiner(x, space).front(); // error 
} 

dmd साथ संकलन त्रुटि के साथ समाप्त होता है:

test.d(8): Error: cannot implicitly convert expression (joiner(x,space).front()) of type dchar to char 

बदलने char zdchar z को त्रुटि संदेश को ठीक करता है, लेकिन क्यों यह में प्रकट होता है मुझे इसमें रुचि है पहले स्थान पर।

joiner(string[],string).front() का परिणाम dchar है और char नहीं?

उत्तर

11

सभी श्रृंखलाएं dchar की सीमाओं के रूप में इलाज कर रहे हैं (प्रलेखन http://dlang.org/phobos/std_algorithm.html#joiner में इस पर कुछ भी नहीं है)। ऐसा इसलिए है क्योंकि dchar को एक कोड बिंदु होने की गारंटी है, क्योंकि यूटीएफ -32 में, प्रत्येक कोड इकाई एक कोड बिंदु है, जबकि यूटीएफ -8 (char) और यूटीएफ -16 (wchar) में, प्रति कोड कोड इकाइयों की संख्या बिंदु बदलता है। इसलिए, यदि आप व्यक्तिगत char एस या wchar एस पर परिचालन कर रहे थे, तो आप पूरे पात्रों के बजाय पात्रों के टुकड़ों पर काम करेंगे, जो बहुत खराब होगा। यदि आप यूनिकोड के बारे में ज्यादा नहीं जानते हैं, तो मैं जोएल स्पॉस्की द्वारा this article पढ़ने की सलाह दूंगा। यह चीजों को काफी अच्छी तरह से बताता है।

किसी भी मामले में, क्योंकि अलग-अलग char और wchar रों पर काम मतलब नहीं है, char और wchar के तार, dchar की सीमाओं (ElementType!stringdchar है) के रूप में इलाज कर रहे हैं जिसका अर्थ है कि जहाँ तक पर्वतमाला संबंध है, उनका length की जरूरत नहीं है (hasLength!stringfalse है - walkLength जरूरतों उनकी लंबाई प्राप्त करने के लिए प्रयोग की जाने वाली), sliceable (hasSlicing!stringfalse है) नहीं हैं, और इंडेक्स करने योग्य नहीं हैं (isRandomAccess!stringfalse है)। इसका यह भी अर्थ है कि किसी भी प्रकार की स्ट्रिंग से नई सीमा बनाने वाली कोई भी चीज़ dchar की एक श्रृंखला में परिणामस्वरूप जा रही है। joiner उनमें से एक है। ऐसे कुछ कार्य हैं जो यूनिकोड और दक्षता के लिए विशेष केस स्ट्रिंग को समझते हैं, लंबाई, टुकड़ा करने और इंडेक्सिंग का लाभ लेते हैं, लेकिन जब तक उनका परिणाम आखिरकार मूल का टुकड़ा नहीं होता है, तो वे जो भी रेंज वापस लौटाते हैं उन्हें बनाना होगा dchar एस।

तो, front वर्णों की किसी भी श्रेणी पर हमेशा dchar होगा, और popFront हमेशा एक पूर्ण कोड बिंदु पॉप आउट करेगा।

यदि आप श्रेणियों के बारे में ज्यादा नहीं जानते हैं, तो मैं this पढ़ने की सलाह दूंगा। यह डी पर एक पुस्तक में एक अध्याय है जो ऑनलाइन है और वर्तमान में हमारे पास श्रेणियों पर सबसे अच्छा ट्यूटोरियल है। हमें वास्तव में dlang.org पर श्रेणियों (जिसमें तारों के साथ काम करते हैं) पर एक उचित लेख प्राप्त करना चाहिए, लेकिन अभी तक इसे लिखने के लिए कोई भी नहीं मिला है। भले ही, आपको कम से कम एक मानक पुस्तकालय (विशेष रूप से std.algorithm) का उपयोग करने में सक्षम होने के लिए श्रेणियों की एक बुनियादी समझ रखने की आवश्यकता होगी, क्योंकि यह उन्हें बहुत भारी उपयोग करता है।