2012-05-03 9 views
6

का परिणाम क्या कोई कह सकता है कि std.algorithm.map रिटर्न? (कुछ प्रलेखन पेज के लिए लिंक बहुत सराहना की जाएगी) त्रुटि संदेश से अपने परिणाम प्रकार Resultstd.algorithm.map

ulong[] x = [1,2,3]; 
ulong[] y = std.algorithm.map!"a"(x); // Error: cannot implicitly convert <..> of type Result to ulong[] 

की है http://dlang.org/phobos/std_algorithm.html#map में इस पर काफी छोटे से जानकारी है: यह ऐसा नहीं है से

The call map!(fun)(range) returns a range of which elements are obtained by applying fun(x) left to right for all x in range 

स्पष्ट, मैं इसके साथ क्या कर सकता हूं या नहीं कर सकता।

उत्तर

7

आपको पता नहीं होना चाहिए कि std.algorithm.map इस तथ्य से परे लौटता है कि यह एक ही शैली की एक श्रृंखला है (आगे, द्विपक्षीय, यादृच्छिक, आदि)। यह अधिकांश रेंज-आधारित कार्यों के साथ है। वे लगभग हमेशा एक नई रेंज लौटते हैं जो पारित किए गए एक या उसी प्रकार की रेंज को लपेटता है जैसा कि पारित किया गया था (उदा। map पूर्व करता है; find उत्तरार्द्ध करता है)। auto का उपयोग करें:

ulong[] x = [1, 2, 3]; 
auto y = map!"a"(x); 

रेंज map द्वारा दिया आलसी है। यह तब तक कुछ नहीं करता जब तक कि आप इसे फिर से चालू न करें (फिर यह अंतर्निहित सीमा के प्रत्येक क्रमिक front पर दिए गए फ़ंक्शन को कॉल करता है)। यह उस तरह से अधिक कुशल है (साथ ही अनंत श्रेणियों को सक्षम करना)। सटीक रिटर्न प्रकार आपके द्वारा पारित श्रेणी के प्रकार पर निर्भर करता है और map पर स्थानीय है ताकि आप सीधे एक नहीं बना सकें।

typeof(map!"a"(x)) y = map!"a"(x); 

हालांकि, अगर आप आम तौर पर केवल typeof का उपयोग जब आप एक चर जो आप सीधे प्रारंभ नहीं कर सकते हैं की जरूरत है: आप प्रकार प्राप्त करने के लिए या तो auto का उपयोग करने के प्रकार या typeof अनुमान लगाने के लिए की जरूरत है। auto लगभग हमेशा जाने का तरीका है।

आप map का परिणाम से एक सरणी बनाने के लिए की जरूरत है (या किसी अन्य श्रृंखला से), तो std.array.array का उपयोग करें:

ulong[] y = array(map!"a"(x)); 

आप सीमाओं के बारे में ज्यादा पता नहीं है, तो आप शायद पढ़ना चाहिए this। दुर्भाग्यवश, वर्तमान में dlang.org पर एक लेख नहीं है, लेकिन यह लिंक एक पुस्तक में एक अध्याय के लिए है, जिसे डी समुदाय के सदस्यों में से एक ने तुर्की में लिखा था और अंग्रेजी में अनुवाद कर रहा है, और इसमें काफी सीमाएं शामिल हैं कुंआ।

संपादित:

वाल्टर तेज हाल ही में विशेष रूप से प्रकार है जो एक समारोह के लिए स्थानीय लेकिन समारोह जो भी मदद मिल सकती आप प्रबुद्ध द्वारा लौटाए गए हैं के बारे में एक लेख लिखा था। उन्हें एक अच्छा नाम भी मिलता है: Voldemort Types in D

+0

"आपको पता या देखभाल नहीं की जानी चाहिए"। अगर मैं गलत हूं, तो कृपया मुझे सही करें, लेकिन अगर मुझे पता/देखभाल नहीं करना चाहिए, तो मेरा उदाहरण – dnsmkl

+1

संकलित करना चाहिए मेरा मतलब है कि आपको यह नहीं पता होना चाहिए या उस पर ध्यान देना चाहिए कि आपको इसके बारे में जानने की जरूरत है कि यह एक श्रृंखला है एक ही शैली में पारित होने के समान ही। सटीक प्रकार 'मानचित्र' के लिए विशिष्ट है और ऐसा कुछ नहीं जिसे आप उपयोग करने जा रहे हैं। आप इस प्रकार का अनुमान लगाने के लिए 'ऑटो' का उपयोग करते हैं और एपीआई के साथ सीमा का उपयोग करते हैं। यदि आप इसे वास्तव में एक विशिष्ट प्रकार के रूप में चाहते हैं, तो आपको इसे उस प्रकार के रूप में परिवर्तित करना होगा जिसमें एक सीमा होती है और वह प्रकार उत्पन्न करेगा जो आप चाहते हैं (उदा। Std.array.array)। –

+0

यह अप्राकृतिक लगता है कि मैप के परिणाम का उपयोग करने के लिए मुझे 'ऑटो' का उपयोग करने के लिए मजबूर किया गया है (भले ही मुझे लाज़ी eval और सामान पसंद है) वैसे भी, उत्तर के लिए धन्यवाद और लिंक – dnsmkl

3

परिणाम सीमा 'आलसी' है, यह अंतिम परिणाम का प्रतिनिधित्व नहीं करती है।

यह एक सरणी में तब्दील किया जा सकता है अगर आप std.array आयात और इतने की तरह लपेट:

ulong[] y = array(std.algorithm.map!"a"(x)); 

या

ulong[] y = std.algorithm.map!"a"(x).array; 

यदि आप उपयोग कर रहे हैं डीएमडी 2.059 या बाद में

नक्शा परिणाम सीधे foreach के साथ भी पुनरावृत्त किया जा सकता है:

auto result = std.algorithm.map!"a"(x); 
foreach (element; result) 
    writeln(to!string(element)); 
+0

2.05 या बाद में क्यों? यह उम्र के लिए काम किया है। –

+0

@ जोनाथन वह यूएफसीएस नोटेशन – fwend

+0

पर प्रतिक्रिया दे रहा है आह, ठीक है। मैंने गलत समझा और सोचा कि "डीएमडी 2.059 या बाद में" उसके बाद के हिस्से का जिक्र कर रहा था। 'सरणी' में वास्तव में अभी भी माता-पिता होना चाहिए, हालांकि यह '-प्रोपर्टी' के साथ संकलित नहीं होगा (और '-प्रोपर्टी' को अंततः सामान्य व्यवहार बनना चाहिए, जिससे माता-पिता को यहां आवश्यकता होती है, क्योंकि 'सरणी' नहीं है सम्पत्ति)। –

1

Resultmap() के अंदर एक प्रकार है जिसका नाम नहीं दिया जा सकता क्योंकि यह Voldemort Type है।

template map(fun...) if (fun.length >= 1) 
{ 
    auto map(Range)(Range r) if (isInputRange!(Unqual!Range)) 
    { 
     //... 
     struct Result 
     { 
      //... 
     } 
     return Result(r); 
    } 
} 

आप स्रोत कोड का अध्ययन करते तो आप देखेंगे कि Result एक सीमा है, लेकिन कुछ भी नहीं है: यह सामान्य popFront() और empty() तरीकों है, और अन्य तरीकों

वास्तविक source code फोबोस में कुछ इस तरह दिखता लौटने की जरूरत है कि किस तरह की सीमा के आधार पर। आप प्रकार निष्कर्ष उपयोग करते हैं,

auto r = map!("a*a")(data); 

rResult के रूप में टाइप किया जा जाएगा, लेकिन आप इसे सीधे का दृष्टांत नहीं कर सकते।