2014-06-08 8 views
8

Kendimi Rust ile tanıştırmak için temel bir kabuk yorumlayıcısı üzerinde çalışıyorum. kabuğun içinde süspansiyon işleri saklamak için tablo üzerinde çalışırken, ben aşağıdaki derleyici hata mesajı sıkışmış kazanılmış olması:Tuple struct constructor, özel alanlardan şikayet ediyor

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

Burada özel olarak görülüyor bana ne belirsiz. Aşağıdan görebileceğiniz gibi, her iki yapı da modül dosyamda pub ile etiketlenmiştir. Peki, gizli sos ne? Hata mesajı da anlaşılacağı gibi

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

cevap

13

, sorun Vec<Job> değeri struct tanımlayan modülün dışına erişilemez, yani JobsList özel alanı vardır olduğunu. Bu, onu ayıklamak için bir JobsList değerinde eşleşme yapamayacağınız ve doğrudan yapılandıramayacağınız anlamına gelir.

  • pub struct JobsList(pub Vec<Job>);
  • kamu alanı JobsList::new(vec![]) gibi adında bir public kurucu

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

    sağlamak olun:

    iki düzeltmeleri var.