gpt4 book ai didi

rust - 在多个文件和 main.rs 中共享模块

转载 作者:行者123 更新时间:2023-12-03 11:29:45 24 4
gpt4 key购买 nike

地球人好日子。
我正在尝试用 Rust 做我认为在概念上很简单的事情,但我似乎在与编译器作斗争并需要一些帮助。
我有一个非常简单的小项目,实际上有 3 个文件

├── cargo.toml
├── src
├── main.rs
├── api.rs
└── state.rs

src/state.rs基本上是代表系统状态的结构的集合。
IE
#[derive(Debug,Serialize)]
pub struct State {
pub field1: String,
pub field2: String,
}
这是事情有点出轨的地方。 src/api.rs需要使用 src/state.rs 中定义的结构
如果我尝试 mod state.rssrc/api.rs 的顶部,编译器在 /src/api/state.rs 中查找模块.我可以通过执行以下操作使其在正确的文件中查找模块:
#[path = "system.rs"]
mod system;

use system::*;
use rocket::State;
use rocket_contrib::json::Json;
use serde_json::Value;
use std::sync::{Arc,RwLock};

#[get("/")]
pub fn get_all(state: State<Arc<RwLock<system::State>>>) -> Json<Value> {
return Json(json!(&*state.read().unwrap()));
}

pub fn start_api(state: Arc<RwLock<system::State>>) {
rocket::ignite()
.manage(state)
.mount("/", routes![get_all]).launch();
}
src/main.rs , 状态被建立然后传递到 start_api()功能。
但是,编译器通过声明类型不匹配来停止这种情况。
它说...
mismatched types

expected struct `api::system::State`, found struct `system::State`

note: expected struct `std::sync::Arc<std::sync::RwLock<api::system::State>>`
found struct `std::sync::Arc<std::sync::RwLock<system::State>>`rustc(E0308)
状态模块被带入 main.rsapi.rs 中的相同
#![feature(decl_macro)]

...
extern crate rocket;
extern crate rocket_contrib;

mod system;
mod api;

use std::sync::{Arc,RwLock};
use std::thread;
...

fn main() {
// Initialise state
start_api(api_state); // << Type Error Here
}
我哪里出轨了?当所有内容都在同一个文件中时,这一切都有效。
我正在尝试将其拆分为 main.rs接近几百行。
加油~!

最佳答案

如 LotB 所述,而不是

#[path = "system.rs"]
mod system;

use rocket::State;
...
#[get("/")]
pub fn get_all(state: State<Arc<RwLock<system::State>>>) -> Json<Value> {
return Json(json!(&*state.read().unwrap()));
}

pub fn start_api(state: Arc<RwLock<system::State>>) {
rocket::ignite()
.manage(state)
.mount("/", routes![get_all]).launch();
}
我需要更换 mod stateuse crate::system::State;结束于:
use crate::system::State;

use rocket::State;
use rocket_contrib::json::Json;
use serde_json::Value;
use std::sync::{Arc,RwLock};

#[get("/")]
pub fn get_all(state: State<Arc<RwLock<State>>>) -> Json<Value> {
return Json(json!(&*state.read().unwrap()));
}

pub fn start_api(state: Arc<RwLock<State>>) {
rocket::ignite()
.manage(state)
.mount("/", routes![get_all]).launch();
}
谢谢LotB。

关于rust - 在多个文件和 main.rs 中共享模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63718228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com