在Rust中如何使用父目录中的模块

14

能否以这种方式组织 Rust 项目?

目录结构:

src
├── a
│   └── bin1.rs
├── b
│   ├── bin2.rs
└── common
    ├── mod.rs

从 Cargo.toml 文件:

[[bin]]
name = "bin1"
path = "src/a/bin1.rs"

[[bin]]
name = "bin2"
path = "src/b/bin2.rs"

我想在bin1.rsbin2.rs中使用common模块。只需在导入前添加路径属性即可实现:

#[path="../common/mod.rs"]
mod code;

是否有一种方法让bin1.rsbin2.rs使用common而不必硬编码路径?

1个回答

16

在二进制文件之间共享代码的推荐方法是拥有一个名为src/lib.rs的文件。两个二进制文件会自动通过这个lib.rs文件作为单独的crate访问其中任何可访问的内容。

然后你只需在src/lib.rs文件中定义一个mod common;。如果你的crate叫做my_crate,那么你的二进制文件就能够使用它。

use my_crate::common::Foo;

1
这对我帮助很大。我还看到过类似于 use crate:: ... 的东西,我认为它可能是指“无论根箱是什么”,但它返回编译器错误“根中没有 X”(其中 X 是我的模块名称)。那么,“根”箱是什么呢? - Anselan
1
你应该将 lib.rsmain.rs 视为两个完全不同的 crate 的根。当访问同一 crate 中的内容时,使用 use crate::,而当从 main.rs 访问 lib.rs 中的内容时,则使用 use my_crate::。无法从 main.rs 访问 lib.rs crate 中的内容。 - Alice Ryhl
“my_crate” 的名称是在哪里确定的?是在 cargo.toml 文件中吗? - Qwertie
是的,它是从你的 Cargo.toml 中获取的。 - Alice Ryhl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接