2015-08-21 25 views
5

Çeşitli yapılar için Iterator özelliğini uyguluyordum ve bazı sorunlarla karşılaşıyordum. Neden Rows için Iterator uygulanıyor hata gösteriyor? İşte bir link: link to playgroundIterator uygularken ömür boyu sorun

Temelde neden bu işe yaramıyor?

struct Stripe<'a> { 
    cells: &'a [u32], 
} 

struct Rows<'a> { 
    foo: &'a Foo, 
    vec: Vec<u32>, 
    first: bool, 
} 

impl<'a> std::iter::Iterator for Rows<'a> { 
    type Item = Stripe<'a>; 
    fn next(&mut self) -> Option<Stripe<'a>> { 
     if self.first { 
      self.first = false; 
      Some(
       Stripe { 
        cells: &self.vec[0..1], 
       } 
      ) 
     } else { 
      None 
     } 
    } 
} 
+0

Tamam, sayesinde ben çalışacağım – Spiderpig

+2

Ve kodunuzun bir [MCVE] (/ help/mcve) olduğundan emin olun. * Doğrudan * sorunuzu ilgilendiren tüm tüyleri çıkarabilmeniz gerekir. – Shepmaster

+1

Kodumu reddettim, bu yeterince okunabilir mi? – Spiderpig

cevap

2

türü süresi 'a tip tek bir alanı belirtmektedir. Döndüğünüz referansların bu ömürle ilgisi yoktur. Iterator özelliği, yaşamları yineleyici nesnesinin kendisine geri döndürmenize izin vermez. Bu, next işlevine yeni bir ömür eklemek gerektirecektir.

Oraya yineleyici özgü şeyler sizin Rows nesneye referans içeren bir RowsIterator türü oluşturmak ve işlemek önermek:

struct Stripe<'a> { 
    cells: &'a [u32], 
} 

struct Rows { 
    vec: Vec<u32>, 
} 

struct RowsIter<'a> { 
    rows: &'a Rows, 
    first: bool, 
} 

impl<'a> std::iter::Iterator for RowsIter<'a> { 
    type Item = Stripe<'a>; 
    fn next(&mut self) -> Option<Stripe<'a>> { 
     if self.first { 
      self.first = false; 
      Some(
       Stripe { 
        cells: &self.rows.vec[0..1], 
       } 
      ) 
     } else { 
      None 
     } 
    } 
} 

Tam örnek playground

+0

Teşekkürler, açıklamanıza yardımcı oldu. Ama hala bir sorunum var, çünkü aslında Foo'ya ihtiyacım var, ama sanırım kendimle baş edebilirim. – Spiderpig

+0

Tam örnek için teşekkür ederiz, ilk başta farketmediniz. – Spiderpig

+0

aslında 'Satırlar' foo 'referansının ömürlerini ve' RowsIter 'satırlarının referansının ömrünü ayırabilirsiniz, ancak büyük olasılıkla buna ihtiyacınız yoktur. Sadece tam örnekte aynı ömrü kullandım. Yaşam sürelerinin farklı olduğu bir örnek için buraya bakın: http://is.gd/hb09uj –

İlgili konular