2014-09-18 6 views
11

Poniższe kompiluje:Jak zaimplementować strukturę, która pobiera ogólny wektor z adnotacjami dożywotnimi?

pub struct Reader<'a> { 
    position: uint, 
    data: &'a [u8] 
} 

Jest to czytnik, który zajmuje wektor (faktycznie plasterka) typu u8 jako odniesienie, i określić żywotność.

Jednak nie jest to dokładnie to, czego chcę. Chcę być w stanie uczynić strukturę struct, a jeszcze bardziej precyzyjnie, chcę zaznaczyć, że typ powinien być fragmentem czegokolwiek. Próbowałem to na początek:

pub struct Reader<'a, T> { 
    position: uint, 
    data: &'a T 
} 

To nie oznacza T się kawałek, ale to już niepowodzeniem z komunikatem:

typ parametru T nie mogą żyć wystarczająco długo; rozważyć dodanie wyraźny całe życie związany T:'a ...

Ok więc ja po prostu musiał określić żywotność.

Ale teraz mój problem polega na tym, że w jaki sposób sprawić, by był on generyczny dla plasterka typu i miałby on trwałość? Próbowałem takich rzeczy jak Reader<'a, T: 'a Vec> i T: 'a [T], ale nie mam pojęcia, jak mam to oznaczać, a oficjalny przewodnik nie wydaje się zajmować takim przypadkiem.

Po prostu chcę zbudować czytnik, który pobiera dowolny rodzaj plastra, pożyczając go, i zapewnia metody działania na danych (w trybie tylko do odczytu).

Odpowiedz

21

Po wypróbowaniu trochę więcej, ale w końcu zorientowaliśmy się:

pub struct Reader<'a, T: 'a> { 
    position: uint, 
    data: &'a [T] 
} 

ta określa czytelnika data być typu Slice<T> ([] oznacza kawałek) i &'a określa żywotność dla zapożyczonych danych.

Teraz mogę realizować rzeczy tak:

impl<'a, T> Reader<'a, T> { 
    pub fn from_data(bytes: &'a[T]) -> Reader<'a, T> { 
     Reader { 
      position: 0, 
      data: bytes 
     } 
    } 
} 
+0

Bardzo pomocne! Dzięki za przesłanie rozwiązania! – Gedweb

7

Nie chcąc odpowiedzieć bezpośrednio, tylko że natknąłem to SO odpowiedzieć kiedy szukałem odpowiedzi na moje własne problemu: jak zastosować ograniczenie typu ogólnego i ograniczenie okresu istnienia do pola struct.

(Tutaj jest roztwór roboczy wymyśliłem.)

use std::io::Writer; 

// This specifies lifetime constraint of 'a 
// Type W must implement the Writer trait 
// Type W has the lifetime 'a (the same as the related struct instance) 
pub struct Foo<'a, W: 'a + Writer> { 
    writer: &'a mut W 
} 
Powiązane problemy