आपके पास char
की स्थिर सरणी है। आप इसे उस फ़ंक्शन में पास करना चाहते हैं जो immutable(char)[]
लेता है। केवल ऐसा करने के लिए बिना किसी भी आवंटन के तरीके को कास्ट करना है। इसके बारे में सोचो। आप जो चाहते हैं वह एक प्रकार है जैसे कि यह एक और है। यही वह कास्टिंग करता है। आप इसे करने के लिए assumeUnique
का उपयोग करना चुन सकते हैं, क्योंकि यह वास्तव में वह कलाकार है जिसे आप ढूंढ रहे हैं, लेकिन क्या वह वास्तव में आपको कुछ भी लाभ पहुंचाता है। इसका मुख्य उद्देश्य यह दस्तावेज करना है कि आप कलाकारों द्वारा किए जा रहे मूल्य को immutable
के रूप में माना जा सकता है और इसमें कोई अन्य संदर्भ नहीं है। अपने उदाहरण को देखते हुए, यह अनिवार्य रूप से सच है, क्योंकि यह फ़ंक्शन में आखिरी चीज है, लेकिन चाहे आप इसे सामान्य रूप से करना चाहते हैं, आप पर निर्भर है।यह देखते हुए कि यह एक स्थैतिक सरणी है जो आपके द्वारा खराब होने पर स्मृति समस्याओं का जोखिम उठाती है और आप इसे किसी फ़ंक्शन पर पास करते हैं जो इसे संदर्भित करने के संदर्भ में अनुमति देता है, मुझे यकीन नहीं है कि assumeUnique
सबसे अच्छा विकल्प है। लेकिन फिर, यह आप पर निर्भर है।
भले ही, यदि आप एक कलाकार कर रहे हैं (चाहे वह स्पष्ट रूप से हो या assumeUnique
के साथ), तो आपको यह सुनिश्चित करने की आवश्यकता है कि जिस कार्य को आप पास कर रहे हैं वह उस डेटा के संदर्भ को रिसाव नहीं करेगा जो आप हैं इसे पास करना यदि ऐसा होता है, तो आप परेशानी के लिए पूछ रहे हैं।
अन्य समाधान, निश्चित रूप से, फ़ंक्शन को बदलना है ताकि इसे const(char)[]
लगे, लेकिन यह अभी भी आपके द्वारा गुज़रने वाले डेटा के संदर्भों को लीक करने का जोखिम चलाता है। इसलिए, आपको अभी भी निश्चित होना चाहिए वास्तव में क्या कार्य करने जा रहा है। यदि यह pure
है, तो const(char)[]
(या कुछ भी जो const(char)[]
हो सकता है) वापस नहीं लौटाता है, और कोई भी तरीका नहीं है कि यह किसी भी फ़ंक्शन के अन्य तर्कों के माध्यम से रिसाव कर सकता है, तो आप सुरक्षित हैं, लेकिन यदि उनमें से कोई भी सत्य नहीं है , तो आपको सावधान रहना होगा। तो, आखिरकार, मेरा मानना है कि string
पर कास्टिंग करने के बजाय const(char)[]
का उपयोग करने वाले सभी वास्तव में आपको खरीदते हैं कि आपको नहीं डालना है। यह अभी भी बेहतर है, क्योंकि यह कास्ट को खराब करने के जोखिम से बचाता है (और जब आप कर सकते हैं तो कास्टिंग से बचने के लिए सामान्य रूप से बेहतर होता है), लेकिन आपके पास अभी भी वही चीजें हैं जो संदर्भों से बचने के संबंध में चिंता करने के लिए हैं।
बेशक, यह भी आवश्यक है कि आप उस हस्ताक्षर को बदलने के लिए फ़ंक्शन को बदल सकें जो आप चाहते हैं। यदि आप ऐसा नहीं कर सकते हैं, तो आपको कास्ट करना होगा। मेरा मानना है कि इस बिंदु पर, फोबोस के स्ट्रिंग-आधारित कार्यों के अधिकांश को बदल दिया गया है ताकि वे स्ट्रिंग प्रकार पर टेम्पलेट हो जाएं। तो, फोबोस के साथ अब यह एक समस्या से कम होना चाहिए। कुछ फ़ंक्शंस (विशेष रूप से, std.file में), अभी भी templatized होने की आवश्यकता है, लेकिन आखिरकार, फोबोस में फ़ंक्शन जो string
की आवश्यकता होती है, विशेष रूप से काफी दुर्लभ होनी चाहिए और इसकी आवश्यकता के लिए एक अच्छा कारण होगा।
आखिरकार, समस्या यह है कि आप एक स्थिर सरणी का इलाज करने की कोशिश कर रहे हैं जैसे कि यह एक गतिशील सरणी था, और जबकि डी निश्चित रूप से आपको ऐसा करने देता है, तो आप ऐसा करने में एक निश्चित जोखिम ले रहे हैं, और आप यह सुनिश्चित करने की आवश्यकता है कि आपके द्वारा उपयोग किए जा रहे कार्यों को स्थानीय डेटा के किसी भी संदर्भ को रिसाव न करें जो आप उन्हें पास कर रहे हैं।
हेरेसी, पाखंडी! 'Snprintf' का प्रयोग करें! : डी – BCS
मुझे लगता है कि # 3 वास्तव में सही समाधान है। स्ट्रिंग -> अपरिवर्तनीय (char) [] का अर्थ है कि डेटा नहीं बदला जा सकता है (जब तक कि यह अभी भी कहीं भी संदर्भित है, अन्यथा जीसी इसे इकट्ठा करने की अनुमति है, AFAIK)। मुझे नहीं लगता कि आप कभी भी स्टैक-आवंटित डेटा के लिए ऐसी गारंटी दे सकते हैं। लेकिन जब तक रेंडर टेक्स्ट को वास्तव में कहीं भी टेक्स्ट स्टोर करने की आवश्यकता नहीं होती है, तो इसे कॉन्स (char) [] का उपयोग करना चाहिए। चूंकि अपरिवर्तनीय स्थिरता से मजबूत है, इसे केवल तभी उपयोग किया जाना चाहिए जब आवश्यक हो। मैं सहमत हूं, हालांकि फोबोस में कई फ़ंक्शन अस्थिर रूप से कॉन्स्ट (char) [] के बजाय स्ट्रिंग लेते हैं, जिन्हें फ़ोबोस में ठीक किया जाना चाहिए। – jpf
@jpf: मैं 100% सहमत हूं। –