मैं [T; N]
के लिए लागू करने की कोशिश कर रहा था। मैंने Default
और swap
(PlayPen) का उपयोग करके एक पूरी तरह से सुरक्षित संस्करण लिखा है। फिर मैंने इसे uninitialized
, ptr::copy
, Drop
और forget
(PlayPen) का उपयोग करने के लिए पोर्ट किया। मेरे इटरेटर struct इस तरह दिखता है:[टी; के बीच क्या अंतर है; एन] और यू अगर यू हमेशा [टी; एन]?
struct IntoIter<T> {
inner: Option<[T; N]>,
i: usize,
}
impl<T> Iterator for IntoIter<T> { ... }
जब से मैं N
का मूल्य प्रति एक इटरेटर struct बनाने के लिए नहीं करना चाहता था, मैं
struct IntoIter<U> {
inner: Option<U>,
i: usize,
}
impl<T> Iterator for IntoIter<[T; N]> { ... }
जाहिर करने के लिए struct बदल रहा Iterator
समायोजित करने के लिए किया था और Drop
कार्यान्वयन (PlayPen)।
लेकिन अब मैंने किसी भी तरह से अपरिभाषित व्यवहार पेश किया है। पैनिक्स println
एस, अनुकूलन स्तर या राशि चक्र संकेतों के आधार पर होता है या नहीं।
thread '<main>' panicked at 'index out of bounds: the len is 5 but the index is 139924442675478', <anon>:25
thread '<main>' panicked at 'index out of bounds: the len is 5 but the index is 140451355506257', <anon>:25
application terminated abnormally with signal 4 (Illegal instruction)
या तो मेरी दूसरी कार्यान्वयन पहले से ही अपरिभाषित व्यवहार दिखाता है, या वहाँ दूसरे और तीसरे कार्यान्वयन के बीच एक अंतर है। जेनरेट (अनुकूलित नहीं) एलएलवीएम-आईआर को देखते हुए, मैंने पाया कि केवल मौलिक अंतर तीसरे संस्करण में होते हैं जो [[Box<i32>; 5]; 5]
प्रकारों के साथ समाप्त होता है। मैं देख सकता हूं कि मैं गलती से इस तरह का एक प्रकार कैसे बना सकता हूं, लेकिन मैंने विशेष रूप से इस तरह की गलती के लिए तीसरे संस्करण की जांच की और इसे नहीं मिला।
ओह, कोई बात नहीं तो, तो पर ले जाने के। – delnan
यू के साथ सुरक्षित संस्करण [टी; एन] ठीक काम करता है: http://is.gd/enk0I3 –