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

问题描述 投票:1回答:2

这个问题在这里已有答案:

我的目录结构:

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;
module rust
2个回答
0
投票

发生了什么事情,当你尝试在decoders::Decoders中导入image.rs时,你需要进入下一级别,因为使用这个:

mod decoders

use decoders::Decoders

意味着decoders现在将被“拥有”或在image下,这是不可能的,因为只有lib.rsmod.rsmain.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;

-2
投票

生锈编译器根据定义的位置不同地解析模块。

当您使用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中并将文件保留在原来的位置。

© www.soinside.com 2019 - 2024. All rights reserved.