2014-06-08 13 views
8

Sto lavorando a un interprete di shell di base per familiarizzare con Rust. Mentre si lavora sul tavolo per la memorizzazione di lavori sospesi nel guscio, ho ottenuto bloccato al seguente messaggio di errore del compilatore:Il costruttore di tuple struct si lamenta dei campi privati ​​

error: cannot invoke tuple struct constructor with private fields [E0450] 
    let jobs = job::JobsList(vec![]); 
       ^~~~~~~~~~~~~ 

Non è chiaro per me ciò che viene visto come privato qui. Come puoi vedere qui sotto, entrambe le strutture sono contrassegnate con pub nel mio file di modulo. Allora, qual è la salsa segreta?

mod job { 
    use std::fmt; 

    pub struct Job { 
     jid: isize, 
     pid: isize, 
     cmd: String, 
    } 

    pub struct JobsList(Vec<Job>); 
} 

fn main() { 
    let jobs = job::JobsList(vec![]); 
} 

risposta

13

Come suggerisce il messaggio di errore, il problema è JobsList ha un campo privato, cioè, il valore Vec<Job> è inaccessibile al di fuori del modulo che definisce il struct. Ciò significa che non è possibile eseguire lo schema di corrispondenza su un valore JobsList per estrarlo e che non è possibile costruirlo direttamente.

Ci sono due correzioni:

  • rendere il campo pubblico pub struct JobsList(pub Vec<Job>);
  • fornire un costruttore pubblico

    impl JobsList { 
        pub fn new(jobs: Vec<Job>) -> JobsList { 
         JobsList(jobs) 
        } 
    } 
    

    chiamato come JobsList::new(vec![]).

Problemi correlati