मैक्रो Rust प्रोग्रामर के टूलकिट का एक शक्तिशाली हिस्सा हैं, और उदाहरण के जरिए मैक्रो इस शक्ति तक पहुँचने का काफी आसान तरीका है। चलिए एक मैक्रो लिखते हैं!
मैक्रो क्या है? Wikipedia इसे इस तरह बताती है:
कंप्यूटर विज्ञान में मैक्रो ("macroinstruction" का छोटा रूप, ग्रीक μακρός 'लंबा' से) एक नियम या पैटर्न है, जो यह तय करता है कि किसी निश्चित इनपुट अनुक्रम (अक्सर अक्षरों का अनुक्रम) को एक तय प्रक्रिया के अनुसार किस रिप्लेसमेंट आउटपुट अनुक्रम (जो अक्सर अक्षरों का अनुक्रम भी होता है) में बदला जाए। वह मैपिंग प्रक्रिया, जो मैक्रो के किसी इस्तेमाल को एक निश्चित अनुक्रम में बदल देती है, उसे मैक्रो एक्सपैंशन कहते हैं।
बहुत रोचक! लेकिन ठोस बात करें तो, मैक्रो एक खास सिंटैक्स हैं जो आपको कंपाइल टाइम पर कोड बनाने देते हैं। मैक्रो का इस्तेमाल कंपाइल टाइम पर गणना के लिए किया जा सकता है, लेकिन अक्सर ये आपके कोड को अमूर्त करने का एक और तरीका भर होते हैं। उदाहरण के लिए, आपने शायद println!() और vec![] पहले ही इस्तेमाल किए होंगे। ये दोनों मनचाही संख्या में आर्गुमेंट लेते हैं, इसलिए आप इन्हें साधारण फंक्शन के रूप में नहीं लिख सकते। दूसरी तरफ, ये हमेशा बिल्कुल मानक Rust कोड की कुछ मात्रा में बदल जाते हैं। अगर आपको दिलचस्पी है, तो आप cargo expand सबकमांड की मदद से अपने कोड में मैक्रो एक्सपैंशन के परिणाम देख सकते हैं।
Rust में मैक्रो के बारे में और जानकारी के लिए, The Rust Book में इन पर एक अच्छा अध्याय है।
आप vec![] मैक्रो की मदद से मनचाही लंबाई का Vec सीधे बना सकते हैं। लेकिन Rust में HashMap सीधे बनाने का कोई तरीका नहीं आता। इसे ठीक कीजिए और एक hashmap!() मैक्रो लिखिए।
उदाहरण के लिए, आपकी लाइब्रेरी का कोई इस्तेमाल करने वाला hashmap!('a' => 3, 'b' => 11, 'z' => 32) लिख सकता है। यह नीचे दिए कोड में बदलना चाहिए:
{
let mut hm = HashMap::new();
hm.insert('a', 3);
hm.insert('b', 11);
hm.insert('z', 32);
hm
}
ध्यान दीजिए कि maplit क्रेट एक ऐसा मैक्रो देता है जो इस अभ्यास को पूरी तरह हल कर देता है। कृपया इस क्रेट का इस्तेमाल करने के बजाय अपना हल खुद लिखिए; कृपया इसका सोर्स देखने से पहले खुद कोशिश कीजिए।