Rust - 模块

逻辑代码组称为模块。 多个模块被编译成一个名为crate的单元。 Rust 程序可能包含二进制包或库包。 二进制包是一个具有 main() 方法的可执行项目。库 crate 是一组可以在其他项目中重用的组件。 与二进制 crate 不同,库 crate 没有入口点(main() 方法)。 Cargo 工具用于管理 Rust 中的 crate。 例如,network模块包含网络相关功能,graphics模块包含绘图相关功能。模块类似于其他编程语言中的命名空间。 可以使用 crates.io 中的 Cargo 下载第三方 crate。

Sr.No 术语 & 描述
1

crate

是Rust中的编译单元; Crate 被编译为二进制文件或库。

2

cargo

官方的 Rust 包管理工具,用于 crate。

3

module

按逻辑将代码分组到一个 crate 中。

4

crates.io

官方 Rust 包注册表。

语法

// 公共模块
pub mod a_public_module {
   pub fn a_public_function() {
      // 公共函数
   }
   fn a_private_function() {
      //私有函数
   }
}
//私有模块
mod a_private_module {
   fn a_private_function() {
   }
}

模块可以是公共的或私有的。 私有模块中的组件不能被其他模块访问。 Rust 中的模块默认是私有的。 相反,公共模块中的函数可以被其他模块访问。 模块应以 pub 关键字作为前缀以使其公开。 公共模块中的函数也必须公开。

示例:定义模块

该示例定义了一个公共模块 − movies。该模块包含一个函数 play(),它接受参数并打印其值。

pub mod movies {
   pub fn play(name:String) {
      println!("Playing movie {}",name);
   }
}
fn main(){
   movies::play("Herold and Kumar".to_string());
}

输出

Playing movie Herold and Kumar

use 关键字

use 关键字有助于导入公共模块。

语法

use public_module_name::function_name;

示例

pub mod movies {
   pub fn play(name:String) {
      println!("Playing movie {}",name);
   }
}
use movies::play;
fn main(){
   play("Herold and Kumar ".to_string());
}

输出

Playing movie Herold and Kumar

嵌套模块

模块也可以嵌套。 comedy 模块嵌套在 english 模块中,而 english 模块又嵌套在 movies 模块中。下面给出的示例在 movies/english/comedy 模块中定义了一个 play 函数。

pub mod movies {
   pub mod english {
      pub mod comedy {
         pub fn play(name:String) {
            println!("Playing comedy movie {}",name);
         }
      }
   }
}
use movies::english::comedy::play; 
// 导入公共模块

fn main() {
   // 简短路径语法
   play("Herold and Kumar".to_string());
   play("The Hangover".to_string());

   // 完整路径语法
   movies::english::comedy::play("Airplane!".to_string());
}

输出

Playing comedy movie Herold and Kumar
Playing comedy movie The Hangover
Playing comedy movie Airplane!

示例 - 创建 Library Crate 并在二进制 Crate 中使用

让我们创建一个名为 movie_lib 的库包,其中包含一个模块 movies。为了构建 movie_lib 库 crate,我们将使用工具 cargo

第 1 步 - 创建项目文件夹

创建一个文件夹movie-app,然后创建一个子文件夹movie-lib。创建文件夹和子文件夹后,在此目录中创建一个 src 文件夹和 Cargo.toml 文件。 源代码应位于src 文件夹中。在 src 文件夹中创建文件 lib.rs 和 movie.rs。 Cargo.toml 文件将包含项目的元数据,如版本号、作者姓名等。

项目目录结构如下所示 −

movie-app
   movie-lib/
      -->Cargo.toml
      -->src/
         lib.rs
         movies.rs

第 2 步 - 编辑 Cargo.toml 文件以添加项目元数据

[package]
name = "movies_lib"
version = "0.1.0"
authors = ["Mohtashim"]

第 3 步 - 编辑 lib.rs 文件。

将以下模块定义添加到此文件中。

pub mod movies;

上面的行创建了一个公共模块 − movies

第 4 步 - 编辑 movie.rs 文件

该文件将定义 movie 模块的所有功能。

pub fn play(name:String){
   println!("Playing movie {} :movies-app",name);
}

上面的代码定义了一个函数play(),它接受一个参数并将其打印到控制台。

第 5 步 - 构建库 crate

使用cargo build命令构建应用程序,以验证库 crate 的结构是否正确。 确保您位于项目的根目录 − movie-app 文件夹。 如果构建成功,终端中将显示以下消息。

D:\Rust\movie-lib> cargo build
   Compiling movies_lib v0.1.0 (file:///D:/Rust/movie-lib)
   Finished dev [unoptimized + debuginfo] target(s) in 0.67s

第 6 步 - 创建测试应用程序

在 movie-app 文件夹中创建另一个文件夹 movie-lib-test,后跟 Cargo.toml 文件和 src 文件夹。 该项目应该有 main 方法,因为这是一个二进制 crate,它将使用之前创建的库 crate。 在 src 文件夹中创建 main.rs 文件。 文件夹结构将如图所示。

movie-app
   movie-lib 
   // already completed

   movie-lib-test/
      -->Cargo.toml
      -->src/
         main.rs

第 7 步 - 在 Cargo.toml 文件中添加以下内容

[package]
name = "test_for_movie_lib"
version = "0.1.0"
authors = ["Mohtashim"]

[dependencies]
movies_lib = { path = "../movie-lib" }

注意 − 库文件夹的路径设置为依赖项。 下图显示了这两个项目的内容。

Cargo Toml 文件

第 8 步 - 将以下内容添加到 main.rs 文件中

extern crate movies_lib;
use movies_lib::movies::play;
fn main() {
   println!("inside main of test ");
   play("Tutorialspoint".to_string())
}

上面的代码导入了一个名为movies_lib的外部包。 检查当前项目的Cargo.toml以验证crate名称。

第9步 - 使用cargo build和cargo run

我们将使用cargo build和cargo run来构建二进制项目并执行它,如下所示 −

cargo run