元组结构构造函数抱怨私有字段

Gru*_*sch 19 private rust tuple-struct

我正在研究一个基本的shell解释器,以熟悉Rust.在用于在shell中存储挂起作业的表上工作时,我遇到了以下编译器错误消息:

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

我不清楚在这里看到什么是私人的.如下所示,两个结构都pub在我的模块文件中标记.那么,秘诀是什么?

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![]);
}
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 28

正如错误消息所示,问题是JobsList有一个私有字段,也就是说,在Vec<Job>定义该模块的模块之外,该值是不可访问的struct.这意味着您无法对JobsList值进行模式匹配以提取它,并且您无法直接构造它.

有两个修复:

  • 让这个领域公开 pub struct JobsList(pub Vec<Job>);
  • 提供公共构造函数

    impl JobsList {
        pub fn new(jobs: Vec<Job>) -> JobsList {
            JobsList(jobs)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    叫起来像JobsList::new(vec![]).