我试图在两个文件之间共享一个结构,但出现错误。
我有以下文件夹结构:
src/
Models/
Login.rs
Routes/
LoginRoute.rs
Services/
LoginService.rs
main.rs
Run Code Online (Sandbox Code Playgroud)
在Login.rs我有:
#[derive(Serialize, Deserialize, Debug)]
pub struct UserLoginResponse {
id: i32,
username: String,
token: String
}
Run Code Online (Sandbox Code Playgroud)
在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
......
Run Code Online (Sandbox Code Playgroud)
在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))
}
Run Code Online (Sandbox Code Playgroud)
我收到错误LoginRoute.rs就return sk行:
#[derive(Serialize, Deserialize, Debug)]
pub struct UserLoginResponse {
id: i32,
username: String,
token: String
}
Run Code Online (Sandbox Code Playgroud)
请不要将该#[path = ...]属性用于您的典型组织;它应该只用于模糊的情况。每次这样做mod something,都是在声明一个新模块。即使由于 两个模块指向同一个文件#[path = ...],它们也将是不同的。
所以你UserLoginResponse声明了多个结构:
crate::LoginRoute::Login::UserLoginResponsecrate::LoginService::Login:UserLoginResponseLogin在main.rs。由于它们在不同的模块中,Rust 编译器将它们视为不同的类型,这不是您想要的。
只需使用声明模块的惯用方式。如果您想保留现有的文件夹结构而没有中间mod.rs文件,您可以main.rs像这样声明它们:
mod Models {
pub mod Login;
}
mod Routes {
pub mod LoginRoute;
}
mod Services {
pub mod LoginService;
}
Run Code Online (Sandbox Code Playgroud)
然后通过其他方式访问它们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;
}
Run Code Online (Sandbox Code Playgroud)
哪里main.rs会有:
mod models;
mod routes;
mod services;
Run Code Online (Sandbox Code Playgroud)
并且src/models/mod.rs(例如)将具有:
pub mod login;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |