Rust में कार्यात्मक प्रोग्रामिंग: उन्नत तकनीकें और मुहावरे

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Rust में कार्यात्मक प्रोग्रामिंग: उन्नत स्तर

\n\n

Rust एक बहु-प्रतिमान भाषा है जो अनिवार्य, वस्तु-उन्मुख और कार्यात्मक शैलियों को सहजता से जोड़ती है। उन्नत स्तर पर, Rust में कार्यात्मक प्रोग्रामिंग अधिक सुरक्षित, अभिव्यंजक और संक्षिप्त कोड लिखने की अनुमति देती है। इस लेख में हम प्रमुख अवधारणाओं पर चर्चा करेंगे: पर्यावरण कैप्चर के साथ क्लोजर, उन्नत इटरेटर, Option और Result के उदाहरण पर फंक्टर और मोनाड, साथ ही करीइंग और फ़ंक्शन संयोजन।

\n\n

1. क्लोजर: स्वामित्व, उधार और परिवर्तनशीलता

\n\n

Rust में क्लोजर केवल अनाम फ़ंक्शन नहीं हैं। वे आसपास के दायरे से चर को तीन तरीकों से कैप्चर कर सकते हैं: संदर्भ द्वारा (&T), परिवर्तनशील संदर्भ द्वारा (&mut T) और मान द्वारा (T)। कंपाइलर स्वचालित रूप से सबसे कम प्रतिबंधात्मक ट्रेट चुनता है: Fn, FnMut या FnOnce।

\n\n

मान द्वारा कैप्चर और move के उपयोग का उदाहरण देखें:

\n\n
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\n
fn 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 ट्रेट को लागू करता है।

\n\n

2. उन्नत इटरेटर: श्रृंखलाएँ, अनुकूलक और आलसी गणनाएँ

\n\n

Rust में इटरेटर कार्यात्मक शैली का एक शक्तिशाली उपकरण हैं। वे आलसी होते हैं: गणनाएँ केवल टर्मिनल विधि (collect, for_each, fold आदि) को कॉल करने पर होती हैं।

\n\n

डेटा प्रसंस्करण के एक जटिल पाइपलाइन पर विचार करें:

\n\n
fn 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 का उपयोग:

\n\n
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 को कॉल न किया जाए। इससे मेमोरी बचती है और प्रदर्शन बढ़ता है।

\n\n

3. मोनाड Option और Result: त्रुटियों का कार्यात्मक प्रसंस्करण

\n\n

कार्यात्मक प्रोग्रामिंग में Option और Result मोनाड हैं। वे नेस्टेड match या if let के बिना वैकल्पिक मानों और त्रुटियों को श्रृंखलाबद्ध रूप से संसाधित करने की अनुमति देते हैं।

\n\n

नेस्टेड जाँचों के साथ एक विशिष्ट परिदृश्य पर विचार करें:

\n\n


                
                

ब्लॉग

पुस्तक अनुशंसाएँ