2015-12-02 13 views
5

Sto scrivendo codice wrapper per una libreria C esterna e sto cercando di convincere il compilatore di Rust a far rispettare le restrizioni di durata esterna che non si riflettono nel codice Rust stesso. Ad esempio, un tipo di "handle opaco" può restituire un handle figlio che è valido solo per la durata dell'handname padre.Come si impone la durata della struttura padre-figlio?

Ho sperimentato con std::marker::PhantomData, ma non ho potuto convincere il compilatore a restituire l'errore previsto.

In altre parole, mi piacerebbe il seguente blocco di codice non riuscire a compilare:

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

Presumo ci sia qualche motivo non si vuole andare avanti e aggiungere un riferimento al 'Parent' nel' Child'? – Shepmaster

risposta

6

hai avuto l'idea giusta con PhantomData. Aggiungere un parametro di durata e un campo PhantomData a Child. Il parametro generico PhantomData è ciò che si desidera emulare nella struttura. In questo caso si desidera che Child agisca come se contenga uno &Parent.

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

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

È inoltre necessario modificare la funzione test di avere un argomento generico, altrimenti non si vede la tua richiesta doesn't live long enough errore, perché l'errore Child needs a lifetime si verifica per primo.

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

Try it out in the Playground

Problemi correlati