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

7

我的目录结构:

src
    main.rs
    image.rs
    decoders.rs


当我尝试在image.rs中导入我的解码器模块时,出现以下情况:
error[E0583]: File not found for module `decoders`

decoders.rs:

pub mod Decoders {}

image.rs:

mod decoders

use decoders::Decoders

pub mod Image {}

注意: 我故意使用一个将整个文件包装起来的模块,以便我可以在整个文件上放置属性。这就是为什么它不是如何从同一项目的另一个文件中导入模块?的重复问题。

奇怪的是,当我尝试在 main.rs 中导入 Image 时,这种语法完全正常:

mod image;

use image::Image;

“你说的“故意这样做是为了让我可以在整个文件上放置属性”是什么意思?” - Jmb
2个回答

8
当你尝试在image.rs中导入decoders::Decoders时,需要通过上一级进行操作。使用以下代码:
mod decoders

use decoders::Decoders

这意味着decoders现在将被“拥有”或者归属于image,这意味着编译器将在image子目录中搜索decoders.rs。因此,为了解决这个问题,你可以将你的文件结构更改为以下格式:
src/
    main.rs
    image.rs        ** or image/mod.rs
    image/
        decoder.rs

或者,在main.rs中使用此代码:

mod decoders;
mod image;

还有在image.rs中的这个:

use super::decoders::Decoders;
//Or alternatively
use crate::decoders::Decoders;

此外,要解决嵌套模块的问题,请在decoders.rs中执行以下操作:
//Your code, no `mod Decoders`

并且在你的 mod解码器 声明之后:

#[your_attribs]
mod decoders;

1
非常感谢您的回答!这部分内容救了我的一天:
这意味着解码器现在将被“拥有”或属于图像,但这是不可能的,因为只有lib.rs、mod.rs或main.rs文件可以在其他文件中拥有模块。
- Fernando Jascovich

-1

Rust编译器解析模块的方式取决于它们的定义位置。

当您使用mod关键字声明一个来自crate入口点(通常是main.rslib.rs)或模块根目录(mod.rs)的外部模块时,编译器将搜索与声明文件相邻的文件。这就是为什么在main.rs文件中使用mod image.rs时可以正常工作的原因。

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

要解决此问题,您可以将decoders.rs移动到image/decoders.rs(如果您想将decoders保留为image的子模块),或者在main.rs中放置mod decoders;并保留文件不变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接