如何“使用”或导入本地Rust文件? [重复]

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

如何在my_project/src/include_me.rs中包含带有完整路径main.rs的文件?

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

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

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

import rust
1个回答
22
投票

Rust中基本上有两种(主要)方式来包含来自其他地方的代码:

1. "Including" internal code

如果您的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. "Including" external code

如果你的include_me.rs不属于你的实际项目,而是你在多个项目中使用的有用的东西的集合,它应该被视为一个库。要包含此类外部库的代码,您必须将其包含在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。这不再是必要的了,但你可能会发现旧的冷和extern crate声明。)

Any other ways?

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

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