Rust - 模块

  • 简述

    一组逻辑代码称为模块。多个模块被编译成一个单元,称为crate. Rust 程序可能包含一个二进制包或库包。二进制 crate 是具有main()方法的可执行项目。library crate 是一组可以在其他项目中重用的组件。与二进制包不同,库包没有入口点(main() 方法)。Cargo 工具用于管理 Rust 中的 crate。例如,network模块包含网络相关功能,graphics模块包含绘图相关功能。模块类似于其他编程语言中的命名空间。可以使用来自crates.io下载第三方依赖 。
    序号 术语 & 描述
    1
    crate
    是 Rust 中的编译单元;Crate 被编译为二进制文件或库文件。
    2
    cargo
    用于 crate 的官方 Rust 包管理工具。
    3
    module
    将代码按逻辑分组在一个 crate 中。
    4
    官方 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关键字使其公开。公共模块中的函数也必须公开。
  • 说明:定义模块

    该示例定义了一个公共模块 -电影。该模块包含一个函数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 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模块内,其进一步嵌套在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; 
    // 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!
    
  • 说明 - 创建一个 Library Crate 并在 Binary Crate 中使用

    让我们创建一个名为 movie_lib的 Library Crate,其中包含一个模块 movies,我们将使用该工具 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);
    }
    
    上面的代码定义了一个函数 play() 接受一个参数并将其打印到控制台。

    第 5 步 - 构建library cargo

    使用 cargo build命令来验证库包的结构是否正确。确保您位于项目的根目录 - 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-lib-test在 movie-app 文件夹中,然后是 Cargo.toml 文件和 src 文件夹。这个项目应该有 main 方法,因为这是一个二进制包,它将消耗之前创建的库包。在 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" }
    
    注意− 库文件夹的路径设置为依赖项。下图显示了这两个项目的内容。
    货物 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构建和Cargo运行

    我们将使用Cargo构建和Cargo运行来构建二进制项目并执行它,如下所示 -
    货物运行