前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

Rust 学习笔记-15 模块化(rust官方社区模组)

qiguaw 2024-11-03 14:33:30 资源文章 20 ℃ 0 评论


逻辑代码组成为模块。

多个模块被编译成一个称为 crate 的单元。


概念

  • crate
  • Cargo
  • module
  • crates.io

crate:

  • Rust程序可能包含一个二进制 crate 或一个库 crate 。
  • 二进制 crate 是一个具有 main()方法的可执行文件。
  • 库 crate 是一组可以在其他项目中重用的组件。与二进制 crate 不同,库crate 没有入口点(main() 方法)。

cargo:

  • Cargo工具是用来管理Rust 的crates 。

module:

  • 在一个crate中对代码进行逻辑分组
  • 例如,网络模块包含网络相关功能,图形模块包含与绘图相关的功能。模块类似于其他编程语言中的命名空间。

crates.io:

  • 官方Rust 包(crate)仓库.
  • 第三方crates可从crates.io 下载获取。

模块语法:

// 公开的模块
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("天龙八部".to_string());
}

输出结果:

Playing movie 天龙八部

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("天龙八部 ".to_string());
}

输出:

Playing movie 天龙八部

嵌套模块

模块也可以嵌套。comedy 模块嵌套在 english 模块中,后者进一步嵌套在 movies模块中。

下面给出的示例定义了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() {
   // short path syntax
   play("天龙八部".to_string());
   play("战狼".to_string());

   //full path syntax
   movies::english::comedy::play("飞上云霄".to_string());
}

输出结果:

Playing comedy movie 天龙八部
Playing comedy movie 战狼
Playing comedy movie 飞上云霄

创建一个库crate 并在二进制crate 中使用

让我们创建一个名为movie_lib的库,其中包含一个movies模块.

第一步: 创建应用.

创建目录movie-app

D:\demo\rust\movie-app>cargo new movie-lib --lib
     Created library `movie-lib` package

D:\demo\rust\movie-app>

目录结构是这样的.

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

第二步: 编辑Cargo.toml 编辑项目元数据.

[package]
name = "movie-lib"
version = "0.1.0"
authors = ["aron9g <llc_xyz@qq.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

第三步: 编辑 lib.rs 文件.

添加以下行到文件lib.rs

pub mod movies;

以上指令创建了一个公共模块: movies

第四步: 编辑movies.rs 文件

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

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

第五步: 构建库 crate.

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

D:\demo\rust\movie-app\movie-lib>cargo build
   Compiling movie-lib v0.1.0 (D:\demo\rust\movie-app\movie-lib)
    Finished dev [unoptimized + debuginfo] target(s) in 0.26s

第六步: 创建一个测试程序

在movie app文件夹后创建另一个文件夹movie-lib-test , Cargo.toml文件和src文件夹。这个项目应该有main方法,因为这是一个二进制crate,

D:\demo\rust\movie-app>cargo new movie-lib-test --bin
     Created binary (application) `movie-lib-test` package

文件夹结构如图所示:

movie-app
   movie-lib 
   // already completed

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

第七步: 添加依赖. 编辑Cargo.toml

在movie-lib-test 项目的cargo.toml文件下.

[package]
name = "movie-lib-test"
version = "0.1.0"
authors = ["aron9g <llc_xyz@qq.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

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

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


第八步: 编辑main.rs


extern crate movie_lib;
use movie_lib::movies::play;
fn main() {
   println!("inside main of test ");
   play("星球大战".to_string())
}

第九步: 构建并运行:

cargo run

输出结果:

D:\demo\rust\movie-app\movie-lib-test>cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target\debug\movie-lib-test.exe`
inside main of test
Playing movie 星球大战 :movies-app


往期回顾:

今天不知怎么发不了往期文章链接,查看往期,点我头像.

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表