मेरे पास एक विशेषता है जिसमें मैं एक विधि प्रदान करना चाहता हूं। विधि कुछ सहायकों के संदर्भ में लागू की जानी चाहिए जिनके पास गुण के अंदर कोई व्यवसाय नहीं है और वे गैर-तुच्छ पर्याप्त हैं कि गतिशील बहुरूपता उन्हें सामान्य बनाने से अधिक समझ में आता है। इसलिए मैंऑब्जेक्ट का पता लगाने के लिए विधि कास्टिंग और स्वयं प्रदान किया गया
fn use_trait(x: &Trait) {
println!("object says {}", x.needed());
}
trait Trait {
fn needed(&self) -> &str;
fn provided(&self) {
use_trait(self);
}
}
struct Struct();
impl Trait for Struct {
fn needed(&self) -> &str {
"Hello, world!"
}
}
fn main() {
Struct().provided();
}
कौन सा है, तथापि, does not compile की तर्ज पर कोड है, त्रुटि के साथ:
error[E0277]: the trait bound `Self: std::marker::Sized` is not satisfied
--> <anon>:9:19
|
9 | use_trait(self);
| ^^^^ the trait `std::marker::Sized` is not implemented for `Self`
|
= help: consider adding a `where Self: std::marker::Sized` bound
= note: required for the cast to the object type `Trait`
मुझे समझ में क्यों यह गारंटी नहीं है कि किसी एक अनवधि प्रकार के लिए विशेषता को लागू नहीं होगा (&T where T: Trait
से &Trait
में कनवर्ट करने की आवश्यकता T: Sized
है, लेकिन घोषणा की आवश्यकता नहीं है)।
हालांकि, सलाह जो मुझे चाहिए वह नहीं करेगी। मैं
fn needed(&self) -> &str where Self: Sized
जोड़ सकते हैं, लेकिन फिर needed()
विधि &Trait
(Trait : ?Sized
क्योंकि) है, जो बात बेकार renders पर सुलभ हो नहीं होगा, क्योंकि प्रकार (वास्तविक एक है कि कुछ उपयोगी करता है) हमेशा होता हैArc<Trait>
के रूप में संभाला गया। और
trait Trait: Sized
जोड़ने भी बदतर है, (ताकि Trait
प्रकार करता है नहीं विशेषता Trait
लागू, Trait
के रूप में एक प्रकार अनवधि है) है, क्योंकि है कि सभी पर &Trait
अनुमति नहीं देता है।
मैं बस
fn use_trait<T: Trait>(x: &T)
कर सकते हैं लेकिन वहाँ वास्तविक कोड में इसके पीछे एक बहुत है, इसलिए मैं monomorphisation वहाँ नहीं करना चाहता, खासकर जब से विशेषता अन्यथा हमेशा विशेषता वस्तु के रूप में नियंत्रित किया जाता है।
क्या जंग को बताने का कोई तरीका है कि impl Trait
के सभी प्रकारों का आकार होना चाहिए और यहां एक विधि की परिभाषा है जो उन सभी के लिए काम करनी चाहिए?
यह भी देखें [जंग ट्राइट ऑब्जेक्ट रूपांतरण] (http://stackoverflow.com/q/41604107/155423) – Shepmaster