假设我的项目中有这样的文件结构:
\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\nRun Code Online (Sandbox Code Playgroud)\n在hotel_menager我只声明我将使用hotel和guest模块:
pub mod hotel;\npub mod guest;\nRun Code Online (Sandbox Code Playgroud)\n然后在里面lib.rs我声明我将使用hotel_manager模块:
pub mod hotel_manager;\nRun Code Online (Sandbox Code Playgroud)\n最后我想在我的二进制文件hotel中使用and但我收到了这个错误:guestmain.rs
\n\n找不到模块的文件
\nhotel_manager
然后我想也许我应该使用,use但它也根本没有帮助:
use crate::hotel::hotel_manager;\nRun Code Online (Sandbox Code Playgroud)\n\n\n未解决的导入
\ncrate::hotel。
我的Cargo.toml:
[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"\nRun Code Online (Sandbox Code Playgroud)\n如何在其中使用此嵌套模块lib.rs,然后在其中使用重新导出的模块main.rs?
我知道,如果我hotel_manager在/src目录中创建,那么一切都会工作,但我希望将此hotel_manager模块放在嵌套目录中并学习如何使用嵌套模块。
在 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_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.rs处src/hotel/mod.rs。由于我们希望它有更多的子模块,按照惯例,使用后者。因此,创建一个名为 的文件src/hotel/mod.rs,其中包含以下内容:
pub mod guest;
pub mod hotel_manager;
pub mod hotel;
Run Code Online (Sandbox Code Playgroud)
这将创建一个我们想要作为hotel根模块的子模块的正确模块结构,其中包含名为guest、hotel_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;
| 归档时间: |
|
| 查看次数: |
4306 次 |
| 最近记录: |