为什么在多个文件中使用结构时会出现“预期结构文件 1::A 发现结构文件 2::A”错误?
我试图在两个文件之间共享一个结构,但出现错误。
我有以下文件夹结构:
src/
Models/
Login.rs
Routes/
LoginRoute.rs
Services/
LoginService.rs
main.rs
在Login.rs我有:
#[derive(Serialize, Deserialize, Debug)]
pub struct UserLoginResponse {
id: i32,
username: String,
token: String
}
在LoginRoute.rs我有:
#[path = "../Models/Login.rs"]
pub mod Login;
#[path = "../Services/LoginService.rs"]
pub mod LoginService;
#[post("/login", format = "application/json", data = "<user>")]
pub async fn login(user: String) -> Json<Login::UserLoginResponse> {
if let Ok(sk) = LoginService::callAuthenticate(user).await {
return sk
......
在LoginService.rs我有:
#[path = "../Models/Login.rs"]
pub mod Login;
pub async fn callAuthenticate(user: String)-> Result<Json<Login::UserLoginResponse>, Error> {
...
let userLoginResponse :Login::UserLoginResponse = Login::UserLoginResponse::new(1, "admin".to_string(), api_reponse.return_result);
Ok(Json(userLoginResponse))
}
我收到错误LoginRoute.rs就return sk行:
#[derive(Serialize, Deserialize, Debug)]
pub struct UserLoginResponse {
id: i32,
username: String,
token: String
}
回答
请不要将该#[path = ...]属性用于您的典型组织;它应该只用于模糊的情况。每次这样做mod something,都是在声明一个新模块。即使由于 两个模块指向同一个文件#[path = ...],它们也将是不同的。
所以你UserLoginResponse声明了多个结构:
- 一个在
crate::LoginRoute::Login::UserLoginResponse - 一个在
crate::LoginService::Login:UserLoginResponse - 也许再如果你也宣告
Login在main.rs。
由于它们在不同的模块中,Rust 编译器将它们视为不同的类型,这不是您想要的。
只需使用声明模块的惯用方式。如果您想保留现有的文件夹结构而没有中间mod.rs文件,您可以main.rs像这样声明它们:
mod Models {
pub mod Login;
}
mod Routes {
pub mod LoginRoute;
}
mod Services {
pub mod LoginService;
}
然后通过其他方式访问它们crate::Models::Login。
看:
- 如何从兄弟模块导入?
您可能已经遇到来自编译器试图鼓励特定样式的警告:"module [...] should have a snake case name". 惯用的文件结构通常如下所示:
mod Models {
pub mod Login;
}
mod Routes {
pub mod LoginRoute;
}
mod Services {
pub mod LoginService;
}
哪里main.rs会有:
mod models;
mod routes;
mod services;
并且src/models/mod.rs(例如)将具有:
pub mod login;
THE END
二维码