2012-08-11 35 views
6

कोडमैं डी में एक स्ट्रिंग के लिए एक कॉन्स (char) * को संयोजित क्यों नहीं कर सकता?

string bar = "Hello "; 
const(char) * foo = "world!"; 
bar ~= foo; 

तीसरी पंक्ति के संकलित करने के लिए विफल रहता है। क्यूं कर? मेरे पास क्या सुरुचिपूर्ण विकल्प हैं?

त्रुटि आउटपुट Error: cannot append type const(char)* to type string है।

उत्तर

11

const(char)* का उपयोग न करें?

डी में
string bar = "Hello "; 
string foo = "world!"; 
bar ~= foo; 

स्ट्रिंग शाब्दिक प्रकार string के हैं, क्या तुमने कभी एक const(char)* उपयोग करने के लिए, जब सी कोड के साथ इंटरफ़ेस को छोड़कर की जरूरत नहीं होनी चाहिए।

कारण डी क्योंकि const(char)* एक स्ट्रिंग, नहीं है शब्द का कोई अर्थ में कि संयोजन है अनुमति नहीं है। डी में स्ट्रिंग्स immutable(char)[] (जो alias 'डी string द्वारा हैं)। एक const(char)* एक निरंतर चरित्र के लिए सिर्फ एक सूचक है। सी और सी ++ के विपरीत, कोई अंतर्निहित शून्य टर्मिनेटर नहीं है, इसलिए डी यह नहीं मान सकता कि वह एक है।

string bar = "Hello "; 
const(char)* foo = "world!"; 
bar ~= foo[0..strlen(foo)]; 
:

तो जो भी कारण आप पूरी तरह एक const(char)* का उपयोग करना चाहिए और आप जानते हैं कि यह अशक्त समाप्त होता है के लिए है, तो आप टुकड़ा करने की क्रिया है, जो आप तो एक string को संलग्न कर सकते हैं द्वारा एक const(char)[] इसे से बाहर कर सकते हैं

+2

स्लाइसिंग 'foo' आपको' स्ट्रिंग 'नहीं देता है, लेकिन 'const (char) []'। यह अभी भी 'स्ट्रिंग बार' के साथ संयोजन के लिए संगत है, लेकिन यदि आप 'string' चर में 'foo' slicing के परिणाम को संग्रहीत करने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी। –

+0

@jA_cOp: अच्छी तरह से देखा गया, मैं इसे ठीक कर दूंगा। –

+0

स्ट्रिंग तब स्मृति में शून्य-समाप्त हो गई है, या मुझे बार ~ = foo [0..strlen (foo) +1 लिखना चाहिए; सी इंटरऑप के लिए अंतिम पंक्ति में? –

4

stringimmutable(char)[] के लिए उपनाम, यानी, अपरिवर्तनीय वर्णों की एक अस्थायी टुकड़ा है। आपके कोड में bar इस प्रकार का एक सरणी टुकड़ा है।

डी में const(char)* और स्ट्रिंग शाब्दिक के बीच संबंधों को सिर्फ इतना है कि स्ट्रिंग शाब्दिक हमेशा समाप्त अशक्त रहे हैं, और के रूप में आपके द्वारा लिखा गया है या तो immutable(char)[] (अर्थात string), या सी कोड के साथ सुविधाजनक अंतर के लिए immutable(char)*; उत्तरार्द्ध const(char)* पर निहित रूप से परिवर्तनीय है। यह ध्यान रखें कि यह केवल स्ट्रिंग शाब्दिक के लिए मामला है महत्वपूर्ण है: सरणियों जरूरी सामान्य स्थिति में समाप्त अशक्त नहीं कर रहे हैं, और वे ( परोक्ष उनके सूचक बराबर करने के लिए परिवर्तनीय नहीं हैं हालांकि किसी भी टुकड़ा के सदस्य .ptrT[] की है T* टाइप करें और स्लाइस के पहले तत्व को इंगित करें)।

कॉन्सटेनेशन ऑपरेटर सरणी के साथ-साथ उपयोगकर्ता द्वारा परिभाषित प्रकारों को प्रासंगिक ऑपरेटर ओवरलोड के साथ काम करते हैं, और कुछ भी नहीं। चूंकि डी इनबिल्ट प्रकारों के लिए ऑपरेटरों के अधिभार की अनुमति नहीं देता है, इसलिए उन्हें पॉइंटर्स के साथ काम करना संभव नहीं है।

समाधान सूचक अंक के तार का एक टुकड़ा बनाने के लिए, टुकड़ा ऑपरेटर जो एक जैसे सरणियों और संकेत पर काम करता है का उपयोग करना है:

import core.stdc.string : strlen; 

string bar = "Hello "; 
const(char)* foo = "world!"; 
bar ~= foo[0 .. strlen(foo)]; 

ऊपर में, अभिव्यक्ति foo[0 .. strlen(foo)] प्रकार const(char)[] की है , जिसे bar के साथ संयोजित किया जा सकता है, जो कि immutable(char)[] (यानी string) है।