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

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

嵌套模块


模块也可以嵌套。下面给出的示例定义了一个 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来构建二进制项目并执行,如下所示: