अगर मैं लिखनासंकलन समय मूल्यांकन
enum chars = digits ~ uppercase;
स्ट्रिंग संकलन समय पर श्रेणीबद्ध किया जाएगा? मुझे लगता है कि यह होगा। यदि मैं इसे एक स्ट्रिंग अक्षर या सीटीएफई फ़ंक्शन के साथ प्रतिस्थापित करता हूं तो मैं किसी भी महत्वपूर्ण प्रदर्शन अंतर को माप नहीं सकता (यहां तक कि इसे सौ मिलियन बार भी बुला रहा हूं)। अगर मैं कॉन्स के साथ enum को प्रतिस्थापित करता हूं तो मुझे एक फर्क पड़ता है। मुझे बताया गया है कि इसे इस तरह लिखने में अक्षम है। मैंने सोचा कि यह सुविधाजनक था और मुझे अक्षमता दिखाई नहीं दे रही है। (बीटीडब्ल्यू, रेखा एक समारोह में है जिसे रिकर्सिवली कहा जाता है)।
पूर्ण कोड
import std.string;
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
static string sign;
if (n < 0) {
n *= -1;
sign = "-";
}
enum chars = digits ~ uppercase;
size_t r = cast(size_t)(n % b);
if (n == r) {
return sign ~ chars[r];
}
return toBase((n - r)/b, b) ~ chars[r];
}
संपादित करें (एक अलग आधार के साथ एक अंक प्रणाली को बदलने): अपडेट किए गए कोड, टिप्पणी के जवाब में, सवाल
string toBase(long n, int b)
in {
assert(2 <= b && b <= 35);
} body {
enum chars = digits ~ uppercase;
long r = n % b;
char c = chars[cast(size_t) abs(r)];
if (n == r) {
return (n < 0 ? "-" : "") ~ c;
}
return toBase((n - r)/b, b) ~ c;
}
आप साइन स्ट्रिंग को रीसेट करने के लिए भूल गए हैं (आप 'स्कोप (निकास) साइन = "" का उपयोग कर सकते हैं; "इसके लिए' toBase (-10,10) '' toBase (10,10) 'दे देंगे एक ही परिणाम –
सही। हा हा हा, पहली बार मैं एक स्थिर चर का उपयोग करें। मुश्किल। वह गुंजाइश (निकास) चीज वास्तव में उपयोगी है ना? मुझे आश्चर्य है कि एक रिकर्सिव कॉल एक गुंजाइश निकास के रूप में योग्य नहीं है। – fwend
एक स्कोप (निकास) निष्पादित किया जाता है जब वर्तमान स्टैक फ्रेम स्टैक से पॉप किया जाता है (जैसे प्रयास करें ... आखिर में वास्तव में लेकिन बिना अतिरिक्त इंडेंटेशन के) रिकर्सन ऐसा नहीं करता है –