首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何“使用”或导入本地Rust文件?

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

Stack Overflow用户
提问于 2017-08-05 14:54:15
回答 1查看 37.1K关注 0票数 47

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

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

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

编辑:虽然“可能的副本”是一个很好的地方来包含这个问题的答案,但它并不包含它。这个问题的顶部答案中的语法明显更相关,并且在它“重复”的问题中被注释掉了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-05 16:57:08

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

1.“包含”内部代码

如果您的include_me.rs属于您的项目,则应将其移动到main.rs所在的同一文件夹中:

代码语言:javascript
复制
└── src
    ├── include_me.rs
    └── main.rs

然后你可以在你的main.rs中写这段代码

代码语言:javascript
复制
mod include_me;

fn main() {
    // Call a function defined in the other file (module)
    include_me::some_function();
}

Rust声明使mod编译器自动查找相应的.rs文件!

因此,属于您的项目的所有内容与main.rs (或lib.rs)所在的文件夹属于同一文件夹(或其子文件夹)。然后通过模块系统“包含”这些文件。要阅读模块的介绍,请阅读the chapter on modules in the Rust book。您也可以查看有关该主题的Rust by Example。模块系统非常重要,因此对学习Rust非常重要。

2.“包括”外部代码

如果您的include_me.rs不属于您的实际项目,而是您在多个项目中使用的有用内容的集合,那么它应该被视为一个库。要包含此类外部库的代码,您必须将其包含为外部机箱。为了让你的生活更轻松,你真的很想使用Cargo!

所以让我们准备你的include_me.rs as Cargo库项目。您需要以下文件结构(由cargo new my_library --lib自动生成):

代码语言:javascript
复制
. my_library
  ├── Cargo.toml
  └── src
      └── lib.rs

现在将include_me.rs中的所有内容复制到lib.rs中(按照惯例,将库项目的根文件称为lib.rs)。假设my_library文件夹的完整路径为~/code/my_library

现在让我们准备主项目的Cargo项目。它具有类似的文件结构(但不是lib.rs,而是main.rs,因为它是可执行项目,而不是库项目):

代码语言:javascript
复制
. my_project
├── Cargo.toml
└── src
    └── main.rs

要声明对my_library的依赖,必须将以下内容放入Cargo.toml

代码语言:javascript
复制
[package]
name = "my_project"
version = "0.1.0"
authors = ["you"]
edition = "2018"

[dependencies]
my_library = { path = "~/code/my_library" }

您也可以使用相对路径("../my_library"),但只有当您知道这两个项目始终保持其相对于彼此的位置(例如,如果它们都在同一个存储库中进行管理)时,它才有意义。

现在,你可以在你的main.rs中写下:

代码语言:javascript
复制
use my_library::some_function();

fn main() {
    // Call a function defined in the other file (extern crate)
    some_function();
}

如果你想上传这两个项目中的任何一个,你必须与crates.io (如果你的公司有另一个crates注册表)进行交互,但这是另一个主题。

(注意:不久前,在main.rs中编写extern crate my_library;是必要的。这不再是必需的,但是您可能会发现带有extern crate声明的旧代码。)

还有别的办法吗?

是的,但是你不应该使用那些。有一个the include!() macro可以让你逐字地包含其他文件,就像C-land中的#include一样。然而,强烈建议在模块系统能够解决您的问题的情况下使用它。include!()只有在非常特殊的情况下才有用,通常链接到生成代码的更复杂的构建系统。

票数 91
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45519176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档