如何从 Rust 中的子文件夹导入函数

How do I import functions from subfolders in Rust

我在 src 文件夹中有主要 main.rs。 main.rs 包含以下内容。

#[allow(dead_code)]
fn main() {
    println!("Hello, world!");
    hallo();
}

src/lib文件夹中的main.rs当前没有任何内容。

我现在如何使用 src 文件夹中 main.rs 中的 test.rs 中的函数“hello”? test.rs 包含以下内容。

fn hallo(){
    println!("hallo");
}

我的文件夹结构是这样的。

|   Cargo.lock
|   Cargo.toml
|           
+---src
|   |   main.rs
|   |   
|   \---lib
|           main.rs
|           test.rs
```

这进入了 Rust 模块系统。我会尽力解释它,但是本书做得更好,所以如果您感到困惑,请继续查看 here。基本上,Rust 中的每个文件(除了 main.rs 或 lib.rs 之外)都对应于 crate 中的一个模块(main.rs 和 lib.rs 是 crate 的根)。该文件中的所有内容都暴露在该模块下。要创建一个模块,您将此行添加到其父模块(或添加到 lib.rs 或 main.rs,这使其成为 crate 下的子模块):

mod somemod;

那么,你有两个选择:

  • 在放置 mod somemod; 声明的文件所在的文件夹中添加一个名为 somemod.rs 的文件。您的文件结构如下所示:
|
+---main.rs
+---somemod.rs
  • 在带有 mod somemod; 声明的文件所在的文件夹中添加一个名为 somemod 的文件夹。如果您希望 somemod 有子模块,可以使用它;您将使用与创建顶级模块相同的两个选项来创建子模块。您的文件结构如下所示:
|
+---main.rs
+---somemod
    |
    +---mod.rs

然后,在那行之后(以及之前,如果你真的想要的话),你可以使用 somemod 命名空间 来引用任何 public somemod 模块的成员:

mod somemod;

// later on ...
somemod::foo();

您还可以使用 use 关键字将 somemod 的成员引入当前命名空间:

mod somemod;
use somemod::foo;

// later on ...
foo();

因此,在您的情况下,您的代码将如下所示:

main.rs:

mod test;
use test::hallo;

#[allow(dead_code)]
fn main() {
    println!("Hello, world!");
    hallo();
}

test.rs:

pub fn hallo() {
    println!("hallo");
}

请注意,为了能够从模块外部引用 hallo,我们必须在 fn hallo.

的 from 中添加 pub 关键字