为什么我不能从同一目录中的不同文件导入模块?

The*_*ded 6 module rust

我的目录结构:

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)

Opt*_*ach 7

发生的事情是,当您尝试导入decoders::Decodersimage.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.rslib.rs)或从模块根(mod.rs)声明外部模块时,编译器将搜索与声明文件相邻的文件。mod image.rs这就是为什么它在您的文件中使用时可以正常工作的原因main.rs

在其他情况下,编译器将在文件夹中搜索与声明文件同名的文件。在您的情况下,这意味着您的mod decoders;行会image.rs导致编译器在子文件夹中搜索模块image- 特别是检查image/decoders.rsimage/decoders/mod.rs

要解决此问题,如果您想保留为 的子模块,则可以移至 ,decoders.rs或者放入文件并将其保留在原来的位置。image/decoders.rsdecodersimagemod decoders;main.rs