Rust 在多个文件和main.rs中共享模块
地球人,你好 我正在尝试做一些我认为在概念上简单的关于生锈的事情,但是我似乎在与编译器作斗争,并且希望得到一些帮助 我有一个非常简单的小项目,它有3个文件Rust 在多个文件和main.rs中共享模块,rust,Rust,地球人,你好 我正在尝试做一些我认为在概念上简单的关于生锈的事情,但是我似乎在与编译器作斗争,并且希望得到一些帮助 我有一个非常简单的小项目,它有3个文件 ├── cargo.toml ├── src ├── main.rs ├── api.rs └── state.rs src/state.rs基本上是表示系统状态的结构的集合。 即 这就是事情有点出轨的地方 src/api.rs需要使用src/state.rs #![feature(decl_macr
├── cargo.toml
├── src
├── main.rs
├── api.rs
└── state.rs
src/state.rs
基本上是表示系统状态的结构的集合。
即
这就是事情有点出轨的地方
src/api.rs
需要使用src/state.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
}
如果我在src/api.rs
的顶部尝试mod state.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();
}
状态模块进入main.rs
,与在api.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
}
#![功能(decl_宏)]
...
外部板条箱火箭;
外部板条箱火箭;
mod系统;
modapi;
使用std::sync::{Arc,RwLock};
使用std::线程;
...
fn main(){
//初始化状态
启动LotB规定的api(api状态);//,而不是
#[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();
}
感谢LotB。因此,您从不同的位置(api和main)声明了相同的系统
mod,在api中重写以获得正确的路径。您不应该多次声明它。通常的方法是只在main中声明mod system
,其他所有内容都将使用crate::system::State;
。或者,创建一个lib.rs来承载这些mod声明。但是尝试声明几个tinmes,即使u重写路径以查找文件,将导致不同的逻辑路径,因此将被解释为不同的类型。此外,@LotB的副本如果我从api.rs
中删除mod state
,我会得到:```未能解决:使用未声明的类型或模块state
使用未声明的类型或模块s泰特
rustc(E0433)api.rs(10,40):使用未声明的类型或模块state
``编辑:我缺少的部分是使用板条箱::系统::状态;
。我不知道这样做是可能的。谢谢。另外,我不认为这个问题是我以前看到的问题的重复,它对我没有帮助。它没有涉及使用板条箱::系统:
。我t有助于坚持默认的目录布局,而不是用#[path]
注释覆盖mod
声明;这样,您的state.rs
将位于system/
中,这有助于保持命名空间与文件系统的一致性。
#[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();
}
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();
}