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

लक्षण और विशेषता सीमाएँ

विशेषताएँ उस व्यवहार को परिभाषित करते हैं जो एक विशेष प्रकार का होता है और जिसे अन्य प्रकार के साथ साझा किया जा सकता है। हम तरीकों के एक सेट को परिभाषित करने के लिए लक्षणों का उपयोग कर सकते हैं जो अन्य प्रोग्रामिंग भाषाओं में इंटरफेस के समान एक निश्चित सामान्य कार्यक्षमता या इंटरफ़ेस का प्रतिनिधित्व करते हैं।

विशेषता सीमाएं हमें यह निर्दिष्ट करने की अनुमति देती हैं कि एक सामान्य प्रकार को एक विशिष्ट विशेषता लागू करनी चाहिए, यह सुनिश्चित करते हुए कि संकलन समय पर आवश्यक विधियां उपलब्ध हैं।


किसी विशेषता को परिभाषित करना और कार्यान्वित करना

किसी विशेषता को परिभाषित करने के लिए, हम trait कीवर्ड का उपयोग करते हैं, जिसके बाद उन तरीकों के हस्ताक्षर होते हैं जिन्हें लागू करने वाले प्रकारों को परिभाषित करना होगा:

Rust
pub trait Summary {
    fn summarize(&self) -> String;
}

किसी विशेषता को किसी ठोस प्रकार पर लागू करने के लिए, हम सिंटैक्स impl TraitName for TypeName का उपयोग करते हैं:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

गुण सीमा

सामान्य फ़ंक्शन लिखते समय, हम यह सुनिश्चित करने के लिए प्रकार के मापदंडों को सीमित कर सकते हैं कि वे एक विशिष्ट विशेषता को लागू करते हैं। मानक सिंटैक्स <T: Trait> है:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

वैकल्पिक रूप से, अधिक जटिल हस्ताक्षरों के लिए, हम where क्लॉज़ का उपयोग कर सकते हैं:

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

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

अभ्यास 1: सारांश विशेषता

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

सारांश नामक एक विशेषता को परिभाषित करें जिसमें विधि हस्ताक्षर fn summarize(&self) -> String; शामिल है। इसके बाद, स्ट्रिंग प्रकार के हेडलाइन फ़ील्ड के साथ एक स्ट्रक्चर न्यूज़आर्टिकल को परिभाषित करें और इसके लिए सारांश विशेषता लागू करें ताकि सारांश विधि हेडलाइन फ़ील्ड का मान लौटा सके।

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

'सारांश' विशेषता और 'न्यूज़आर्टिकल' संरचना को परिभाषित करें। `न्यूज़आर्टिकल के लिए निहित सारांश`फ़ील्ड को क्लोन करके`self.headline.clone()` के साथ कार्यान्वित करें।

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

अभ्यास 2: प्रिंट_सारांश के साथ विशेषता सीमाएँ

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

पिछले अभ्यास के कोड के आधार पर, print_summary<T> नामक एक सामान्य फ़ंक्शन को परिभाषित करें जो &T प्रकार के पैरामीटर आइटम को स्वीकार करता है। एक विशेषता को बाध्य करके लागू करें ताकि टी को सारांश विशेषता को लागू करना पड़े। फ़ंक्शन के अंदर, आइटम.summarize() द्वारा लौटाए गए परिणाम को प्रिंट करें।

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

हस्ताक्षर `fn print_summary<T: Summary>(item: &T)` का उपयोग करें और` println!` के अंदर`item.summarize()` को आमंत्रित करें।

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

अभ्यास 3: लक्षणों का उपयोग करके क्षेत्र की गणना

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

क्षेत्र नाम के एक गुण को fn क्षेत्र(&self) -> f64; विधि से परिभाषित करें। f64 प्रकार के त्रिज्या फ़ील्ड वाला एक संरचना सर्कल बनाएं, और क्षेत्र की गणना करके इसके लिए क्षेत्र विशेषता लागू करें (सूत्र: त्रिज्या * त्रिज्या * 3.14159)।

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

'क्षेत्र' विशेषता और 'वृत्त' संरचना को परिभाषित करें। वृत्त क्षेत्र सूत्र का उपयोग करके`क्षेत्र(&स्वयं)` लागू करें।

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