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
相关产品推荐
相关产品推荐

