这个问题在这里已有答案:
我的目录结构:
src
main.rs
image.rs
decoders.rs
当我尝试在image.rs中导入我的解码器模块时,我得到了这个:
error[E0583]: File not found for module `decoders`
decoders.人生:
pub mod Decoders {}
image.人生:
mod decoders
use decoders::Decoders
pub mod Image {}
注意:我正在使用一个模块来包装整个文件,我可以将属性放在整个文件上。这就是为什么它不是How to include module from another file from the same project?的副本
奇怪的是,当我尝试在main.rs中导入Image时,这种语法完全正常:
mod image;
use image::Image;
发生了什么事情,当你尝试在decoders::Decoders
中导入image.rs
时,你需要进入下一级别,因为使用这个:
mod decoders
use decoders::Decoders
意味着decoders
现在将被“拥有”或在image
下,这是不可能的,因为只有lib.rs
,mod.rs
或main.rs
文件可以在其他文件中有模块。因此,要解决此问题,您可以将文件结构更改为:
src
main.rs
image
mod.rs
decoder.rs
或者,在main.rs
中使用它:
mod decoders;
mod image;
这在image.rs
:
use super::decoders::Decoders;
//Or alternatively
use crate::decoders::Decoders;
另外,要修复嵌套mod问题,请在decoders.rs
中执行以下操作:
//Your code, no `mod Decoders`
以及你有mod decoders
声明的以下内容:
#[your_attribs]
mod decoders;
生锈编译器根据定义的位置不同地解析模块。
当您使用mod
关键字从包入口点(通常为main.rs
或lib.rs
)或从模块根(mod.rs
)声明外部模块时,编译器将搜索与声明文件相邻的文件。这就是为什么它在你的mod image.rs
文件中使用main.rs
时正常工作的原因。
在其他情况下,编译器将搜索文件夹中与声明文件同名的文件。在你的情况下,这意味着你在mod decoders;
中的image.rs
行导致编译器在image
子文件夹中搜索模块 - 特别是检查image/decoders.rs
和image/decoders/mod.rs
。
要解决这个问题,你可以将decoders.rs
移动到image/decoders.rs
,如果你想将decoders
保存为image
的子模块,或者将mod decoders;
放在main.rs
中并将文件保留在原来的位置。