我正在尝试从parser.rs
中的another.rs
和solve.rs
访问模块。如何包含这些模块并使用“ use
语句”?如果那不可能,那么代码结构应该是什么?
这是应用程序文件夹树:
app/src
--- main.rs
--- another.rs
--- mod.rs
--- parser/
-------- parser.rs
-------- mod.rs
--- solver/
-------- solve.rs
-------- mod.rs
答案 0 :(得分:1)
您的第一个选择是绝对路径:
use crate::parser::Whatever;
use crate::solver::Another;
crate
是一个表示箱子根的关键字。
您还可以将相对路径用于高级方案。相关的Rust Documentation
中对这两种解决方案都进行了很好的讨论。此外,不要忘记您需要将模块公开。默认情况下,它们将是私有的,父母或兄弟姐妹将无法访问它们。
答案 1 :(得分:1)
要从板条箱中的任何位置访问parser/parser.rs
和another.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.rs
和foo.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;
引用该模块。