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

Posted

技术标签:

【中文标题】如何“使用”或导入本地 Rust 文件? [复制]【英文标题】:How do I "use" or import a local Rust file? [duplicate] 【发布时间】:2021-03-04 20:14:20 【问题描述】:

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

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

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

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

【问题讨论】:

不,我在上面链接了它。它对你来说很清楚,因为它很熟悉。没有任何地方包含暗示文件系统导航,即/path/to/include.rs。 Python 做了类似的事情来摆脱对导入的扩展,我个人认为它不习惯。它使导入看起来不像与路径相关。 不,您没有链接到我链接的部分。我链接的那个有这样的文本:接下来,让我们使用相同的模式将网络模块提取到它自己的文件中 [...] 然后创建一个 new src/network.rs 文件并输入以下内容。我不清楚该部分的哪一部分难以理解。 几章之内。到目前为止,我读了整本书,这两章中的任何一章似乎都可以找到答案,但没有。 【参考方案1】:

在 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!() 仅在非常特殊的情况下有用,通常与生成代码的更复杂的构建系统相关联。

【讨论】:

非常感谢,非常感谢,我想其他人也可以。尽管这是基本的,但它是人们独自学习的必要步骤。很明显,mod 可用于包含带有或不带有“.rs”扩展名的内容,但对于新来者来说,它似乎仅用于从某个未知字典(类似于 io 或 Math)中提取文件。你的例子是我看到的第一个 mod 在任何地方引用 *.rs 文件的例子,非常感谢你分享这个语法。 感谢您花时间回答这个问题。非常有用。

以上是关于如何“使用”或导入本地 Rust 文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用存储过程在本地读/写或复制/粘贴文本文件?

Docker镜像保存为文件及从本地文件导入镜像的方法

如何将图像导入或复制到 Android Studio 中的“res”文件夹?

Rust如何尊重复制特性?

如何把一个文件导入到SQLserver数据库中

如何使用navicatformysql连接本地数据库,并且导入数据文件