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

时间:2019-04-26 13:14:04

标签: module rust

我的目录结构:

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 {}

注意:我使用的模块是有意包装整个文件的模块,因此我可以将属性放在整个文件上。这就是为什么它不是How to include module from another file from the same project?

的副本的原因

奇怪的是,当我尝试在main.rs中导入Image时,此语法工作得很好:

mod image;

use image::Image;

2 个答案:

答案 0 :(得分:0)

正在发生的事情是,当您尝试在decoders::Decoders中导入image.rs时,您需要进行下一个升级,因为使用了以下方法:

mod decoders

use decoders::Decoders

意味着decoders现在将是“拥有的”或在image下,这是不可能的,因为仅 lib.rsmod.rs或{{ 1}}文件可以在其他文件中包含模块。因此,要解决此问题,您可以将文件结构更改为此:

main.rs

或者,在src main.rs image mod.rs decoder.rs 中使用它:

main.rs

以及mod decoders; mod image; 中的内容:

image.rs

此外,要解决嵌套mod问题,请在use super::decoders::Decoders; //Or alternatively use crate::decoders::Decoders; 中执行以下操作:

decoders.rs

以及以下//Your code, no `mod Decoders` 语句所在的位置:

mod decoders

答案 1 :(得分:-2)

rust编译器根据定义模块的方式来解析模块。

当您使用mod关键字从板条箱入口点(通常为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.rs的子模块,也可以将decoders移至image,或者放置mod decoders; main.rs中,然后将文件保留在原处。