如何“使用”或导入本地Rust文件?

时间:2017-08-05 06:54:15

标签: import rust

如何在my_project/src/include_me.rs

中添加包含完整路径main.rs的文件

我检查了dependencies guide,所有这些似乎都包含了二进制文件。我还检查了"The Book",但其中没有一个例子以“.rs”结尾。

如何使include_me.rs与项目的其余部分一起编译?

编辑:虽然“可能重复”将是一个包含这个问题答案的好地方,但它并不包含它。这个问题的最佳答案中的语法更加相关,并在“重复”的问题中掩盖了

1 个答案:

答案 0 :(得分:19)

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非常重要。

2。 "包括" 外部代码

如果您的include_me.rs不属于您的实际项目,而是您在多个项目中使用的有用内容的集合,则应将其视为库< / em>的。要包含此类外部库的代码,您必须将其包含在extern crate中。为了让您的生活更轻松,您真的想要使用Cargo!

因此,让我们准备您的include_me.rs货物图书馆项目。您需要以下文件结构(由cargo new my_library --lib自动生成):

. my_library
  ├── Cargo.toml
  └── src
      └── lib.rs

现在将include_me.rs中的所有内容复制到lib.rs(只需调用库项目lib.rs的根文件)。我们假设my_library文件夹的完整路径是~/code/my_library

现在让我们准备您的主项目的货运项目。它有一个类似的文件 结构(但是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。这已经不再需要了,但你可能会发现感冒了{{1声明。)

还有其他方法吗?

是的,但你不应该使用它们。 the include!() macro允许您逐字包含其他文件,就像来自C-land的extern crate一样。 然而,强烈建议不要在模块系统能够解决您的问题的情况下使用它。 #include仅在非常特殊的情况下有用,通常与生成代码的更复杂的构建系统相关联。