[T; N]
için IntoIterator
uygulamasını deniyordum. Default
ve swap
(PlayPen) kullanarak tamamen güvenli bir sürüm yazdım. Daha sonra onu uninitialized
, ptr::copy
, Drop
ve forget
(PlayPen) kullanmak üzere kullandım. Benim Yineleyici yapı şöyle görünür: Ben N
değeri başına bir Yineleyici yapı oluşturmak istemiyordu yana[T; U ve U her zaman [T; K]?
struct IntoIter<T> {
inner: Option<[T; N]>,
i: usize,
}
impl<T> Iterator for IntoIter<T> { ... }
, ben Iterator
ayarlamak zorunda
struct IntoIter<U> {
inner: Option<U>,
i: usize,
}
impl<T> Iterator for IntoIter<[T; N]> { ... }
için yapı değişti ve Drop
uygulamaları (PlayPen). Ama şimdi bir şekilde tanımlanmamış davranışları tanıttım. Panikler println
s, optimizasyon seviyelerine veya zodyak işaretlerine bağlıdır.
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)
Ya benim ikinci uygulama zaten tanımsız davranış sergileyen, veya ikinci ve üçüncü uygulamalar arasında bir fark yoktur. Oluşturulan (optimize edilmemiş) LLVM-IR'ye baktığımızda, üçüncü versiyonda [[Box<i32>; 5]; 5]
türüyle sonuçlanan tek temel farkların meydana geldiğini buldum. Yanlışlıkla böyle bir tür yaratabileceğimi görebiliyorum, ancak üçüncü bir sürümü özellikle böyle bir hata için kontrol ettim ve bulamıyorum.
Ah, boşver o zaman, o zaman devam. – delnan
güvenli sürümü U ile [T; N] iyi çalışıyor: http://is.gd/enk0I3 –