2014-06-08 11 views
8

Ich arbeite an einem grundlegenden Shell-Interpreter, um mich mit Rust vertraut zu machen. Während für die Speicherung von suspendierten Arbeitsplätzen in der Schale auf dem Tisch arbeite, habe ich auf der folgenden Compiler-Fehlermeldung steckengeblieben:Tuple struct Konstruktor beschwert sich über private Felder

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

Es ist mir unklar, was hier als privat angesehen wird. Wie Sie unten sehen können, sind beide Strukturen mit pub in meiner Moduldatei markiert. Also, was ist die geheime Soße?

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

Antwort

13

Da die Fehlermeldung schon sagt, ist das Problem JobsList ein eigenes Feld hat, das heißt, der Vec<Job> Wert liegt außerhalb des Moduls nicht zugänglich, die die struct definiert. Das bedeutet, dass Sie keine Mustererkennung für einen JobsList-Wert erstellen können, um ihn zu extrahieren, und dass Sie ihn nicht direkt erstellen können.

Es gibt zwei Korrekturen:

  • das Feld pub struct JobsList(pub Vec<Job>);
  • bieten einen öffentlichen Konstruktor

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

    genannt wie JobsList::new(vec![]) öffentlich machen.

Verwandte Themen