2012-10-22 9 views
5

मैं std.range से टेक फ़ंक्शन के रिटर्न वैल्यू का एक टुकड़ा प्राप्त करने के लिए स्लाइस ऑपरेटर का उपयोग करने का प्रयास कर रहा हूं। मेरे कोड:स्लाइस ले नहीं सकते! डी में std.range से आर?

auto tempChunk = ['a', 'b', 'c', 'd']; 
auto a = tempChunk.take(3); 
writeln(a[0..2]); 

ले लो के रूप में इस मामले में आर सिर्फ चार [] के लिए एक उपनाम है, मैं इस संकलन उम्मीद थी। हालांकि, संकलक मुझे बताता है कि Take!(char[]) cannot be sliced with []। एक और उदाहरण लेते हुए:

int[] arr1 = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; 
auto s = arr.take(5); 
writeln(s[0..4]); 

यह संकलन और एक समस्या के बिना चलेंगे, मुद्रण [1, 2, 3, 4, 5]। मैं इस बिंदु पर पूरी तरह उलझन में हूं कि पहला उदाहरण क्यों काम नहीं करेगा, जबकि दूसरा करता है।

उत्तर

5

टेम्पलेट hasSlicing का उपयोग करता है निर्धारित करने के लिए इनपुट के टुकड़ा के बजाय वापस किया जा सकता है! आर struct ले। वास्तविक वापसी प्रकार जाँच हो रही है ताकि उसे कुछ अतिरिक्त स्पष्ट करता है:

import std.range, std.stdio; 

void main() 
{ 
    auto chararr = ['a', 'b', 'c', 'd']; 
    auto a = chararr.take(3); 
    writeln(typeid(typeof(a))); 

    auto intarr = [ 1, 2, 3, 4 ]; 
    auto b = intarr.take(3); 
    writeln(typeid(typeof(b))); 
} 

// Output: 
// std.range.Take!(char[]).Take 
// int[] 

hasSlicing स्पष्ट रूप से सभी "संकीर्ण तार" के लिए झूठी वापस जाने के लिए निर्देश दिया जाता है - जो है, जो तत्व एक वर्ण का प्रतिनिधित्व नहीं है, लेकिन एक कोड बिंदु (चार और Wchar आधारित वाले)।

अब, जहां मेरी अटकलें शुरू होती हैं, लेकिन मुझे लगता है कि यह विकृत यूटीएफ -8 & टुकड़े टुकड़े का उपयोग कर सह स्ट्रिंग्स को आकस्मिक बनाने से रोकने के लिए किया जाता है। डाचर का उपयोग करने के लिए बेहतर [] यदि आपके पास char [] में कोई वास्तविक आवश्यकता नहीं है।

+0

धन्यवाद, यह इसे साफ़ करता है। हालांकि, टेक स्ट्रक्चर एक ओप इंडेक्स को परिभाषित करता है, फिर भी जब मैं 'readeln (a [0]) आज़माता हूं;', यह काम नहीं करता है। इसका कारण क्या है? – Meta

+1

यह केवल RandomAccessRange के लिए opIndex को परिभाषित करता है, जो संकीर्ण तार नहीं हैं। यह तर्क मैं समझ नहीं पा रहा हूं, ईमानदार होने के नाते, वास्तव में देशी स्लिमिंग के माध्यम से एक यादृच्छिक अभिगम कोड बिंदु सीमा के रूप में संकीर्ण तारों के रूप में _are_ उपयोग योग्य है। यह एक अच्छा सवाल है। –

+1

पीएस मैं डी टैग या डी और डी 2 दोनों का उपयोग करने की सलाह देता हूं, क्योंकि डी फ़ीड के लिए बहुत अधिक लोग सदस्यता लेते हैं। –

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