将路径链接到 Rust 上的库

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

鉴于结构

.
├── 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 中无法完成。

除了如图所示的块之外,还有更好的方法来链接路径吗?

rust path subdirectory
1个回答
0
投票

我假设您有充分的理由拥有如此深层嵌套的单数

.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;
    

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