अब इसे द रस्ट प्रोग्रामिंग लैंग्वेज के दूसरे संस्करण में छुआ गया है । हालांकि, इसके अलावा थोड़ा सा गोता लगाते हैं।
आइए हम एक सरल उदाहरण से शुरू करते हैं।
किसी विशेषता विधि का उपयोग करना कब उचित है?
देर से बाध्यकारी प्रदान करने के कई तरीके हैं :
trait MyTrait {
fn hello_word(&self) -> String;
}
या:
struct MyTrait<T> {
t: T,
hello_world: fn(&T) -> String,
}
impl<T> MyTrait<T> {
fn new(t: T, hello_world: fn(&T) -> String) -> MyTrait<T>;
fn hello_world(&self) -> String {
(self.hello_world)(self.t)
}
}
किसी भी कार्यान्वयन / प्रदर्शन की रणनीति की उपेक्षा करते हुए, ऊपर दिए गए दोनों अंश उपयोगकर्ता को एक गतिशील तरीके से निर्दिष्ट करने की अनुमति देते हैं कि कैसे hello_worldव्यवहार करना चाहिए।
एक अंतर (शब्दार्थ) यह है कि traitकार्यान्वयन इस बात की गारंटी देता है कि किसी दिए गए प्रकार को Tलागू करने के लिए trait, hello_worldहमेशा एक ही व्यवहार होगा जबकि structकार्यान्वयन प्रति उदाहरण के आधार पर एक अलग व्यवहार रखने की अनुमति देता है।
किसी विधि का उपयोग करना उचित है या नहीं यह usecase पर निर्भर करता है!
संबद्ध प्रकार का उपयोग करना कब उचित है?
इसी तरह करने के लिए traitउपरोक्त विधियों, एक संबद्ध प्रकार देर बंधन का एक रूप है (हालांकि यह संकलन पर होता है), के उपयोगकर्ता की अनुमति के traitकिसी दिए गए उदाहरण है, जिसमें प्रकार स्थानापन्न करने के लिए निर्दिष्ट करने के लिए। यह एकमात्र तरीका नहीं है (इस प्रकार प्रश्न):
trait MyTrait {
type Return;
fn hello_world(&self) -> Self::Return;
}
या:
trait MyTrait<Return> {
fn hello_world(&Self) -> Return;
}
उपरोक्त विधियों के देर से बंधन के बराबर हैं:
- पहले एक को लागू करता है कि किसी दिए गए के लिए
Selfनहीं है एक भी Returnजुड़े
- इसके बजाय दूसरा, कई
MyTraitके Selfलिए लागू करने की अनुमति देता हैReturn
कौन सा रूप अधिक उपयुक्त है यह इस बात पर निर्भर करता है कि यह एकता को लागू करने के लिए समझ में आता है या नहीं। उदाहरण के लिए:
Deref एक संबद्ध प्रकार का उपयोग करता है क्योंकि एकता के बिना कंपाइलर अनुमान के दौरान पागल हो जाएगा
Add एक संबद्ध प्रकार का उपयोग करता है क्योंकि इसके लेखक ने सोचा था कि दोनों तर्क दिए जाने पर तार्किक रिटर्न प्रकार होगा
जैसा कि आप देख सकते हैं, जबकि Derefएक स्पष्ट usecase (तकनीकी बाधा) है, का मामला Addकम स्पष्ट है: शायद यह या i32 + i32तो उपज के लिए या संदर्भ के आधार पर समझ में आता है? बहरहाल, लेखक ने अपने फैसले का प्रयोग किया और निर्णय लिया कि अतिरिक्त प्रकार के अतिरिक्त रिटर्न को लोड करना अनावश्यक था।i32Complex<i32>
मेरा निजी रुख है कि कोई सही जवाब नहीं है। फिर भी, एकता तर्क से परे, मैं उल्लेख करता हूं कि संबद्ध प्रकार विशेषता का उपयोग करना आसान बनाते हैं क्योंकि वे निर्दिष्ट किए जाने वाले मापदंडों की संख्या को कम करते हैं, इसलिए यदि नियमित रूप से विशेषता पैरामीटर का उपयोग करने के लचीलेपन के लाभ स्पष्ट नहीं हैं, तो मैं संबद्ध प्रकार से शुरू करने का सुझाव दें।
trait/struct MyTrait/MyStructबिल्कुल एकimpl MyTrait forया अनुमति देता हैimpl MyStruct।trait MyTrait<Return>कईimplएस की अनुमति देता है क्योंकि यह सामान्य है।Returnकिसी भी प्रकार का हो सकता है जेनेरिक संरचनाएं समान हैं।