2012-03-09 18 views
8

साथ कहा जा सकता है मैं में निम्नलिखित सी ++वहाँ उस के लिए डेल्फी में एक foreach सामान्य विधि गुमनाम समारोह

for_each(vec->begin(), vec->end(), [](int n){cout << n << " " << endl;}); 

मैं डेल्फी में एक ही/समान करना चाहते हैं कुछ कर सकते हैं। मैंने question से पहले सी ++ डेवलपर्स से पूछा, और ओओपी पास्कल में इसी तरह का उदाहरण बनाना चाहता था। प्रश्न का लैम्ब्डा (अज्ञात विधि) हिस्सा वास्तव में प्रासंगिक नहीं है, लेकिन मैं सोच रहा था कि क्या मैं डेल्फी XE2 में ऐसा कर सकता हूं।

मैं पूछ रहा हूं क्योंकि मेरे पास XE है, और मुझे यकीन नहीं है कि यह जोड़ा गया है या नहीं। धन्यवाद।

उत्तर

6

शायद std::vector<T> पर निकटतम डेल्फी एनालॉग TList<T> है। आप एक for in पाश के साथ सूची पर पुनरावृति कर सकते हैं:

var 
    Item: Integer; 
    List: TList<Integer>; 
.... 
for Item in List do 
    Writeln(Item); 

आप एक गतिशील सरणी है बल्कि एक TList<T> से तो आप for in उपयोग कर सकते हैं तत्वों से अधिक पुनरावृति करने के लिए है। वास्तव में, सभी निर्मित कंटेनर for in का समर्थन करते हैं और for in के लिए अपनी कक्षाओं में समर्थन जोड़ना आसान है।

सी ++ में for in लूप की तरह कुछ भी नहीं है और इसलिए मुहावरे एसटीएल एल्गोरिदम का उपयोग करना है। यह आपको अज्ञात फ़ंक्शन का उपयोग करने के लिए प्रेरित करता है। डेल्फी में for in सिंटैक्स के साथ आप अज्ञात तरीकों का उपयोग किये बिना प्राकृतिक तरीके से "कंटेनर के सभी सदस्यों पर फिर से सक्रिय" व्यक्त कर सकते हैं।

जेनेरिक डेल्फी 200 9 में डेल्फी में जोड़े गए थे और for in लूप को डेल्फी 2005 में जोड़ा गया था, इसलिए यह सब आपके लिए XE में उपलब्ध है। इसके लायक होने के लिए, डेल्फी 200 9 में भी अज्ञात जोड़ा गया था।

आपको क्या पता होना चाहिए कि डेल्फी जेनरिक सी ++ टेम्पलेट्स से कम शक्तिशाली हैं। यद्यपि आप एक सामान्य foreach के बारे में बात करते हैं, तो आपका कोड इस अर्थ में सामान्य नहीं है कि यह int पर विशिष्ट है। आप सी ++ में अपने कोड का एक सामान्य संस्करण लिख सकते हैं लेकिन टेम्पलेट की तुलना में जेनरिक की अंतर्निहित सीमाओं के कारण डेल्फी जेनेरिक के साथ ऐसा करना कठिन होगा। डेल्फी में एक सामान्य तरीके से उपरोक्त कोड लिखने का प्रयास उस बिंदु पर संस्थापक होगा जहां आपने Writeln पर कॉल करने का प्रयास किया था। जबकि यह सी ++ टेम्पलेट्स के साथ तुच्छ होगा, यह निराशाजनक रूप से जेनेरिकों तक पहुंच से बाहर है।

अद्यतन: टिप्पणियों में आप पूछते हैं कि एक कंटेनर की सामग्री को दूसरे में जोड़ने का कोई आसान तरीका है या नहीं। AddRange विधि यह करता है। TList<T>.AddRange() में तीन अधिभारित वेरिएंट हैं जो निम्न इनपुट पैरामीटर में से एक प्राप्त करते हैं: array of T, Collection: IEnumerable<T> या Collection: TEnumerable<T>। सभी मानक जेनेरिक कंटेनर एक समान पैटर्न का पालन करते हैं।

+0

इस तरह मैंने यह किया: मैं: = 0 से n - 1 परिणाम देता हूं। जोड़ें (i); लेकिन मैं सोच रहा था कि इस तरह के सामान्य कार्य मौजूद थे :) – Mihaela

+3

लैम्ब्डा/क्लोजर/अनोनफंक्शन सिंटैक्स इतनी बड़ी है कि डेल्फी में क्लंकी है कि यह बहुत बढ़िया है कि आपको 'लूप' के लिए इसकी आवश्यकता नहीं है। सामान्य रूप से सी ++ मुहावरे, पास्कल को अच्छी तरह से अनुवाद न करें। लेकिन सी # और डेल्फी वास्तव में बहुत करीब हैं। –

+0

मुझे सी ++ में काफी उपयोगी लगता है। न केवल कोड क्लीनर (छोटे अज्ञात कार्यों के लिए) है, लेकिन सी ++ में यह अक्सर रेखांकित हो जाता है और तेज़ कोड उत्पन्न करता है। – Mihaela

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

  • कोई संबंधित समस्या नहीं^_^