如何从父文件夹或同级文件夹模块访问模块?

时间:2019-06-20 06:29:23

标签: module rust

我正在尝试从parser.rs中的another.rssolve.rs访问模块。如何包含这些模块并使用“ use语句”?如果那不可能,那么代码结构应该是什么?

这是应用程序文件夹树:

app/src
--- main.rs
--- another.rs
--- mod.rs
--- parser/
-------- parser.rs
-------- mod.rs
--- solver/
-------- solve.rs
-------- mod.rs

2 个答案:

答案 0 :(得分:1)

您的第一个选择是绝对路径:

use crate::parser::Whatever;
use crate::solver::Another;

crate是一个表示箱子根的关键字。

您还可以将相对路径用于高级方案。相关的Rust Documentation

中对这两种解决方案都进行了很好的讨论。

此外,不要忘记您需要将模块公开。默认情况下,它们将是私有的,父母或兄弟姐妹将无法访问它们。

答案 1 :(得分:1)

要从板条箱中的任何位置访问parser/parser.rsanother.rs,可以使用绝对路径(这里我也使用nested paths,这不是必需的,但是可以使模块的结构更清除):

use crate::{
    parser::parser,
    another,
};

您还可以在super中使用相对路径,该路径指向父模块。 @Ishmaeel's answer中提供了更多信息。


关于您的代码结构,为什么拥有mod.rs似乎有些奇怪(没错,但很奇怪,尤其是0;您可以完全离开1和{{1} },如果您喜欢,但2可能会使您感到困惑):

0
  • 关于app/src main.rs another.rs mod.rs // 0 parser/ parser.rs mod.rs // 1 solver/ solve.rs mod.rs // 2 1

    2在2015年版中用于创建嵌套模块,但不再需要in the 2018 edition(假设您使用的是2018年最新版的默认货物,请参见{ {3}}):

      

    一个mod.rsfoo.rs子目录可以共存;将子模块放在子目录中时,不再需要foo/

  • 关于mod.rs

    您通过此方法定义的模块实际上被命名为0(不是您可能期望的mod,尽管我不确定您在这里期望的是什么),但不确定你打算那样做。但是,如果您这样做了,仍然可以通过What are editions?访问它,该方法自Rust 1.30起可用:

    src

    如果您不想在各处写use crate::r#mod; ,可以这样使用r#mod

    as

    然后您可以通过use crate::r#mod as new_name; 引用该模块。