अब इसे द रस्ट प्रोग्रामिंग लैंग्वेज के दूसरे संस्करण में छुआ गया है । हालांकि, इसके अलावा थोड़ा सा गोता लगाते हैं।
आइए हम एक सरल उदाहरण से शुरू करते हैं।
किसी विशेषता विधि का उपयोग करना कब उचित है?
देर से बाध्यकारी प्रदान करने के कई तरीके हैं :
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
तो उपज के लिए या संदर्भ के आधार पर समझ में आता है? बहरहाल, लेखक ने अपने फैसले का प्रयोग किया और निर्णय लिया कि अतिरिक्त प्रकार के अतिरिक्त रिटर्न को लोड करना अनावश्यक था।i32
Complex<i32>
मेरा निजी रुख है कि कोई सही जवाब नहीं है। फिर भी, एकता तर्क से परे, मैं उल्लेख करता हूं कि संबद्ध प्रकार विशेषता का उपयोग करना आसान बनाते हैं क्योंकि वे निर्दिष्ट किए जाने वाले मापदंडों की संख्या को कम करते हैं, इसलिए यदि नियमित रूप से विशेषता पैरामीटर का उपयोग करने के लचीलेपन के लाभ स्पष्ट नहीं हैं, तो मैं संबद्ध प्रकार से शुरू करने का सुझाव दें।
trait/struct MyTrait/MyStruct
बिल्कुल एकimpl MyTrait for
या अनुमति देता हैimpl MyStruct
।trait MyTrait<Return>
कईimpl
एस की अनुमति देता है क्योंकि यह सामान्य है।Return
किसी भी प्रकार का हो सकता है जेनेरिक संरचनाएं समान हैं।