Rust 使用 vs mod?

Eva*_*oll 35 import include rust

我正在努力解决这些问题

  • use宣言

    use声明创建一个或多个与其他路径同义的本地名称绑定。通常,use声明用于缩短引用模块项所需的路径。这些声明可能出现在模块和块中,通常位于顶部。

和,

  • mod物品

    模块项是一个模块,用大括号括起来,命名并以关键字 为前缀mod。模块项将一个新的命名模块引入到构成 crate 的模块树中。模块可以任意嵌套。

基本上,当我去布局我的模块时,我相信我知道我想要如何布局它,但我对这两件事应该如何分层以及它们的作用感到困惑。我认为两者中只有一个会包含代码?

Dmi*_*try 34

假设您有一个my_mod带有 pub 函数的模块my_funcuse在包含模块 using 语句之前,您无法在板条箱中(或板条箱外)使用此函数mod my_mod

包含模块后,您可以像这样使用您的函数:

mod my_mod;

...
my_mod::my_func(...)
...
Run Code Online (Sandbox Code Playgroud)

my_mod::my_func如果您没有将模块包含在板条箱中的某个位置,则无法使用声明。

有时最好导入常用的定义:

mod my_mod;
use my_mod::my_func;
Run Code Online (Sandbox Code Playgroud)

现在,如果你想使用你的函数,你可以写:

my_func(...);
Run Code Online (Sandbox Code Playgroud)

您还可以使用语句重新导出子模块(甚至其他板条箱!)的定义pub use

如果您使用通过导入的其他包Cargo.toml(通过将它们列为依赖项),您可以仅使用use语句从这些包中导入定义。

  • 如果有“use”,为什么还需要“mod”? (8认同)
  • @Alper,如果模块不是“mod”-ed,则不能在另一个 .rs 文件中“使用”该模块 (3认同)

Geo*_*rge 17

语言文档尝试但错过了隐含的一些重要概念mod,我不得不进行测试才能弄清楚这一点。为了尝试节省其他人的时间,我提供以下结论......

  1. 模块系统层次结构形成类似于文件系统目录的源树mod,其中选择相对于其主机模块的直接子模块。重要的是,引用的这些模块文件mod需要保存在子目录中,该子目录 (1) 与主机模块文件位于同一目录中,并且 (2) 该子目录必须与主机模块文件具有相同的名称。这意味着模块不能导入兄弟模块、父母模块、孙子模块或表兄弟模块。*这种分层包含模式的明显例外以及可能造成许多混乱的根源是根模块(main.rslib.rs)。src/这些特定的模块文件确实与其子模块一起出现;然而,它们很特别。具体来说,这些板条箱根模块文件(main.rslib.rsbin/other_root.rs)实际上被视为src/目录本身的父模块。(因此,在编译时,它们被视为/src.rs使用关联的子目录命名/src/,或者(更好)作为目录本身src/mod.rs内的根模块命名src/)。
  2. 板条箱根模块(以及Cargo.toml)通过选择目录根目录中的模块来构造源树src/。然后,这些模块可以包括从其关联的模块子目录中选择的模块,然后是从其关联的模块子目录中选择的模块,等等。包含的模块文件的结果树成为板条箱中可用的源代码。重要的是,板条箱根模块(lib.rsmain.rsbin/other_crate_root.rs)实际上可以从“/src”目录中选择不同的初始模块,从而演化出不同的模块树。
  3. 最后,一旦模块确实存在于包的源树中,就可以通过其路径引用它(取决于可见性约束)。特别是,该use语句现在可以用于缩写模块的路径和/或其外部可见的内容。


Yil*_*maz 16

mod关键字就像import语句。您可以访问外部文件中的内容。Rust 需要知道模块的存在。(对于 Cargo.toml 中指定的外部依赖项,Rust 和 Cargo 允许您直接使用它们的项目,而无需手动声明每个 crate。)

 // another_file is the name of the file, another_file.rs
 // file name is default module
 mod another_file
Run Code Online (Sandbox Code Playgroud)

现在你带来了内容。use用于创建顶级路径,以便您可以在多个部分中使用函数或结构。假设您必须到达模块深处的结构:

// mod could be in the same file: my_game::education::learning_rust::Person;
// in main.rs you dont need to use `use crate::another_file`. you would use `use crate` if you were in other module
use another_file::my_game::education::learning_rust::Person;
Run Code Online (Sandbox Code Playgroud)

通过use声明,我们将其纳入Person范围。

然后里面main

fn main(){
    let person=Person::new()
    person.display_info();
    }
Run Code Online (Sandbox Code Playgroud)

如果我不使用use关键字,那么在需要Person结构的地方我会这样写:

let person=another_file::my_game::education::learning_rust::Person::new()
Run Code Online (Sandbox Code Playgroud)

  • 您的示例中的“mod”语句与实际模块的“mod”声明之间有什么关系......?因此,如果我有一个名为“a.rs”的文件,那么在“a.rs”内部我定义了一个像“pub mod a”这样的模块。我想在 main 中使用 `a.rs` 中的函数,那么我_仍然_需要在 main 中使用_second_ `mod a` 语句吗? (2认同)