鉴于结构
.
├── Cargo.toml
├── readme.txt
├── src
│ ├── config.rs
│ ├── libraries
│ │ ├──> cryptography::primitives::cipher::symmetric::aes::aes_agent as
│ ├── main.rs
│ └── header.rs
在 main.rs 中:
use libraries::cryptography::primitives::cipher::symmetric::aes::aes_agent as aes_cipher;
mod libraries {
pub mod cryptography {
pub mod primitives {
pub mod cipher {
pub mod symmetric {
pub mod aes {
pub mod aes_agent;
}
}
}
}
}
}
mod header;
fn main() {
let _ = &aes_cipher::print_me();
println!("Hello, world in main!");
}
但是,它在 header.rs 中不起作用,给出错误:
Compiling lab_00 v0.1.0 (/home/runner/HelloRust)
error[E0583]: file not found for module aes_agent
--> src/header.rs:9:17
|
9 | pub mod aes_agent;
| ^^^^^^^^^^^^^^^^^^
|
lib代码位于libraries/cryptography/primitives/cipher/symmetry/aes/aes_agent中。可以从 main.rs 调用它。但是,在 header.rs 中无法完成。
除了如图所示的块之外,还有更好的方法来链接路径吗?
我假设您有充分的理由拥有如此深层嵌套的单数
.rs
文件。
您要使用的每个
mod <name>;
文件应该只有一个 <name>.rs
声明,因此,如果您的 mod aes_agent;
中有 main.rs
,那么您的 mod aes_agent;
中不应该有 headers.rs
,因为它已经在 main.rs
声明。既然它已经声明了,你只需use
它:// headers.rs
use crate::libraries::cryptography::primitives::cipher::symmetric::aes::aes_agent;
// ^^^^^^^ searching for modules starting from the crate root, which is `main.rs`
此外,这可能是 #[path]
属性的一个很好的用途。有了它,您可以直接通过文件路径声明模块,而不是构建模块层次结构来反映文件层次结构。一般来说,我强烈建议不要使用此属性,但这种情况可能值得使用。它看起来像这样:
// main.rs
#[path = "libraries/cryptography/primitives/cipher/symmetric/aes/aes_agent.rs"]
mod aes_agent;
上面的
mod
规则仍然适用,但这将使您的
use
与 headers.rs
变得更简单:use crate::aes_agent;
。