Rust में रिवर्स for: शुरुआती लोगों की सामान्य गलतियाँ और समाधान

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

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

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

परिचय: Rust में रिवर्स for लूप शुरुआती लोगों के लिए एक जाल क्यों है?

\n\n

एक स्थिति की कल्पना करें: आप Python से Rust पर स्विच कर रहे हैं। सब कुछ समझ में आता है, लेकिन जब आपको किसी सरणी को उल्टे क्रम में पार करने की आवश्यकता होती है — तो आप for i in 0..10 लिखते हैं और आश्चर्यचकित होते हैं कि Rust केवल आगे बढ़ता है। आप for i in 10..0 लिखने का प्रयास करते हैं — और आपको एक खाली लूप मिलता है। परिचित लगता है? यदि हाँ, तो आप अकेले नहीं हैं। Stack Overflow पर "How to make a reverse ordered for loop" प्रश्न ने हज़ारों बार देखा गया है, और यह आश्चर्यजनक नहीं है।

\n\n

इस लेख में, हम शीर्ष गलतियों का विश्लेषण करेंगे जो शुरुआती लोग Rust में रिवर्स लूप के साथ काम करते समय करते हैं, और दिखाएंगे कि उनसे कैसे बचा जाए। आप जानेंगे कि 10..0 क्यों काम नहीं करता, .rev() विधि और इटरेटर का उपयोग कैसे करें, और वेक्टर और स्लाइस के साथ काम करते समय अपने कोड को कैसे न तोड़ें। चलिए शुरू करते हैं!

\n\n

गलती #1: रेंज का उल्टा उपयोग करने का भोला प्रयास

\n\n

सबसे आम गलती — for i in 10..0 लिखने का प्रयास करना इस उम्मीद में कि Rust समझ जाएगा: "आह, उपयोगकर्ता उल्टे क्रम में जाना चाहता है"। अफसोस, Rust में रेंज a..b हमेशा a से b तक शामिल नहीं जाती है। यदि a >= b, तो रेंज खाली है।

\n\n
// ❌ गलती: खाली लूप\nfor i in 10..0 {\n    println!("{}", i); // कुछ भी प्रिंट नहीं होगा\n}
\n\n

ऐसा क्यों? Rust एक सख्त भाषा है। रेंज स्वचालित रूप से उलटी नहीं हो सकतीं। यह प्रदर्शन और पूर्वानुमेयता के लिए किया गया है। यदि 10..0 रिवर्स के रूप में काम करता, तो कंपाइलर को प्रत्येक संख्या की जाँच करनी पड़ती कि "क्या प्रारंभिक मान अंतिम मान से बड़ा है?", जो सामान्य लूप को धीमा कर देता।

\n\n

समाधान: .rev() विधि का उपयोग करें

\n\n

सही तरीका — एक सामान्य आरोही रेंज बनाएं, फिर .rev() विधि को कॉल करें, जो इटरेटर को उलट देता है:

\n\n
// ✅ सही: .rev() का उपयोग करें\nfor i in (0..10).rev() {\n    println!("{}", i); // प्रिंट करेगा: 9, 8, 7, ..., 0\n}
\n\n

ध्यान दें: हम (0..10).rev() का उपयोग कर रहे हैं, न कि 10..0 का। कोष्ठक अनिवार्य हैं, क्योंकि 0..10.rev() 10 पर विधि को कॉल करेगा, न कि रेंज पर। यह एक और सामान्य गलती है।

\n\n

गलती #2: रेंज के चारों ओर कोष्ठक भूल जाना

\n\n

.rev() विधि इटरेटर पर कॉल की जाती है। रेंज 0..10 एक इटरेटर है। लेकिन यदि आप 0..10.rev() लिखते हैं, तो Rust इसे 0..(10.rev()) के रूप में व्याख्या करता है, और पूर्णांक 10 के पास rev() विधि नहीं है। कंपाइलर एक त्रुटि देगा:

\n\n
// ❌ संकलन त्रुटि: संख्या में rev() विधि नहीं है\nfor i in 0..10.rev() {\n    // error[E0599]: no method named `rev` found for integer `i32`\n}
\n\n

समाधान सरल है — गोल कोष्ठक का उपयोग करें:

\n\n
// ✅ कोष्ठक सब कुछ हल करते हैं\nfor i in (0..10).rev() {\n    println!("{}", i);\n}
\n\n

गलती #3: गैर-इटरेटर को उलटने का प्रयास

\n\n

कभी-कभी शुरुआती लोग सीधे वेक्टर या ऐरे पर .rev() लागू करने का प्रयास करते हैं:

\n\n
let numbers = vec![1, 2, 3, 4, 5];\n\n// ❌ गलती: Vec में rev() विधि नहीं है\nfor i in numbers.rev() {\n    println!("{}", i);\n}
\n\n

.rev() इटरेटर की एक विधि है, न कि कलेक्शन की। वेक्टर को उलटने के लिए, पहले .iter() या .into_iter() के साथ इटरेटर प्राप्त करें, फिर .rev() कॉल करें:

\n\n
let numbers = vec![1, 2, 3, 4, 5];\n\n// ✅ सही: इटरेटर प्राप्त करें, फिर उलटें\nfor i in numbers.iter().rev() {\n    println!("{}", i); // प्रिंट करेगा: 5, 4, 3, 2, 1\n}
\n\n

यदि आपको तत्वों का स्वामित्व चाहिए (उदाहरण के लिए, उन्हें स्थानांतरित करना), तो .into_iter().rev() का उपयोग करें:

\n\n
let numbers = vec![1, 2, 3, 4, 5];\n\nfor i in numbers.into_iter().rev() {\n    println!("{}", i); // numbers अब                

ब्लॉग

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