2014-06-08 20 views
8

Pracuję nad podstawowym interpreterem powłoki, aby zapoznać się z Rustem. Pracując na stole do przechowywania zawieszone pracy w skorupkach, Dostałem zatrzymany pod następującym komunikatem o błędzie kompilatora:Konstruktor konstrukcji Tuple narzeka na prywatne pola

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

Jest dla mnie jasne, co jest postrzegane jako prywatne tutaj. Jak widać poniżej, obie struktury są oznaczone w moim pliku modułu jako pub. Jaki jest sekretny sos?

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![]); 
} 

Odpowiedz

13

Jak sugeruje komunikat o błędzie, problem jest JobsList posiada prywatny pola, czyli wartość Vec<Job> jest niedostępne poza modułem, który definiuje struct. Oznacza to, że nie można dopasować wzorca na wartości JobsList, aby ją wyodrębnić i nie można jej bezpośrednio skonstruować.

Są dwie poprawki:

  • uczynić pole publicznego pub struct JobsList(pub Vec<Job>);
  • zapewnić publicznego konstruktora

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

    nazwie jak JobsList::new(vec![]).