为什么在多个文件中使用结构时会出现 "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;
我试图在两个文件之间共享一个结构,但出现错误。
我有以下文件夹结构:
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;