如何从嵌套目录访问嵌套模块/文件

Kan*_*now 6 rust rust-cargo

假设我的项目中有这样的文件结构:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.lock\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Cargo.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 src\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hotel\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 guest.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hotel_manager.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 hotel.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib.rs\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.rs\n
Run Code Online (Sandbox Code Playgroud)\n

hotel_menager我只声明我将使用hotelguest模块:

\n
pub mod hotel;\npub mod guest;\n
Run Code Online (Sandbox Code Playgroud)\n

然后在里面lib.rs我声明我将使用hotel_manager模块:

\n
pub mod hotel_manager;\n
Run Code Online (Sandbox Code Playgroud)\n

最后我想在我的二进制文件hotel中使用and但我收到了这个错误:guestmain.rs

\n
\n

找不到模块的文件hotel_manager

\n
\n

然后我想也许我应该使用,use但它也根本没有帮助:

\n
use crate::hotel::hotel_manager;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

未解决的导入crate::hotel

\n
\n

我的Cargo.toml

\n
[package]\nname = "learn_file_spliting"\nversion = "0.1.0"\nauthors = ["kaczor6418 <test@test.com>"]\nedition = "2018"\n\n[lib]\nname = "lib"\npath = "src/lib.rs"\n\n[[bin]]\nname = "main"\npath = "src/main.rs"\n
Run Code Online (Sandbox Code Playgroud)\n

如何在其中使用此嵌套模块lib.rs,然后在其中使用重新导出的模块main.rs

\n

我知道,如果我hotel_manager/src目录中创建,那么一切都会工作,但我希望将此hotel_manager模块放在嵌套目录中并学习如何使用嵌套模块。

\n

Lym*_*sia 9

在 Rust 中,您不能仅通过将模块存在于目录树中来创建模块。您必须使用mod module_name;语句显式声明它。这不仅声明使用了module_name名为的模块,而且声明了这样的模块根本存在

pub mod hotel_manager;不起作用,src/lib.rs因为它尝试创建一个hotel_manager在板条箱根模块中命名的子模块,该子模块必须存在于 或 中src/hotel_manager.rssrc/hotel_manager/mod.rs但两者都不存在。

导入crate::hotel::hotel_managerinsrc/lib.rs不起作用,因为您从未声明过pub mod hotel;in src/lib.rs,因此crate::hotel此时不存在名为 的模块。

基本上,要使hotel_manager模块存在于src/hotel/hotel_manager.rs,必须将其声明为 acrate::hotel模块的子模块,而 a 模块本身需要在根模块中声明。

做你想做的事情的方法是将以下内容写入src/lib.rs

pub mod hotel;
Run Code Online (Sandbox Code Playgroud)

这个名为的子模块hotel必须存在于 或src/hotel.rssrc/hotel/mod.rs。由于我们希望它有更多的子模块,按照惯例,使用后者。因此,创建一个名为 的文件src/hotel/mod.rs,其中包含以下内容:

pub mod guest;
pub mod hotel_manager;
pub mod hotel;
Run Code Online (Sandbox Code Playgroud)

这将创建一个我们想要作为hotel根模块的子模块的正确模块结构,其中包含名为guesthotel_manager和的其他子模块hotel

然后,在模块中,您应该使用以下语句,crate::hotel::hotel_manager而不是使用 using语句,这些语句将已在其他地方声明的模块导入到当前作用域中:mod

use crate::hotel::guest;
use crate::hotel::hotel;
Run Code Online (Sandbox Code Playgroud)

请注意,在 Rust 中,您可以导入比整个模块更小的项目。例如,如果模块Hotel中有一个名为的结构crate::hotel::hotel,则可以使用如下语句仅导入该结构use crate::hotel::hotel::Hotel;