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

Sep*_*eed 15 import rust

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

我已经检查了依赖指南,所有这些指南似乎都包含了二进制文件.我也检查了"The Book",但其中没有一个例子以".rs"结尾.

如何include_me.rs使用项目的其余部分进行编译?

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

Luk*_*odt 30

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

1."包括" 内部代码

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

??? src
    ??? include_me.rs
    ??? main.rs
Run Code Online (Sandbox Code Playgroud)

然后你可以写在你的main.rs:

mod include_me;

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

一个mod声明,让编译器锈找相应的.rs自动文件!

因此,属于您的项目的所有内容都属于与main.rs(或lib.rs)所在的文件夹相同的文件夹(或其子文件夹).然后通过模块系统"包含"文件.要阅读有关模块的详细介绍,请阅读Rust书中有关模块的章节.模块系统非常重要,因此对学习Rust非常重要.

2."包括" 外部代码

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

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

. my_library
  ??? Cargo.toml
  ??? src
      ??? lib.rs
Run Code Online (Sandbox Code Playgroud)

现在将所有内容复制lib.rslib.rs(这只是调用库项目的根文件的惯例my_library).假设~/code/my_library文件夹的完整路径是main.rs.

现在让我们准备您的主项目的货物项目.它有一个类似的文件结构(但是lib.rs代替my_library,因为它是一个可执行项目,而不是一个库项目):

. my_project
??? Cargo.toml
??? src
    ??? main.rs
Run Code Online (Sandbox Code Playgroud)

要声明你的依赖Cargo.toml,你必须把它放到你的"../my_library":

[package]
name = "my_project"
version = "0.1.0"
authors = ["you"]
edition = "2018"

[dependencies]
my_library = { path = "~/code/my_library" }
Run Code Online (Sandbox Code Playgroud)

您也可以使用相对路径(main.rs),但它才有意义,如果你知道,这两个项目一直停留在原地,相对于彼此(如果它们都在同一个仓库管理等).

现在你可以crates.io写下:

use my_library::some_function();

fn main() {
    // Call a function defined in the other file (extern crate)
    some_function();
}
Run Code Online (Sandbox Code Playgroud)

如果要上传这两个项目中的任何一个,则必须与之交互extern crate my_library;,但这是另一个主题.

还有其他方法吗?

是的,但你不应该使用它们.有一个main.rs允许你逐字包含其他文件,就像extern crate来自C-land.但是,强烈建议不要在模块系统能够解决问题的情况下使用它.include!()仅在非常特殊的情况下才有用,通常链接到生成代码的更复杂的构建系统.

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

归档时间:

查看次数:

9215 次

最近记录:

6 年,6 月 前