【问题标题】:Tuple struct constructor complains about private fields元组结构构造函数抱怨私有字段
【发布时间】:2014-06-08 21:22:22
【问题描述】:

我正在开发一个基本的 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![]);
}

【问题讨论】:

    标签: rust private tuple-struct


    【解决方案1】:

    正如错误消息所示,问题在于JobsList 有一个私有字段,即在定义struct 的模块之外无法访问Vec&lt;Job&gt; 值。这意味着您不能对 JobsList 值进行模式匹配来提取它,并且您不能直接构造它。

    有两个修复:

    • 公开该字段pub struct JobsList(pub Vec&lt;Job&gt;);

    • 提供一个公共构造函数

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

      JobsList::new(vec![])一样调用。

    【讨论】:

      【解决方案2】:

      使用语法不正确的 Box 指针也会导致同样的错误。

          let list_node_5 = ListNode::new(5, None);
          
          //CORRECT SYNTAX: 
          let list_node_4 = ListNode::new(4, Some(Box::new(list_node_5)));
          
          //INCORRECT SYNTAX: 
          let list_node_4 = ListNode::new(4, Some(Box(list_node_5));
      
      

      完整上下文:手动构建一个链表来测试 LeetCode 问题。 https://leetcode.com/problems/remove-nth-node-from-end-of-list/

      
          pub struct ListNode {
            val: i32,
            next: Option<Box<ListNode>>,
          }
          
          impl ListNode {
            pub fn new(val: i32, next: Option<Box<ListNode>>) -> Self {
              ListNode {
                val,
                next,
              }
            }
            //[...]
          }
          
          fn main() {
            let list_node_5 = ListNode::new(5, None);
            let list_node_4 = ListNode::new(4, Some(Box::new(list_node_5)));
            let list_node_4 = ListNode::new(4, Some(Box(list_node_5));
            
            //[...]
            
          }
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-21
        • 2020-08-29
        • 2021-06-11
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2019-10-16
        相关资源
        最近更新 更多