Ich habe versucht, IntoIterator
für [T; N]
zu implementieren. Ich schrieb eine völlig sichere Version mit Default
und swap
(PlayPen). Dann habe ich es portiert, um uninitialized
, ptr::copy
, Drop
und forget
(PlayPen) zu verwenden. Meine Iterator Struktur sieht wie folgt aus:Was ist der Unterschied zwischen [T; N] und U wenn U immer auf [T; N]?
struct IntoIter<T> {
inner: Option<[T; N]>,
i: usize,
}
impl<T> Iterator for IntoIter<T> { ... }
Da ich kein Iterator struct pro Wert von N
erstellen wollte, änderte ich die Struktur zu
struct IntoIter<U> {
inner: Option<U>,
i: usize,
}
impl<T> Iterator for IntoIter<[T; N]> { ... }
Offensichtlich ich die Iterator
einstellen musste und Drop
Implementierungen (PlayPen).
Aber jetzt habe ich irgendwie undefiniertes Verhalten eingeführt. Panics passieren oder nicht abhängig von println
s, Optimierungsstufen oder Tierkreiszeichen.
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)
Entweder meine zweite Implementierung bereits undefiniertes Verhalten zeigt, oder es gibt einen Unterschied zwischen den zweiten und dritten Implementierungen. Beim Betrachten des generierten (nicht optimierten) LLVM-IR habe ich festgestellt, dass die einzigen grundlegenden Unterschiede in der dritten Version auftreten, die mit [[Box<i32>; 5]; 5]
Typen endet. Ich kann sehen, wie ich versehentlich einen solchen Typ erstellen könnte, aber ich habe speziell die dritte Version für einen solchen Fehler überprüft und kann ihn nicht finden.
Oh, vergiss es dann weitermachen dann. – delnan
die sichere Version mit dem U als [T; N] funktioniert gut: http://is.gd/enk0I3 –