【问题标题】:Why can't I import module from different file in same directory? [duplicate]为什么我不能从同一目录中的不同文件导入模块? [复制]
【发布时间】:2019-04-26 13:14:03
【问题描述】:

我的目录结构:

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;

【问题讨论】:

  • 你说的我可以将属性放在整个文件上的目的是什么意思

标签: module rust


【解决方案1】:

发生的情况是,当您尝试在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 decoders 声明:

#[your_attribs]
mod decoders;

【讨论】:

  • 非常感谢您的回答!这部分节省了我的时间:> 意味着解码器现在将被“拥有”或在图像下,这是不可能的,因为只有 lib.rs、mod.rs 或 main.rs 文件可以在其他文件中包含模块
【解决方案2】:

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 保留为 image 的子模块,则可以将 decoders.rs 移动到 image/decoders.rs,或者将 mod decoders; 放在 main.rs 中并将文件保留在它所在的位置是。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 2021-11-03
    相关资源
    最近更新 更多