2014-06-08 18 views
8

Tôi đang làm việc trên trình thông dịch shell cơ bản để tự làm quen với Rust. Trong khi làm việc trên bảng để lưu trữ các công việc bị treo trong trình bao, tôi đã bị kẹt ở thông báo lỗi trình biên dịch sau:Tuple struct constructor than phiền về các trường riêng tư

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

Điều này không rõ ràng với tư cách cá nhân ở đây. Như bạn có thể thấy bên dưới, cả hai cấu trúc đều được gắn thẻ với pub trong tệp mô-đun của tôi. Vậy, nước sốt bí mật là gì?

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

Trả lời

13

Như thông báo lỗi cho thấy, vấn đề là JobsList có một lĩnh vực tư nhân, có nghĩa là, giá trị Vec<Job> là không thể tiếp cận bên ngoài module định nghĩa struct. Điều này có nghĩa là bạn không thể khớp mẫu trên giá trị JobsList để trích xuất và bạn không thể tạo nó trực tiếp.

Có hai sửa:

  • làm cho lĩnh vực công cộng pub struct JobsList(pub Vec<Job>);
  • cung cấp một constructor nào

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

    gọi như JobsList::new(vec![]).

Các vấn đề liên quan