【问题标题】:Rust use vs mod?Rust 使用 vs mod?
【发布时间】:2021-06-29 03:02:38
【问题描述】:

我正在努力解决这些问题,

  • use 声明

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

还有,

  • mod项目

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

基本上,当我布置我的模块时,我相信我知道我希望它如何布置,但 I get confused how these two things should be layered and what they do。我认为这两者中只有一个会包含代码?

【问题讨论】:

  • 简而言之:mod 表示“这是新模块(来自文件或大括号中),将其存储以备将来使用”,use 表示“已经创建模块,从这里拉取它路径,让我在这里使用”。

标签: import rust include mod


【解决方案1】:

语言文档尝试但遗漏了mod 隐含的一些重要概念,我必须进行测试才能弄清楚这一点。为了尝试拯救他人的时间,我提供以下结论......

  1. 模块系统层次结构形成一个源代码树,其中mod 仅限于引用,因此只能导入直接子模块。这个限制在文档中没有明确(或者我错过了)。这意味着兄弟模块不能相互导入,也不能导入父模块、孙模块或表兄弟模块......该模式确实反映了内联模块的层次包含以及文件的自然文件系统层次结构仅包含在一个目录中(除非链接文件)。这种模式的关键例外,也许是混淆的根源是根模块(main.rslib.rsbin/other_root.rs)。这些模块mod 实际上是指位于 crate 根目录 (src/) 中的同级源文件,也给人一种错误的印象,即 mod 可以在不能导入同级时导入同级源文件。 Crate 根模块(main.rslib.rsbin/other_root.rs)被视为 src/ 目录中所有其他模块的父模块。
  2. crate 根(以及Cargo.toml)包含的模块通过选择它们包含的初始模块来构造一个源代码树。这些模块然后包括他们的孩子的选择等等。结果树成为 crate 中唯一可用的源代码。 Crate 根(lib.rsmain.rsbin/other_crate_root.rs)最终可能会从 `/src' 目录中选择不同的初始模块,从而演化出不同的模块树。
  3. 最后,一旦模块确实存在于 crate 的 源树 中,就可以通过其路径引用它(取决于可见性约束)。特别是,use 现在可用于缩写项目路径。

【讨论】:

    【解决方案2】:

    假设您有一个模块 my_mod 和一个 pub 函数 my_func。在您使用 mod my_mod 语句包含您的模块之前,您不能在您的 crate 中(或在您的 crate 之外)使用此函数。

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

    mod my_mod;
    
    ...
    my_mod::my_func(...)
    ...
    

    如果你没有在你的 crate 中的某个地方包含你的模块,你就不能使用my_mod::my_func 语句。

    有时最好导入常用定义:

    mod my_mod;
    use my_mod::my_func;
    

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

    my_func(...);
    

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

    如果您使用导入 throw Cargo.toml 的其他 crates,您可以仅使用 use 语句从这些 crates 导入定义。

    【讨论】:

    • 谢谢@Dmitry,据我了解,关键字“use”就像其他语言如c#或c++的use命名空间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多