बॉक्स से एक & dyn T कैसे प्राप्त करें
मैं एक &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>
।
जवाब
एक प्राप्त करने के लिए &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<...>
और इसके असफल होने पर भी जबरदस्ती का प्रयास नहीं किया जाता है।