问题描述
假设我的项目中具有以下文件结构:
.
├── Cargo.lock
├── Cargo.toml
├── src
│ ├── hotel
│ │ ├── guest.rs
│ │ ├── hotel_manager.rs
│ │ └── hotel.rs
│ ├── lib.rs
│ └── main.rs
在hotel_menager
中,我仅声明将使用hotel
和guest
模块:
pub mod hotel;
pub mod guest;
然后在lib.rs
内声明将使用hotel_manager
模块:
pub mod hotel_manager;
,最后我想在hotel
binary 中使用guest
和main.rs
,但出现此错误:
找不到模块hotel_manager
的
然后我认为也许我应该使用use
,但它也完全没有帮助:
use crate::hotel::hotel_manager;
未解决的导入
crate::hotel
。
我的Cargo.toml
:
[package]
name = "learn_file_spliting"
version = "0.1.0"
authors = ["kaczor6418 <[email protected]>"]
edition = "2018"
[lib]
name = "lib"
path = "src/lib.rs"
[[bin]]
name = "main"
path = "src/main.rs"
如何在lib.rs
中使用此嵌套模块,然后在main.rs
中使用重新导出的模块?
我知道,如果我在hotel_manager
目录中创建/src
,那么一切都会起作用,但是我想将此hotel_manager
模块放在嵌套目录中,并学习如何使用嵌套模块。 / p>
解决方法
在Rust中,不能仅通过将模块存在于目录树中来创建模块。您必须使用mod module_name;
语句明确声明它。这不仅声明名为module_name
的模块已被使用,而且还声明该模块完全存在。。
pub mod hotel_manager;
在src/lib.rs
中不起作用,因为它试图在板条箱的根模块中创建名为hotel_manager
的子模块,该子模块必须存在于src/hotel_manager.rs
或src/hotel_manager/mod.rs
-都不存在。
在crate::hotel::hotel_manager
中导入src/lib.rs
无效,因为您从未在pub mod hotel;
中声明src/lib.rs
,因此,在该目录中不存在名为crate::hotel
的模块这一点。
基本上,要使hotel_manager
模块存在于src/hotel/hotel_manager.rs
,必须将其声明为crate::hotel
模块的子模块,而该模块本身需要在根模块。
要做的事情是在src/lib.rs
中编写以下内容:
pub mod hotel;
这个名为hotel
的子模块必须存在于src/hotel.rs
或src/hotel/mod.rs
处。由于我们希望它具有其他子模块,因此按照惯例使用后者。因此,创建一个名为src/hotel/mod.rs
的文件,其内容如下:
pub mod guest;
pub mod hotel_manager;
pub mod hotel;
这将创建我们想要的适当模块结构,并将hotel
作为根模块的子模块,其中包含名为guest
,hotel_manager
和hotel
的其他子模块。
然后,在crate::hotel::hotel_manager
模块中,而不是使用mod
语句,应使用以下语句,这些语句将在其他地方声明的模块导入当前范围:
use crate::hotel::guest;
use crate::hotel::hotel;
请注意,在Rust中,您可以导入比整个模块小的项目。例如,如果在Hotel
模块中有一个名为crate::hotel::hotel
的结构,则只能使用use crate::hotel::hotel::Hotel;