英文:
Rust module weird behavior with multiple use from different file
问题
我以为我理解Rust模块,但对于mod
的不一致性,至少对于我的理解水平来说,我完全迷失了。
我在项目中有以下文件夹结构:
project
|
- src
|- main.rs
|- mod.rs
|- common
|- error.rs
|- global.rs
|- ids.rs
|- mod.rs
- user_info
|- user.rs
|- admin.rs
|- mod.rs
- data_source
|- data_src.rs
|- data_bridge.rs
|- data_copies.rs
|- mod.rs
正如你所见,所有文件夹都有一个mod.rs文件,其中基本上包含对其中的所有子文件夹或文件的pub mod
声明。我以为这样可以使导入更清晰。
data_src.rs使用以下方式导入模块:
use super::*;
use super::super::common::*;
data_src.rs明确依赖于以下模块:
data_source/data_bridge.rs
common/error.rs
common/global.rs
data_copies.rs使用以下方式导入模块:
use super::*;
use super::super::common::*;
并且data_copies.rs依赖于以下模块:
data_source/data_src.rs
data_source/data_bridge.rs
common/error.rs
common/global.rs
common/ids.rs
在使用cargo build
命令进行编译时,我在data_src.rs中没有看到任何错误,但在data_copies.rs中却不是这样,我一直看到相同的错误:
use of undeclared crate or module "..."
来自所有导入的函数中。这对我来说非常不合理,因为我在data_src.rs文件中使用相同的use
命令导入模块,但只在data_copies.rs中出现错误。
我查找了在线资源,但找不到任何理论或解释能帮助我理解问题。有人能告诉我发生了什么吗?
英文:
I thought I understood Rust modules, but I am completely lost with mod
inconsistencies, at least with my own level of understanding.
I have the following folder structure in my project:
project
|
- src
|- main.rs
|- mod.rs
|- common
|- error.rs
|- global.rs
|- ids.rs
|- mod.rs
- user_info
|- user.rs
|- admin.rs
|- mod.rs
- data_source
|- data_src.rs
|- data_bridge.rs
|- data_copies.rs
|- mod.rs
As you may see all folders have a mod.rs file, which basically contains pub mod
declaration to all the sub-folders or folder-level files in it. Thought that would make importing cleaner.
data_src.rs is importing modules using
use super::*;
use super::super::common::*
data_src.rs is specifically has dependencies on
data_source/data_bridge.rs
common/error.rs
common/global.rs
data_copies.rs is importing modules using
use super::*;
use super::super::common::*
And data_copies.rs has dependencies on
data_source/data_src.rs
data_source/data_bridge.rs
common/error.rs
common/global.rs
common/ids.rs
While compiling using cargo build
command I am seeing no errors from data_src.rs, but same is not true for data_copies.rs, where I keep seeing the same error:
use of undeclared crate or module "..."
across all the imported functions from all the files.
This is very unreasonable for me, because I am using the same use
command to import mods in data_src.rs file where it does not throw any error, but only in data_copies.rs.
I checked online, but I cannot find any theaory or explaination remotely helping me understand the problem. Can someone tell me what is going on.
答案1
得分: 1
Rust有两种类型的包,二进制和库。
一个二进制包是一个具有入口点并直接在机器上运行的包。库是一个没有入口点的包,可以在其他包中使用。
当你编写包时,Cargo从主文件中开始读取它,对于二进制包来说,主文件是src/main.rs
,对于库来说,主文件是src/lib.rs
。
尽管模块是通过与模块同名的rs
文件或包含mod.rs
文件的文件夹来声明的,但顶级模块需要在main
文件中声明,这就是你的问题。
你的问题在于你将顶级声明放在了src/mod.rs
中,而Cargo不知道如何导入它们,你只需要将顶级声明移到src/main.rs
,而不是src/mod.rs
中。
英文:
Rust has two kinds of crates, binaries and libraries.
A binary is a crate that has an entry point and runs directly in the machine. And library is a crate that doesn't has an entry point, is a crate that can be used in other crates.
When you're writing crates cargo starts reading it from the main file, which is src/main.rs
for binaries, and src/lib.rs
for libraries.
Although the modules are declared through rs
files which same name as the module, or through a folder with a mod.rs
file. The top level modules need be declared in the main
file, and this is your problem.
Your problem is you're declaring your top level in src/mod.rs
and cargo don't know how to import them, all you need is move your top level declaration to src/main.rs
instead of src/mod.rs
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论