Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在多个文件和main.rs中共享模块_Rust - Fatal编程技术网

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

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

地球人,你好

我正在尝试做一些我认为在概念上简单的关于生锈的事情,但是我似乎在与编译器作斗争,并且希望得到一些帮助

我有一个非常简单的小项目,它有3个文件

├── 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();
}