2014-09-18 2 views
11

Folgende compiles fein:Wie implementiere ich eine Struktur, die einen generischen Vektor mit lebenslangen Annotationen verwendet?

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

Es ist ein Leser, die einen Vektor (eigentlich eine Scheibe) vom Typ u8 als Referenz, und ich geben Sie die Lebensdauer nimmt.

Dies ist jedoch nicht genau das, was ich will. Ich möchte in der Lage sein, die Struktur generisch zu machen, und um noch genauer zu sein, möchte ich bezeichnen, dass der Typ ein Stück von irgendetwas sein sollte. Ich habe versucht, dies für den Anfang:

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

Es ist nicht T nicht bezeichnet eine Scheibe zu sein, aber dies ist bereits mit einer Meldung Fehler:

der Parametertyp T möglicherweise nicht lange genug leben; Sehen Sie eine explizite Lebensdauer T:'a ...

Ok, so musste ich einfach geben Sie die Lebensdauer gebunden hinzufügen.

Aber jetzt ist mein Problem, dass, wie mache ich es generische Typ Scheibe und habe die Lebensdauer? Ich probierte Dinge wie Reader<'a, T: 'a Vec> und T: 'a [T], aber ich habe keine Ahnung, wie ich das bezeichnen soll und der offizielle Führer scheint sich nicht mit einem Fall wie diesem zu befassen.

Ich möchte einfach einen Reader konstruieren, der jede Art von Slice aufnimmt, indem er sie entleiht, und Methoden zur Verfügung stellt, um mit den Daten zu arbeiten (schreibgeschützt).

Antwort

21

Nach etwas mehr versucht, habe ich es schließlich aus:

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

Dieser des Lesers definiert data vom Typ sein Slice<T> ([] bezeichnet die Scheibe) und &'a gibt die Lebensdauer der geliehene Daten.

Jetzt kann ich Sachen wie diese umzusetzen:

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

Sehr hilfreich! Danke für deine Lösung! – Gedweb

7

nicht direkt beantworten zu wollen, es ist nur, dass ich auf diese kam so beantworten, wenn ich eine Antwort auf mein eigenes Problem suchen: Wie ein bewerben generische Typbeschränkung und eine Lebensdauerbeschränkung für das Feld einer Struktur.

(Hier ist die Arbeitslösung kam ich mit.)

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 
} 
Verwandte Themen