我的目录结构:
src
main.rs
image.rs
decoders.rs
Run Code Online (Sandbox Code Playgroud)
当我尝试在 image.rs 中导入我的解码器模块时,我得到了这个:
error[E0583]: File not found for module `decoders`
Run Code Online (Sandbox Code Playgroud)
解码器.rs:
pub mod Decoders {}
Run Code Online (Sandbox Code Playgroud)
图像.rs:
mod decoders
use decoders::Decoders
pub mod Image {}
Run Code Online (Sandbox Code Playgroud)
注意:我正在使用一个专门包装整个文件的模块,这样我就可以将属性放在整个文件上。这就是为什么它不是How to include module from another file from the same project?
奇怪的是,当我尝试在 main.rs 中导入 Image 时,这种语法非常有效:
mod image;
use image::Image;
Run Code Online (Sandbox Code Playgroud)
发生的事情是,当您尝试导入decoders::Decoders
时image.rs
,您需要通过下一个级别,因为使用此:
mod decoders
use decoders::Decoders
Run Code Online (Sandbox Code Playgroud)
意味着decoders
现在将“拥有”或低于image
,这意味着编译器将在image
子目录中搜索decoders.rs
. 因此,要解决此问题,您可以将文件结构更改为:
src/
main.rs
image.rs ** or image/mod.rs
image/
decoder.rs
Run Code Online (Sandbox Code Playgroud)
或者,在main.rs
:
src/
main.rs
image.rs ** or image/mod.rs
image/
decoder.rs
Run Code Online (Sandbox Code Playgroud)
这在image.rs
:
mod decoders;
mod image;
Run Code Online (Sandbox Code Playgroud)
另外,要解决您的嵌套模式问题,请在 中执行以下操作decoders.rs
:
//Your code, no `mod Decoders`
Run Code Online (Sandbox Code Playgroud)
以及以下您的mod decoders
陈述:
#[your_attribs]
mod decoders;
Run Code Online (Sandbox Code Playgroud)
ape*_*lla -1
rust 编译器根据模块的定义位置以不同的方式解析模块。
当您使用mod
关键字从 crate 入口点(通常为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
归档时间: |
|
查看次数: |
1698 次 |
最近记录: |