चलो कहते हैं कि मैं कुछ विशेषता करते हैं के लिए
trait MyTrait {
fn function1(&self);
}
और कुछ प्रकार है कि यह लागू करता है:
struct MyStruct {
number: i32,
}
impl MyTrait for MyStruct {
fn function1(&self) {
printn!("{}", self.number);
}
}
अब मैं एक और प्रकार, ले जाना चाहता है जो है
चीजें जो MyTrait
लागू करती हैं। यह परवाह नहीं करता कि वे स्वामित्व में हैं या नहीं। चारों ओर पढ़ने से, यह पूरा करने के सही तरीके की तरह लगता है कि X
या &X
या 0 जो भी हो, उसे Borrow<X>
लेना है। यह बात प्रकार X
, या Rc<X>
या Box<X>
, आदि की बातें ले सकते हैं ...
मैं इस काम के X
एक ठोस प्रकार है जब मिल गया है, लेकिन मैं इसे कैसे काम करते हैं जब X
एक विशेषता है कर सकता हूँ? ,
struct Consumer<T> {
inner: T
}
impl<T: Borrow<MyTrait>> Consumer<T> {
pub fn new(inner: T) -> Consumer<T> {
Consumer {
inner: inner
}
}
pub fn do_stuff(&self) {
self.inner.borrow().function1();
}
}
fn main() {
// I want to eventually be able to swap this out for x = Rc::new(MyStruct ...
// but I'll keep it simple for now.
let x = MyStruct { number: 42 };
let c = Consumer::new(x);
c.do_stuff();
}
यह अभी तक काम नहीं करता क्योंकि MyStruct
लागू करता Borrow<MyStruct>
, लेकिन नहीं Borrow<MyTrait>
:
यहाँ क्या मैं पहली बार कोशिश की है। ठीक है, तो उस को लागू करने की कोशिश करते हैं:
<anon>:33:5: 35:6 error: method `borrow` has an incompatible type for trait: expected bound lifetime parameter , found concrete lifetime [E0053] <anon>:33 fn borrow(&self) -> &MyTrait { <anon>:34 self <anon>:35 } <anon>:33:5: 35:6 help: see the detailed explanation for E0053 error: aborting due to previous error playpen: application terminated with error code 101
क्या:
impl Borrow<MyTrait> for MyStruct {
fn borrow(&self) -> &MyTrait {
self
}
}
यह मैं निम्न त्रुटि है, जो मुझे समझ नहीं आता देता है? वहां पर किसी भी ठोस जीवनकाल का उल्लेख नहीं किया गया है, और Borrow
किसी भी जीवनकाल के बिना परिभाषित किया गया है। मैं उलझन में हूं।
सबसे पहले, क्या मेरी धारणाएं सही हैं कि Borrow
का उपयोग करने का सही तरीका है? और यदि हां, तो मैं एक विशेषता के Borrow
को कैसे कार्यान्वित करूं?
आह, धन्यवाद! मैंने पहले कभी नहीं देखा था (और MyTrait + 'ए)' वाक्यविन्यास पहले। मैंने देखा है कि जेनेरिक पैरामीटर में अन्य प्रकारों में, या टाइप सीमाओं में, लेकिन पहले कभी नहीं। –