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

时间:2014-06-08 21:22:23

标签: rust private tuple-struct

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

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

我不清楚在这里看到什么是私人的。如下所示,我的模块文件中的两个结构都标有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![]);
}

1 个答案:

答案 0 :(得分:26)

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

有两个修复:

  • 将字段设为公开pub struct JobsList(pub Vec<Job>);
  • 提供公共构造函数

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

    调用JobsList::new(vec![])