बॉक्स से एक & dyn T कैसे प्राप्त करें

Jan 11 2021

मैं एक &dyn Tसे प्राप्त करने की कोशिश कर रहा हूं Box<dyn T>, जैसा कि निम्नलिखित उदाहरण में है। हालाँकि, यह संकलन करने में विफल रहता है।

trait MyTrait {
    
}

struct Foo;
impl MyTrait for Foo {}

fn main() {
    let b: Box<dyn MyTrait> = Box::new(Foo);
    let c: &dyn MyTrait = &b;
}

()https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=69c72904fbceae5b55470a878a441b7d)

त्रुटि संदेश है

error[E0277]: the trait bound `Box<dyn MyTrait>: MyTrait` is not satisfied
  --> src/main.rs:10:27
   |
10 |     let c: &dyn MyTrait = &b;
   |                           ^^ the trait `MyTrait` is not implemented for `Box<dyn MyTrait>`
   |
   = note: required for the cast to the object type `dyn MyTrait`

यह स्पष्ट है कि आप एक &Tसे प्राप्त कर सकते हैं Box<T>। मुझे समझ में नहीं आता कि तुम केंट &dyn Tसे ए क्यो नहीं ले सकते Box<dyn T>

जवाब

2 kmdreko Jan 11 2021 at 07:22

एक प्राप्त करने के लिए &dyn Tएक से Box<dyn T>, का उपयोग करें &*:

let c: &dyn MyTrait = &*b;

*करने के लिए प्रयोग किया जाता है deref उसकी सामग्री (में बॉक्स dyn MyTrait) और फिर &एक संदर्भ के रूप में यह प्राप्त करने के लिए प्रयोग किया जाता है।


यह भी एक &Fooसे प्राप्त करने का "सही" तरीका है Box<Foo>&bठोस प्रकारों के साथ काम करने का कारण यह है कि Derefविशेषता &Box<T>को इसके लिए मजबूर किया जा सकता है &T:

यदि T डेरेफ़ को लागू करता है

  • प्रकार और टी के मान प्रकार और यू के मूल्यों के लिए मजबूर हैं

कारण यह है कि यह ऑब्जेक्ट ऑब्जेक्ट्स के लिए काम नहीं करता है जो कि के लिए मान्य &dyn MyTrait हो सकता है &Box<...>और इसके असफल होने पर भी जबरदस्ती का प्रयास नहीं किया जाता है।