gpt4 book ai didi

rust mod 声明的不一致

转载 作者:行者123 更新时间:2023-11-29 08:26:33 24 4
gpt4 key购买 nike

按照以下链接将模块分成不同文件的示例: https://doc.rust-lang.org/book/ch07-02-modules-and-use-to-control-scope-and-privacy.html#separating-modules-into-different-files

我在 src 目录下创建了以下文件:

├── main.rs
├── sound
│   └── instrument.rs
└── sound.rs

src/main.rs 中:

mod sound;

fn main() {
// Absolute path
crate::sound::instrument::clarinet();

// Relative path
sound::instrument::clarinet();
}

src/sound.rs 中:

pub mod instrument;

src/sound/instrument.rs 中:

pub fn clarinet() {
println!("clarinet");
}

该示例按预期编译和工作。现在我的问题是:为什么在 main.rs 中,它可以从同一目录“修改”sound.rs,而在 sound.rs 中>,它必须从子目录

中“修改” instrument.rs

最佳答案

在一个标准的 Rust bin 项目中,src/main.rs 被赋予一个特殊的位置作为 crate root。 src/ 中的其他源文件是包顶层的模块。具有多个文件的模块可以采用两种形式之一。旧方法是这样的:

├── main.rs
└── mod_name
└── mod.rs
└── submodule.rs
└── some_other_mod.rs

mod.rs 是必需的(具有确切的名称),并将作为模块的顶层。在这种情况下你可以看到,我敢肯定,src/mod_name/mod.rs 直接引用 some_other_mod 而不加前缀是没有意义的super::crate::

您正在使用的新方法允许您放弃 mod.rs 并在父 mod 的目录中只包含 mod_name.rs,其目的相同作为 mod.rs。当您开始将库作为单个文件开发时,这很方便,然后当您稍后决定添加更多文件时,您不需要重命名和移动顶级文件。

在您的情况下,instrument.rs 需要位于 sound/ 目录中才能被视为 sound 模块的一部分。如果您将它直接放在 src/ 中,它将被视为 crate 中的顶级模块。

关于rust mod 声明的不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55673651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com