Rust में कार्यात्मक प्रोग्रामिंग: उन्नत स्तर
\n\nRust एक बहु-प्रतिमान भाषा है जो अनिवार्य, वस्तु-उन्मुख और कार्यात्मक शैलियों को सहजता से जोड़ती है। उन्नत स्तर पर, Rust में कार्यात्मक प्रोग्रामिंग अधिक सुरक्षित, अभिव्यंजक और संक्षिप्त कोड लिखने की अनुमति देती है। इस लेख में हम प्रमुख अवधारणाओं पर चर्चा करेंगे: पर्यावरण कैप्चर के साथ क्लोजर, उन्नत इटरेटर, Option और Result के उदाहरण पर फंक्टर और मोनाड, साथ ही करीइंग और फ़ंक्शन संयोजन।
1. क्लोजर: स्वामित्व, उधार और परिवर्तनशीलता
\n\nRust में क्लोजर केवल अनाम फ़ंक्शन नहीं हैं। वे आसपास के दायरे से चर को तीन तरीकों से कैप्चर कर सकते हैं: संदर्भ द्वारा (&T), परिवर्तनशील संदर्भ द्वारा (&mut T) और मान द्वारा (T)। कंपाइलर स्वचालित रूप से सबसे कम प्रतिबंधात्मक ट्रेट चुनता है: Fn, FnMut या FnOnce।
मान द्वारा कैप्चर और move के उपयोग का उदाहरण देखें:
fn main() {\n let data = vec![1, 2, 3];\n \n // मान द्वारा कैप्चर (move) — स्वामित्व क्लोजर को स्थानांतरित हो जाता है\n let closure = move || {\n println!("{:?}", data);\n // data मुख्य फ़ंक्शन में अब उपलब्ध नहीं है\n };\n \n closure();\n // println!("{:?}", data); // त्रुटि: data स्थानांतरित हो गया\n}\n\n\nउन्नत तकनीक — फ़ंक्शन फ़ैक्टरी बनाने के लिए क्लोजर का उपयोग:
\n\nfn make_multiplier(factor: i32) -> impl Fn(i32) -> i32 {\n move |x| x * factor\n}\n\nfn main() {\n let double = make_multiplier(2);\n let triple = make_multiplier(3);\n \n println!("{}", double(5)); // 10\n println!("{}", triple(5)); // 15\n}\n\n\nयहाँ impl Fn(i32) -> i32 एक वापसी प्रकार-क्लोजर है। Rust स्वचालित रूप से एक अनाम प्रकार उत्पन्न करता है जो Fn ट्रेट को लागू करता है।
2. उन्नत इटरेटर: श्रृंखलाएँ, अनुकूलक और आलसी गणनाएँ
\n\nRust में इटरेटर कार्यात्मक शैली का एक शक्तिशाली उपकरण हैं। वे आलसी होते हैं: गणनाएँ केवल टर्मिनल विधि (collect, for_each, fold आदि) को कॉल करने पर होती हैं।
डेटा प्रसंस्करण के एक जटिल पाइपलाइन पर विचार करें:
\n\nfn process_data(data: Vec<i32>) -> Vec<i32> {\n data.iter()\n .filter(|&x| x > 0) // सकारात्मक छोड़ें\n .map(|x| x * 2) // दोगुना करें\n .enumerate() // इंडेक्स जोड़ें\n .filter(|(i, _)| i % 2 == 0) // सम इंडेक्स\n .map(|(_, x)| x) // मान निकालें\n .collect() // टर्मिनल विधि\n}\n\n\nउन्नत तकनीक — नेस्टेड संरचनाओं के साथ काम करने के लिए flat_map और संचय के लिए fold का उपयोग:
fn main() {\n let nested = vec![vec![1, 2], vec![3, 4, 5], vec![6]];\n \n let flattened: Vec<i32> = nested.iter()\n .flat_map(|v| v.iter())\n .copied()\n .collect();\n \n println!("{:?}", flattened); // [1, 2, 3, 4, 5, 6]\n \n // fold — reduce का कार्यात्मक एनालॉग\n let sum = flattened.iter()\n .fold(0, |acc, x| acc + x);\n \n println!("योग: {}", sum); // 21\n}\n\n\nयाद रखना महत्वपूर्ण है: इटरेटर श्रृंखलाएँ मध्यवर्ती संग्रह नहीं बनाती हैं जब तक कि collect को कॉल न किया जाए। इससे मेमोरी बचती है और प्रदर्शन बढ़ता है।
3. मोनाड Option और Result: त्रुटियों का कार्यात्मक प्रसंस्करण
\n\nकार्यात्मक प्रोग्रामिंग में Option और Result मोनाड हैं। वे नेस्टेड match या if let के बिना वैकल्पिक मानों और त्रुटियों को श्रृंखलाबद्ध रूप से संसाधित करने की अनुमति देते हैं।
नेस्टेड जाँचों के साथ एक विशिष्ट परिदृश्य पर विचार करें:
\n\nब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
जावा में कोड रिव्यू: क्या जाँचें और शुरुआती लोगों को फीडबैक कैसे दें
Go में "declared and not used" को कैसे हराएं: पूर्ण गाइड
Kotlin क्यों है Android के लिए नंबर 1 भाषा: इतिहास, कोड और भविष्य
जावास्क्रिप्ट में डिज़ाइन पैटर्न: Node.js के लिए उदाहरण
Swift ओपन सोर्स: GitHub पर प्रोफेशनल्स के लिए टॉप रिपॉजिटरी