05-将文件用作模块
2.2.2 将文件用作模块
模块也可以创建成文件,例如,对于文件名为foo的目录下的文件——main.rs,我们可以在foo/bar.rs文件中创建一个名为bar的模块。然后在main.rs中,我们需要向编译器告知该模块,即使用mod foo声明该模块;使用基于文件的模块时,这是一个额外的步骤。为了演示将文件用作模块,我们创建了一个名为modules_demo的目录,它具有以下结构:
+ modules_demo
└── foo.rs
└── main.rs
foo.rs中包含一个结构体Bar,以及它的impl代码块:
// modules_demo/foo.rs
pub struct Bar;
impl Bar {
pub fn init() {
println!("Bar type initialized");
}
}
在main.rs中使用这个模块,需在main.rs中添加如下代码:
// modules_demo/main.rs
mod foo;
use crate::foo::Bar;
fn main() {
let _bar = Bar::init();
}
上述代码使用mod foo声明了模块foo,然后使用use crate::foo::Bar从模块调用结构体Bar。注意use crate::foo::Bar中的前缀crate,这里根据你使用的前缀定义,对应有3种方法可以导入模块中的元素。
绝对导入
- crate:绝对导入前缀,指向当前项目的根目录。在上述代码中是root模块,即main.rs文件。任何在关键字crate之后的内容都会解析成来自root模块。
相对导入
- self:相对导入前缀,指向与当前模块相关的元素。该前缀用于任何代码想要引用自身包含的模块时,例如“use self::foo::Bar;”。这主要用于在父模块中重新导出子模块中的元素。
- super:相对导入前缀,可以用于从父模块导入元素。诸如tests这类子模块将使用它从父模块导入元素。例如,如果模块bar希望访问父模块foo中的元素Foo,那么可以使用“super::foo::Foo;”将其导入模块bar。
创建模块的第3种方法是将它们组织成目录。