为什么在多个文件中使用结构时会出现 "expected struct file1::A found struct file2::A" 错误?

Why do I get "expected struct file1::A found struct file2::A" error when using a struct in multiple files?

我试图在两个文件之间共享一个结构,但出现错误。

我有以下文件夹结构:

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))
}

我在 return sk 行的 LoginRoute.rs 中遇到错误:

expected struct 'LoginRoute::Login::UserLoginResponse', found struct 'LoginService::Login:UserLoginResponse'

请不要为您的典型组织使用 #[path = ...] 属性;它应该只在模糊的情况下使用。每次 mod something,您都在声明一个 新模块 。由于#[path = ...],即使两个模块指向同一个文件,它们也是不同的。

所以你声明了多个 UserLoginResponse 结构:

  • 一个在 crate::LoginRoute::Login::UserLoginResponse
  • 一个在 crate::LoginService::Login:UserLoginResponse
  • 如果您还在 main.rs.
  • 中声明了 Login,也许还有另一个

由于它们在不同的模块中,Rust 编译器将它们视为不同的类型,这不是您想要的。

只需使用惯用的方式声明模块。如果你想保留现有的文件夹结构而没有中间 mod.rs 文件,你可以在 main.rs 中声明它们,如下所示:

mod Models {
    pub mod Login;
}
mod Routes {
    pub mod LoginRoute;
}
mod Services {
    pub mod LoginService;
}

然后通过 crate::Models::Login 等其他方式访问它们。

参见:

  • How do I import from a sibling module?

您可能已经 运行 收到编译器发出的试图鼓励特定样式的警告:"module [...] should have a snake case name"。惯用的文件结构通常如下所示:

src/
  models/
    login.rs
    mod.rs
  routes/
    login_route.rs
    mod.rs
  services/
    login_service.rs
    mod.rs
  main.rs

main.rs 的位置:

mod models;
mod routes;
mod services;

src/models/mod.rs(例如)将有:

pub mod login;