Import Rust导入:将大文件拆分为小文件
我正在rust中编写一个TUI应用程序来管理一些游戏服务器。应用程序本身工作正常,但main.rs文件现在超过1k行,因此我决定将其拆分为多个文件,以便于使用。每个文件都需要能够访问其他文件中的结构和函数。分割文件具有以下结构Import Rust导入:将大文件拆分为小文件,import,rust,Import,Rust,我正在rust中编写一个TUI应用程序来管理一些游戏服务器。应用程序本身工作正常,但main.rs文件现在超过1k行,因此我决定将其拆分为多个文件,以便于使用。每个文件都需要能够访问其他文件中的结构和函数。分割文件具有以下结构 src \ main.rs render.rs ark.rs db.rs 这是我目前的货物 [package] name = "ark-manager" version = "0.1.0" auth
src \
main.rs
render.rs
ark.rs
db.rs
这是我目前的货物
[package]
name = "ark-manager"
version = "0.1.0"
authors = ["Nan0Scho1ar <scorch267@gmail.com>"]
edition = "2018"
[dependencies]
crossterm = { version = "0.19", features = [ "serde" ] }
serde = {version = "1.0", features = ["derive"] }
serde_json = "1.0"
chrono = { version = "0.4", features = ["serde"] }
rand = { version = "0.7.3", default-features = false, features = ["std"] }
tui = { version = "0.14", default-features = false, features = ['crossterm', 'serde'] }
thiserror = "1.0"
方舟
pub mod ark{
发布使用板条箱::呈现::*;
酒吧使用板条箱::db::*;
//结构、枚举等
发布枚举事件{
输入(I),
打上钩
}
...
}
分贝卢比
pub mod db{
发布使用板条箱::呈现::*;
酒吧用板条箱::方舟::*;
//数据库功能
...
}
渲染
pub mod render{
酒吧使用板条箱::db::*;
酒吧用板条箱::方舟::*;
//渲染函数
...
}
我还更新了对现在在单独模块中的内容的引用
//E.G.
if let Ok(_) = tx.send(Event::Tick) {
//Becomes
if let Ok(_) = tx.send(ark::Event::Tick) {
//And
Event::Input(event) => match event.code {
//Becomes
ark::Event::Input(event) => match event.code {
但这导致了以下错误
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:79:45
|
79 | if let Ok(_) = tx.send(ark::Event::Tick) {
| ^^^^^ could not find `Event` in `ark`
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:216:22
|
216 | ark::Event::Input(event) => match event.code {
| ^^^^^ could not find `Event` in `ark`
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:226:22
|
226 | ark::Event::Tick => {}
| ^^^^^ could not find `Event` in `ark`
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:230:22
|
230 | ark::Event::Input(event) => match event.code {
| ^^^^^ could not find `Event` in `ark`
...
error[E0432]: unresolved import `db`
--> src/render.rs:1:9
|
1 | use db;
| ^^ no external crate `db`
error[E0432]: unresolved import `ark`
--> src/render.rs:2:9
|
2 | use ark;
| ^^^ no external crate `ark`
error[E0432]: unresolved import `render`
--> src/db.rs:1:9
|
1 | use render;
| ^^^^^^ no external crate `render`
error[E0432]: unresolved import `ark`
--> src/db.rs:2:9
|
2 | use ark;
| ^^^ no external crate `ark`
error[E0432]: unresolved import `render`
--> src/ark.rs:1:9
|
1 | use render;
| ^^^^^^ no external crate `render`
error[E0432]: unresolved import `db`
--> src/ark.rs:2:9
|
2 | use db;
| ^^ no external crate `db`
...
经过一段时间的尝试,我决定看看其他人是如何解决这个问题的,我发现了一些关于堆栈溢出的问题的答案,比如这个。
我尝试使用公认答案中列出的导入,看起来像这样
梅因
modrender;
mod db;
摩德方舟;
//主回路等
...
方舟
使用渲染;
使用数据库;
//结构、枚举等
...
分贝卢比
使用渲染;
使用方舟;
//数据库功能
...
渲染
使用db;
使用方舟;
//渲染函数
...
但这种结构会导致以下错误
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:79:45
|
79 | if let Ok(_) = tx.send(ark::Event::Tick) {
| ^^^^^ could not find `Event` in `ark`
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:216:22
|
216 | ark::Event::Input(event) => match event.code {
| ^^^^^ could not find `Event` in `ark`
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:226:22
|
226 | ark::Event::Tick => {}
| ^^^^^ could not find `Event` in `ark`
error[E0433]: failed to resolve: could not find `Event` in `ark`
--> src/main.rs:230:22
|
230 | ark::Event::Input(event) => match event.code {
| ^^^^^ could not find `Event` in `ark`
...
error[E0432]: unresolved import `db`
--> src/render.rs:1:9
|
1 | use db;
| ^^ no external crate `db`
error[E0432]: unresolved import `ark`
--> src/render.rs:2:9
|
2 | use ark;
| ^^^ no external crate `ark`
error[E0432]: unresolved import `render`
--> src/db.rs:1:9
|
1 | use render;
| ^^^^^^ no external crate `render`
error[E0432]: unresolved import `ark`
--> src/db.rs:2:9
|
2 | use ark;
| ^^^ no external crate `ark`
error[E0432]: unresolved import `render`
--> src/ark.rs:1:9
|
1 | use render;
| ^^^^^^ no external crate `render`
error[E0432]: unresolved import `db`
--> src/ark.rs:2:9
|
2 | use db;
| ^^ no external crate `db`
...
将main.rs文件拆分为4个较小文件的正确方法是什么,这样每个文件都可以使用其他文件中的结构和函数。在main中:
mod render;
mod db;
mod ark;
然后在其他方面:
use crate::render;
use crate::db;
// ...
我是否需要在每个文件的顶部列出每个结构和函数?如果我尝试类似于
的方法,请使用clarate::render::*代码>它不工作。但如果没有它,编译器似乎建议每次遇到不同文件中的函数或结构时,我都需要添加一个导入。换句话说,是否有一种方法可以一次导入整个文件“如果我尝试使用crainte::render::*;
这样的方法,它不起作用。”-这种情况下会出现什么错误?如果您有mod render
在lib.rs
中,此导入应该可以工作,模块名称冲突
在db.rs的顶部,我遇到了一些错误,比如在“ark”中找不到“Event”
。如果我在文件中手动指定每个struct/enum/func等,比如使用claret::ark::{Event,MenuItem}代码>,然后它工作正常。事后看来,这可能是因为我将此Event::Input(Event)=>match Event.code{
更改为此ark::Event::Input(Event)=>match Event.code{
当我第一次尝试它时。我已经撤消了该更改,但我已经手动指定了几乎所有更改。为了向其他人澄清,我将尝试注释它,并用简单的版本替换它。如果我更改使用板条箱::渲染:{read_db};
返回使用板条箱::渲染;
我得到错误错误[E0425]:在此范围内找不到函数“read_db”
,即使该函数是公共函数。我现在只想手动指定所有内容,但如果还有其他内容需要测试,请告诉我。您的单个文件不应具有该函数{
wrapper。由于main.rs
中的mod X;
行,文件本身已经是一个模块。