मुख्य सामग्री पर जाएं
मॉड्यूल 5 · पाठ 1 का 2पाठ्यक्रम में 9/14~12 min
मॉड्यूल पाठ (1/2)

जेनेरिक और फ़ंक्शंस

जेनेरिक्स आपको विभिन्न डेटा प्रकारों के लिए तर्क के दोहराव से बचने के लिए लचीला, पुन: प्रयोज्य कोड लिखने की अनुमति देता है। विभिन्न प्रकारों (जैसे i32, f64, या String) के लिए कई कार्यों या संरचनाओं को परिभाषित करने के बजाय, हम एक सामान्य प्रकार के पैरामीटर का उपयोग कर सकते हैं, जिसे पारंपरिक रूप से अक्षर T द्वारा दर्शाया जाता है।

रस्ट कंपाइलर मोनोमॉर्फाइज़ेशन नामक प्रक्रिया का उपयोग करके जेनेरिक का प्रबंधन करता है: संकलन के दौरान, यह वास्तव में उपयोग किए जाने वाले प्रत्येक ठोस प्रकार के लिए जेनेरिक कोड की एक प्रति उत्पन्न करता है। इसका मतलब है कि शून्य रनटाइम प्रदर्शन ओवरहेड है।


सामान्य कार्य

एक सामान्य फ़ंक्शन को परिभाषित करने के लिए, हम फ़ंक्शन नाम के ठीक बाद और तर्क सूची से पहले टाइप पैरामीटर <T> डालते हैं:

Rust
fn print_value<T: std::fmt::Debug>(value: T) {
    println!("Value: {:?}", value);
}

सामान्य कार्यों में, हम तर्क प्रकार और रिटर्न प्रकार दोनों के लिए सामान्य प्रकार T का उपयोग कर सकते हैं:

Rust
fn identity<T>(value: T) -> T {
    value
}

सामान्य संरचनाएँ

हम लचीले क्षेत्रों को परिभाषित करने के लिए संरचनाओं (struct) के अंदर सामान्य प्रकार के मापदंडों का भी उपयोग कर सकते हैं:

Rust
struct KeyValuePair<K, V> {
    key: K,
    value: V,
}

fn main() {
    let pair = KeyValuePair {
        key: String::from("age"),
        value: 30,
    };
}

एक सामान्य संरचना के लिए impl ब्लॉक में, हमें impl कीवर्ड के तुरंत बाद टाइप पैरामीटर <T> घोषित करना होगा ताकि यह दर्शाया जा सके कि हम एक सामान्य संरचना पर तरीकों को लागू कर रहे हैं:

Rust
struct Container<T> {
    value: T,
}

impl<T> Container<T> {
    fn new(value: T) -> Self {
        Container { value }
    }

    fn value(&self) -> &T {
        &self.value
    }
}

खुद कोशिश करना

अभ्यास 1: बिंदु संरचना

व्यायाम#rust.m5.l1.e1
प्रयास: 0लोड हो रहा है...

प्वाइंट&lt;टी&gt; नामक एक सामान्य संरचना को दो फ़ील्ड के साथ परिभाषित करें: प्रकार टी का एक्स और प्रकार टी का वाई। मुख्य फ़ंक्शन में, पूर्णांक मान x = 5 और y = 10 के साथ एक बिंदु वाले एक चर बिंदु को तुरंत चालू करें, फिर बिंदु.x का मान प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

`struct प्वाइंट<T> { x: T, y: T }`का उपयोग करके संरचना की घोषणा करें। इसे मुख्य रूप से इंस्टेंट करें और इसे प्रिंट करने के लिए`point.x` का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम 2: स्वैप के साथ टुपल को उलटना

व्यायाम#rust.m5.l1.e2
प्रयास: 0लोड हो रहा है...

स्वैप&lt;टी&gt; नामक एक सामान्य फ़ंक्शन लिखें जो दो तत्वों (टी, टी) के टुपल को स्वीकार करता है और उनकी स्थिति को उलट कर एक नया टुपल (टी, टी) लौटाता है। मुख्य फ़ंक्शन में, फ़ंक्शन को टुपल (1, 2) के साथ कॉल करें और परिणाम प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

फ़ंक्शन हस्ताक्षर `एफएन स्वैप&lt;टी&gt;(जोड़ी: (टी, टी)) -> (टी, टी)`होना चाहिए। उलटे टपल को`(pair.1, जोड़े.0)` के साथ लौटाएँ।

3 प्रयासों के बाद समाधान उपलब्ध है

अभ्यास 3: कंटेनर संरचना

व्यायाम#rust.m5.l1.e3
प्रयास: 0लोड हो रहा है...

एक सामान्य संरचना कंटेनर<T> को परिभाषित करें जिसमें प्रकार T का मान फ़ील्ड हो। एक नई विधि को परिभाषित करने के लिए एक सामान्य impl ब्लॉक लागू करें जो प्रकार T का मान स्वीकार करता है और कंटेनर<T> का एक उदाहरण देता है।

संपादक लोड हो रहा है...
संकेत दिखाएँ

संबंधित विधि को कार्यान्वित करने के लिए `impl<T> Container<T>` का उपयोग करें`fn new(value: T) -> Self { Container { value } }`।

3 प्रयासों के बाद समाधान उपलब्ध है