You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust报错“struct Todo的字段id是私有的”如何解决?

问题原因

Rust 中,即便结构体标记为pub,其字段默认仍为私有,仅能在定义该结构体的模块内部直接访问。你的Todo结构体位于crate::app::model::todo模块,而get_todo函数在其他模块中,因此无法直接初始化私有字段。

解决方法

提供两种常用方案,可根据需求选择:

方案1:将结构体字段设为公开

直接为每个字段添加pub修饰符,允许外部模块直接访问和初始化字段:

// 在crate::app::model::todo模块中
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct Todo {
    pub id: Option<u32>,
    pub content: String,
    pub completed: bool,
}

修改后,你原来的get_todo函数代码无需改动即可正常运行。

方案2:提供公开的构造函数(推荐)

保持字段私有,通过定义公开的关联函数(构造函数)来创建Todo实例,兼顾封装性:

// 在crate::app::model::todo模块中
use serde::{Serialize, Deserialize};

#[derive(Debug, Serialize, Deserialize)]
pub struct Todo {
    id: Option<u32>,
    content: String,
    completed: bool,
}

impl Todo {
    // 公开的构造函数,供外部模块调用
    pub fn new(id: Option<u32>, content: String, completed: bool) -> Self {
        Todo {
            id,
            content,
            completed,
        }
    }
}

然后在get_todo函数中调用构造函数初始化实例:

#[get("/todos/{id}")]
async fn get_todo(id: web::Path<u32>) -> impl Responder {
    let id_option: Option<u32> = Some(id.into_inner());
    HttpResponse::Ok().json(Todo::new(id_option, String::from("やること"), false))
}
额外注意事项

因为你使用了Actix Web的JSON序列化/反序列化,必须为Todo结构体添加#[derive(Serialize, Deserialize)]宏,并在Cargo.toml中添加serde依赖:

[dependencies]
serde = { version = "1.0", features = ["derive"] }

内容的提问来源于stack exchange,提问作者assa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:16:08