2012-01-04 18 views
10

डी में मैं एक सरणी में सभी तत्वों के लिए एक फ़ंक्शन कैसे लागू करूं?डी में मैं एक सरणी में सभी तत्वों के लिए एक फ़ंक्शन कैसे लागू करूं?

उदाहरण के लिए मैं std.string.leftJustify() फ़ंक्शन को स्ट्रिंग सरणी में सभी तत्वों पर लागू करना चाहता हूं।

मुझे पता है कि मैं एक पाश का उपयोग कर सकता हूं लेकिन क्या एक अच्छा नक्शा कार्य है? मुझे लगता है कि std.algorithm लाइब्रेरी में से एक है लेकिन मुझे नहीं पता कि अभी तक डी में टेम्पलेट का उपयोग कैसे किया जाए।

कोई उदाहरण?

उत्तर

12

लैम्ब्डा निर्दिष्ट करने के लिए बहुत सारे विकल्प हैं। map ऐसी रेंज देता है जो आभारी रूप से मूल्यांकन करता है। आप std.array से फ़ंक्शन array का उपयोग करके तत्काल मूल्यांकन को मजबूर कर सकते हैं।

import std.algorithm; 
import std.stdio; 
import std.string; 

void main() 
{ 
    auto x = ["test", "foo", "bar"]; 
    writeln(x); 

    auto lj = map!"a.leftJustify(10)"(x); // using string mixins 
    // alternative syntaxes: 
    // auto lj = map!q{a.leftJustify(10)}(x); 
    // auto lj = map!(delegate(a) { return a.leftJustify(10) })(x); 
    // auto lj = map!(a => a.leftJustify(10))(x); available in dmd 2.058 
    writeln(lj); 
} 
+0

कीवर्ड "प्रतिनिधि" वैकल्पिक है, इसलिए आप केवल ऑटो lj = map लिख सकते हैं! ((ए) {वापसी a.leftJustify (10);}) (x); – Nekuromento

+0

मुझे विश्वास नहीं है कि यह ओपी चाहता है जो करता है। यहां, 'x' अपरिवर्तित रहेगा। मेरा मानना ​​है कि वह जगहों पर तत्वों को संशोधित करना चाहता है। –

+0

क्या प्रतिनिधि को बदलने वाले रेफ पैरामीटर के साथ एक प्रतिनिधि को पास करना संभव नहीं है? – Trass3r

4
import std.algorithm; 
import std.stdio; 

void main() 
{ 
    writeln(map!(a => a * 2)([1, 2, 3])); 
    writeln(map!(delegate(a) { return a * 2; })([1, 2, 3])); 
} 
+3

शीर्ष वाला नया लैम्ब्डा सिंटैक्स का उपयोग करता है जो तब तक काम नहीं करेगा जब तक डीएमडी 2.058 बाहर नहीं आ जाता। – eco

+0

क्या मैं उपरोक्त स्ट्रिंग फ़ंक्शन को सभी तत्वों पर लागू करने के लिए इस नोटेशन का उपयोग करूंगा? –

+0

@GaryWilloughby: हाँ। – DejanLekic

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