我正在开发一个基本的shell解释器,以熟悉Rust.在处理将挂起的作业(job)存储在shell中的表时,我遇到了以下编译器错误消息:

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

我不清楚这里什么是私有的.正如您在下面看到的,在我的模块文件中,这两个 struct 都被标记为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![]);
}

推荐答案

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

有两种修复方法:

  • 公开这一领域

  • 提供一个公共构造函数

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

    打了JobsList::new(vec![])个电话.

Rust相关问答推荐

在HashMap中插入Vacant条目的可变借位问题

为什么类型需要在这个代码中手动指定,在rust?

如何点击()迭代器?

如果包名称与bin名称相同,并且main.ars位于工作区的同一 crate 中,则无法添加对lib.ars的依赖

在Rust中判断编译时是否无法访问

rust 蚀生命周期 不匹配-不一定超过此处定义的生命周期

无法将 rust 蚀向量附加到另一个向量

不同类型泛型的映射

带引脚和不带引脚的比较功能

结果流到 Vec 的结果:如何避免多个into_iter和collect?

Rust 文件未编译到 dll 中

Rust并发读写引起的死锁问题

如何在 Rust 中按 char 对字符串向量进行排序?

如何在 Rust 中将枚举变体转换为 u8?

在 Rust 中使用 `SecTrustSettingsSetTrustSettings` 绑定导致 `errSecInternalComponent`

如何使用泛型满足 tokio 异步任务中的生命周期界限

返回引用字符串的future

使用 serde_json 进一步处理字段

如何从 many0 传播 Nom 失败上下文?

如何将 while 循环内的用户输入添加到 Rust 中的向量?