为什么在多个文件中使用结构时会出现“预期结构文件 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.rsreturn 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
  • 也许再如果你也宣告Loginmain.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;

以上是为什么在多个文件中使用结构时会出现“预期结构文件 1::A 发现结构文件 2::A”错误?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>