Rust में Vec<T> के स्लाइस: 2025 में कैसे प्राप्त करें और सिरदर्द से बचें

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

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

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

Rust में Vec<T> के स्लाइस: यह कैसे काम करता है और इसकी आवश्यकता क्यों है?

\n\n

यदि आपने कभी Rust में लिखा है और सोचा है "How do I get a slice of a Vec<T> in Rust?" — तो आप अकेले नहीं हैं। यह Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है, जिसे हज़ारों बार देखा गया है। और यह कोई संयोग नहीं है: वैक्टर और उनके स्लाइस के साथ काम करना एक मौलिक कौशल है, जिसके बिना Rust में किसी भी गंभीर प्रोजेक्ट की कल्पना नहीं की जा सकती।

\n\n

इस लेख में, हम केवल यह नहीं दिखाएंगे कि स्लाइस कैसे प्राप्त करें। हम 2025 की सर्वोत्तम प्रथाओं पर चर्चा करेंगे, सामान्य जाल से बचना सीखेंगे, और समझेंगे कि Rust हमें उधार के बारे में इतना सोचने के लिए क्यों मजबूर करता है। चलिए शुरू करते हैं!

\n\n

Rust में स्लाइस (slice) क्या है?

\n\n

स्लाइस लेने से पहले, आइए समझें कि यह क्या है। स्लाइस मेमोरी में तत्वों के एक सतत अनुक्रम का एक संदर्भ है। Rust में, स्लाइस को &[T] के रूप में दर्शाया जाता है। यह एक स्वामित्व वाली डेटा संरचना नहीं है — यह केवल किसी और (जैसे वेक्टर या ऐरे) के स्वामित्व वाले डेटा के एक हिस्से को "देखता" है।

\n\n

स्लाइस का मुख्य लाभ सुरक्षा है। Rust कंपाइलर गारंटी देता है कि आप मेमोरी सीमा से बाहर नहीं जाएंगे, और उधार प्रणाली आपको डेटा को बदलने की अनुमति नहीं देगी जब तक उस पर सक्रिय संदर्भ हों।

\n\n

सीधे वेक्टर का उपयोग क्यों न करें?

\n\n

वेक्टर (Vec<T>) एक स्वामित्व वाली संरचना है। यदि आप इसे किसी फ़ंक्शन में पास करते हैं, तो आप या तो इसे स्थानांतरित कर देते हैं (पहुँच खो देते हैं) या एक संदर्भ पास करते हैं। स्लाइस आपको लचीलापन देते हैं: आप डेटा के केवल एक हिस्से को कॉपी किए बिना या मूल वेक्टर पर नियंत्रण खोए बिना पास कर सकते हैं।

\n\n

उदाहरण के लिए, आप बड़े डेटा ऐरे के साथ काम कर रहे हैं और विश्लेषण के लिए इसके एक टुकड़े को किसी फ़ंक्शन में पास करना चाहते हैं। स्लाइस एक आदर्श उपकरण है: यह हल्का है (केवल दो शब्द: पॉइंटर और लंबाई) और सुरक्षित है।

\n\n

Vec<T> का स्लाइस प्राप्त करने के मुख्य तरीके

\n\n

आइए अभ्यास की ओर बढ़ते हैं। वेक्टर से स्लाइस प्राप्त करने के कई तरीके हैं। हम सबसे लोकप्रिय और सुविधाजनक तरीकों पर विचार करेंगे।

\n\n

1. इंडेक्सिंग ऑपरेटर: &vec[start..end]

\n\n

सबसे सीधा तरीका रेंज ऑपरेटर .. का उपयोग करना है:

\n\n
let vec = vec![1, 2, 3, 4, 5];\nlet slice: &[i32] = &vec[1..4]; // इंडेक्स 1 से 4 तक स्लाइस (4 शामिल नहीं)\nprintln!("{:?}", slice); // [2, 3, 4]
\n\n

यह विधि रनटाइम बाउंड चेकिंग का उपयोग करती है। यदि आप वेक्टर की सीमा से बाहर जाते हैं, तो प्रोग्राम पैनिक (panic) करेगा। शैक्षिक उदाहरणों के लिए यह ठीक है, लेकिन प्रोडक्शन कोड में सावधान रहना चाहिए।

\n\n

आप रेंज के विभिन्न रूपों का उपयोग कर सकते हैं:

\n\n
    \n
  • &vec[..] — पूरा वेक्टर
  • \n
  • &vec[2..] — इंडेक्स 2 से अंत तक
  • \n
  • &vec[..3] — शुरू से इंडेक्स 3 तक (शामिल नहीं)
  • \n
  • &vec[1..=3] — 1 से 3 तक (दोनों शामिल)
  • \n
\n\n

2. विधि .as_slice()

\n\n

यह विधि पूरे वेक्टर पर एक स्लाइस लौटाती है। यह &vec[..] से अधिक सुरक्षित है, क्योंकि यह स्पष्ट रूप से इरादा व्यक्त करता है:

\n\n
let vec = vec![10, 20, 30];\nlet slice: &[i32] = vec.as_slice();\nprintln!("{:?}", slice); // [10, 20, 30]
\n\n

as_slice() विधि विशेष रूप से तब उपयोगी होती है जब आप इस बात पर जोर देना चाहते हैं कि आप स्लाइस के साथ काम कर रहे हैं, न कि वेक्टर के साथ। यह कोड को अधिक पठनीय और स्व-दस्तावेजीकरण बनाता है।

\n\n

3. परिवर्तनीय स्लाइस प्राप्त करना: as_mut_slice()

\n\n

यदि आपको स्लाइस के अंदर तत्वों को बदलने की आवश्यकता है (लेकिन स्वयं वेक्टर को नहीं), तो as_mut_slice() का उपयोग करें:

\n\n
let mut vec = vec![1, 2, 3];\nlet slice: &mut [i32] = vec.as_mut_slice();\nslice[0] = 100;\nprintln!("{:?}", vec); // [100, 2, 3]
\n\n

ध्यान दें: वेक्टर को mut के रूप में घोषित किया जाना चाहिए। साथ ही, आप एक साथ अपरिवर्तनीय और परिवर्तनीय स्लाइस नहीं रख सकते — यह उधार के नियमों का उल्लंघन करेगा।

\n\n

उप-स्लाइस कैसे प्राप्त करें

ब्लॉग

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