当前位置:嗨网首页>书籍在线阅读

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种方法是将它们组织成目录。