在 Rust 中基本上有两种(主要)方式来包含来自其他地方的代码:
1。 “包括”内部代码
如果你的include_me.rs属于你的项目,你应该把它移动到main.rs所在的同一个文件夹:
└── src
├── include_me.rs
└── main.rs
然后你可以在main.rs:
mod include_me;
fn main() {
// Call a function defined in the other file (module)
include_me::some_function();
}
mod 声明使 Rust 编译器自动查找相应的 .rs 文件!
因此,属于您的项目的所有内容都与main.rs(或lib.rs)所在的文件夹位于同一文件夹(或其子文件夹)中。然后通过模块系统“包含”这些文件。要阅读对模块的良好介绍,请阅读the chapter on modules in the Rust book。您还可以查看 Rust by Example 关于该主题的内容。模块系统非常重要,因此对于学习 Rust 很重要。
2。 “包括”外部代码
如果您的include_me.rs 不属于您的实际项目,而是您在多个项目中使用的有用东西的集合,那么它应该被视为一个库。要包含此类外部库的代码,您必须将其包含为 extern crate。为了让您的生活更轻松,您真的很想使用 Cargo!
所以让我们准备你的 include_me.rs 作为 Cargo 库项目。您需要以下文件结构(由cargo new my_library --lib自动生成):
. my_library
├── Cargo.toml
└── src
└── lib.rs
现在将include_me.rs 中的所有内容复制到lib.rs 中(习惯上调用库项目的根文件lib.rs)。假设my_library 文件夹的完整路径是~/code/my_library。
现在让我们准备您的主项目的 Cargo 项目。它有一个类似的文件
结构(但main.rs 而不是lib.rs,因为它是可执行项目,而不是库项目):
. my_project
├── Cargo.toml
└── src
└── main.rs
要声明您对my_library 的依赖,您必须将其放入您的Cargo.toml:
[package]
name = "my_project"
version = "0.1.0"
authors = ["you"]
edition = "2018"
[dependencies]
my_library = { path = "~/code/my_library" }
您也可以使用相对路径 ("../my_library"),但只有当您知道这两个项目始终相对于彼此保持原样时才有意义(例如,如果它们都在同一个存储库中管理)。
现在您可以在main.rs 中写下:
use my_library::some_function();
fn main() {
// Call a function defined in the other file (extern crate)
some_function();
}
如果您想上传这两个项目中的任何一个,您必须与 crates.io(或另一个 crates 注册表,如果您的公司有的话)进行交互,但这是另一个主题。
(注意:前段时间,extern crate my_library; 必须写在main.rs 中。现在不再需要了,但您可能会发现带有extern crate 声明的旧代码。)
还有其他方法吗?
是的,但你不应该使用这些。 the include!() macro 允许您逐字包含其他文件,就像来自 C-land 的 #include。 但是,强烈建议不要在模块系统能够解决您的问题的情况下使用它。 include!() 仅在非常特殊的情况下有用,通常与生成代码的更复杂的构建系统相关联。