如何“使用”或导入本地 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 文件? [复制]的主要内容,如果未能解决你的问题,请参考以下文章