Rust 模块
逻辑代码组被称为模块。多个模块被编译成一个叫做 crate 的单元。Rust程序可以包含一个二进制crate或者一个库crate。一个二进制crate是一个有 main() 方法的可执行项目。一个库crate是一组可以在其他项目中重用的组件。与二进制crate不同,库crate没有入口点(main()方法)。Rust使用Cargo工具来管理crate。例如, network 模块包含与网络相关的函数,而 graphics 模块包含与绘图相关的函数。模块类似于其他编程语言中的命名空间。第三方crate可以使用Cargo从 crates.io 下载。
序号 | 术语与描述 |
---|---|
1 | crate 是Rust中的编译单元;crate被编译为二进制文件或库。 |
2 | cargo 是官方的Rust包管理工具,用于管理crate。 |
3 | module 在一个crate中逻辑地组织代码。 |
4 | crates.io 是官方的Rust包注册表。 |
语法
//public module
pub mod a_public_module {
pub fn a_public_function() {
//public function
}
fn a_private_function() {
//private function
}
}
//private module
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 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
嵌套模块
模块也可以嵌套。喜剧 模块嵌套在 英语 模块中,而后者又嵌套在 电影 模块中。下面的示例定义了一个名为 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;
// importing a public module
fn main() {
// short path syntax
play("Herold and Kumar".to_string());
play("The Hangover".to_string());
//full path syntax
movies::english::comedy::play("Airplane!".to_string());
}
输出
Playing comedy movie Herold and Kumar
Playing comedy movie The Hangover
Playing comedy movie Airplane!
示例 – 创建一个库包并在二进制包中使用
让我们创建一个名为 movie_lib 的库包,其中包含一个模块 movies 。要构建 movie_lib 库包,我们将使用工具 cargo 。
步骤1 – 创建项目文件夹
创建一个文件夹 movie-app ,然后创建一个子文件夹 movie-lib 。在创建文件夹和子文件夹后,在此目录中创建一个 src 文件夹和一个Cargo.toml文件。源代码应放在 src 文件夹中。在src文件夹中创建文件lib.rs和movies.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 – 编辑movies.rs文件
这个文件将定义movies模块的所有函数。
pub fn play(name:String){
println!("Playing movie {} :movies-app",name);
}
上面的代码定义了一个接受参数并将其打印到控制台的函数
步骤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文件夹。这个项目应该有一个主方法,因为这是一个二进制包,将使用之前创建的库包。在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" }
注意 − 图书馆文件夹的路径已设置为依赖项。下面的图表显示了两个项目的内容。
步骤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来构建二进制项目并执行它,如下所示: