Rust模块
逻辑代码组称为模块,多个模块被编译为一个单元crate。 Rust程序可能包含一个二进制create或一个库crate。
二进制crate具有main() 函数,库crate是一组可以在其他项目中重用的组件。与二进制crate不同,库crate没有入口点(main()函数)。
cargo工具用于管理Rust中的crate。例如network 模块包含与网络相关的函数,graphics 模块包含与图纸相关的函数。
模块类似于其他编程语言中的名称空间,第三方crate可以通过 crates.io 下载。
序号 | 术语和描述 |
---|---|
1 | crate 是Rust的编译单元,crate被编译为二进制或库。 |
2 | cargo 用于crate的官方Rust软件包管理工具。 |
3 | module 从逻辑上将代码分组到一个crate中。 |
4 | 官方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
嵌套模块
模块也可以嵌套。下面给出的示例定义了一个 play()函数 在movies::english::comedy模块中。
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!
例子-创建crate并在二进制crate中使用
让我们创建一个名为的movie_lib的crate,其中包含一个模块movies。我们将使用该工具cargo建立 movie_lib crate。
步骤1-建立专案资料夹
建立资料夹 电影应用 跟一个子文件夹 电影库 。创建文件夹和子文件夹后,创建一个src文件夹和此目录中的Cargo.toml文件。源代码应该放在 src文件夹 。在src文件夹中创建文件lib.rs和movie.rs。这 货代 文件将包含项目的元数据,例如版本号,作者名称等。
项目目录结构如下图:
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文件
该文件将定义电影模块的所有功能。
pub fn play(name:String){ println!("Playing movie {} :movies-app",name); }
上面的代码定义了一个函数play()接受参数并将其打印到控制台。
第5步-建立图书馆箱
使用货物建造命令以验证库条板箱的结构是否正确。确保你位于项目的根目录: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文件夹中,然后是Cargo.toml文件和src文件夹。该项目应具有main方法,因为这是一个二进制条板箱,它将消耗先前创建的库条板箱。在src文件夹中创建一个main.rs文件。文件夹结构将如下所示。
movie-app movie-lib //已经完成 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("newbiego".to_string()) }
上面的代码导入了一个名为Movies_lib的外部程序包。检查当前项目的Cargo.toml以验证包装箱名称。
第9步-使用cargo build和cargo run
我们将使用cargo build和cargo run来构建二进制项目并执行,如下所示: