इस कोड (playground):अप्रत्याशित संकलक त्रुटि में एक विशेषता परिणाम पाने, लेकिन मैनुअल कार्यान्वयन काम करता है
#[derive(Clone)]
struct Foo<'a, T: 'a> {
t: &'a T,
}
fn bar<'a, T>(foo: Foo<'a, T>) {
foo.clone();
}
... संकलन नहीं है कुछ भी, जैसा कि यह पहले से ही प्रस्ताव में है।
जब मैं #[derive(Clone)]
और मैन्युअल रूप से हटाने के लिए Foo
Clone
लागू, अपेक्षा के अनुरूप यह कम्पाइल हो गया!
impl<'a, T> Clone for Foo<'a, T> {
fn clone(&self) -> Self {
Foo {
t: self.t,
}
}
}
यहां क्या हो रहा है?
- क्या
#[derive()]
-impls और मैन्युअल के बीच कोई अंतर है? - क्या यह एक कंपाइलर बग है?
- कुछ और मैंने नहीं सोचा था?
यह एक अच्छा समाधान है, लेकिन मैं * कार्यात्मक रूप से समान * से असहमत हूं - इस मामले में, संरचना में केवल 'टी' हो सकता है जो 'क्लोन' लागू करता है, लेकिन वह विशेष बाध्य ** आवश्यक ** नहीं है एक संदर्भ क्लोन करें। यदि कार्यक्रम को अन्य कारणों से 'टी' क्लोन करने की आवश्यकता है, तो यह काम करता है। – Shepmaster
ओह, मुझे लगता है कि आपके उदाहरण से 'टी: :: std :: क्लोन :: क्लोन + 'ए' का मतलब है कि' टी' ने 'क्लोन' को लागू किया है; क्या मैं गलतफहमी कर रहा हूँ? – Aurora0001
@ शेमपस्टर, कुछ परीक्षणों के बाद मुझे पता चला है कि आप बिना किसी समस्या के संरचना में 'टी' पर 'क्लोन' को बाध्य कर सकते हैं, और ऐसा करके मैं विस्तारित सुंदर प्रिंटर से मैन्युअल रूप से ' '। – Aurora0001