2015-12-02 8 views
5

Ich schreibe Wrapper-Code für eine externe C-Bibliothek, und ich versuche, den Rust-Compiler zu überzeugen, externe Lebensdauerbeschränkungen durchzusetzen, die nicht im Rust-Code selbst widergespiegelt werden. Zum Beispiel kann ein Typ von "undurchsichtigem Handle" ein Kind-Handle zurückgeben, das nur für die Lebensdauer des Eltern-Handles gültig ist.Wie erzwinge ich die Lebensdauer der Eltern-Kind-Struktur?

Ich experimentierte mit , aber ich konnte den Compiler nicht überzeugen, den erwarteten Fehler zurückzugeben.

Mit anderen Worten, würde ich den folgenden Codeblock wie nicht kompiliert:

struct Parent; 

struct Child; // Note that there is no reference to the parent struct 

impl Parent { 
    fn get_child(&self) -> Child { 
     Child 
    } 
} 

// I'd like this to complain with "p does not live long enough" 
fn test() -> Child { 
    let p = Parent; 
    p.get_child() 
} 

fn main() { 
    let c = test(); 
} 
+0

Ich gehe davon aus, dass ein Grund, warum Sie nicht wollen, gehen Sie vor und einen Verweis auf den 'Parent' im' Child' hinzufügen? – Shepmaster

Antwort

6

Sie hatte die richtige Idee mit PhantomData. Sie fügen einen PhantomData-Feld für die Lebensdauer zu Child hinzu. Der allgemeine Parameter PhantomData ist, was Sie in der Struktur emulieren möchten. In diesem Fall möchten Sie Child so handeln, als ob es eine &Parent enthält.

struct Child<'a> { 
    parent: PhantomData<&'a Parent>, 
} 

impl Parent { 
    fn get_child<'a>(&'a self) -> Child<'a> { 
     Child { 
      parent: PhantomData, 
     } 
    } 
} 

Sie müssen auch die test Funktion ändern, um ein generisches Argument haben, andernfalls Sie nicht Ihren Wunsch doesn't live long enough Fehler sehen, weil die Child needs a lifetime Fehler zuerst eintreten.

fn test<'a>() -> Child<'a> { 
    let p = Parent; 
    p.get_child() 
} 

Try it out in the Playground

Verwandte Themen