rust 中的package、crate、module

ops/2025/3/15 13:27:49/

初学rust,对crate和mod的使用总是感到不太顺利,特此记录一下。

当我们用cargo 创建一个新项目时,默认就创建了一个package。

PS D:\test\rust_test> cargo new myproject
    Creating binary (application) `myproject` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
PS D:\test\rust_test> 

crate:一个模块的树形结构,它形成了库或二进制项目。

module:一个 module 是用来组织代码的逻辑单位,用于拆分一个 crate 中的代码。

大致关系如下:

  • 1个Package里,至少要有1种Crate(要么是Library Crate,要么是Binary Crate)
  • 1个Package里,最多只能有1个Library Crate
  • 1个Package里,可以有0或多个Binary Crate
  • 1个Crate里,可以创建0或多个mod

场景一

先看一个最简单的例子:

rust">mod database{pub fn mysql(){println!("I am mysql"); }
}fn main() {database::mysql();
}

 运行:

PS D:\test\rust_test\myproject> cargo run
   Compiling myproject v0.1.0 (D:\test\rust_test\myproject)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.59s
     Running `target\debug\myproject.exe`
I am mysql

说明:

1、需要加pub关键字将模块内的函数mysql()公开,否则main函数发现不到mysql()的存在。

2、main函数调用mysql时需要加上模块名称,database::mysql()。否则编译器也找不到mysql()。

场景二

再来看一个复杂点的例子:

rust">mod database{pub fn mysql(){println!("I am mysql"); }pub mod action{pub fn action_mysql(){super::mysql();     //子模块调用父模块,加super} }pub fn print_mysql(){mysql();}
}fn main() {database::print_mysql();use database::action;      //使用use简化调用路径action::action_mysql();
}

运行:

PS D:\test\rust_test\myproject> cargo run
   Compiling myproject v0.1.0 (D:\test\rust_test\myproject)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.17s
     Running `target\debug\myproject.exe`
I am mysql
I am mysql

说明:

1、可以使用use关键字简化路径。

2、子模块调用父模块时,要加super关键字。

场景三

再来看一下多目录,多文件的场景:

在src目录下建立两个目录,folder_a和folder_b,然后folder_a下创建文件a1.rs, folder_b下创建文件b1.rs。目录结构看起来是下面这个样子的:

├─src
│  │  main.rs
│  ├─folder_a
│  │      a1.rs
│  └─folder_b
│          b1.rs

a1.rs内容如下:

rust">pub mod inner{pub fn action_a1(){println!("action_a1");}
}

b1.rs内容如下:

rust">pub mod b1{pub fn action_b1(){println!("action_b1");}
}

那么main.rs如何才能调用到action_a1()和action_b1()呢?需要做如下操作:

1、在src目录下新建三个文件,分别是lib.rs, folder_a.rs, folder_b.rs。

├─src
│  │  folder_a.rs
│  │  folder_b.rs
│  │  lib.rs
│  │  main.rs
│  ├─folder_a
│  │      a1.rs
│  └─folder_b
│          b1.rs

lib.rs内容如下:

rust">pub mod folder_a;
pub mod folder_b;

 folder_a.rs内容如下:

rust">pub mod a1;

 folder_b.rs内容如下:

rust">pub mod b1;

2.修改main.rs文件

rust">use myproject::folder_a;   //myproject为Cargo.toml里面的package name
use myproject::folder_b;fn main() {folder_a::a1::inner::action_a1();folder_b::b1::b1::action_b1();       //两个b1, 第一个b1把b1.rs认为一个mod,第二个b1是pub mod b1{}
}

 运行成功!

PS D:\test\rust_test\myproject> cargo run
   Compiling myproject v0.1.0 (D:\test\rust_test\myproject)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.50s
     Running `target\debug\myproject.exe`
action_a1
action_b1


http://www.ppmy.cn/ops/165951.html

相关文章

红色警戒2:共和国之辉红警语音台词是什么?

红警中的台词中其他台词的意思: 1、new construction ready: 新建造准备 2、building: 开始建造 3、construction complete: 建造完毕 4、on hold: 建造暂停 5、canceled: 建造取消 6、repairing: 修理 7、insufficienct fun: 资金短缺 8、low power: 电力不足 9、p…

离线vs强制登录?Apipost与Apifox的API工具理念差异深度解析

当你的代码遇到断网时,工具应该成为助手还是枷锁? 作为一名全栈工程师,我曾同时使用Apipost和Apifox管理12个微服务项目的API。直到一次无网络环境下的紧急调试,让我彻底看清这两个工具的本质差异—— 当时用Apifox查看历史接口文…

Springboot基础篇(5):自定义 MyBatis Starter

在 Spring Boot 生态中,Starter 是一种非常方便的模块化方式,它可以帮助我们快速集成第三方库或自定义功能。本文将带你一步步实现一个自定义的 MyBatis Starter,并将其发布到 Maven 仓库中,供其他项目使用。 1 什么是 MyBatis S…

爬虫基础:HTTP 状态码大全(备忘清单)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 HTTP 状态码含义1xx. 信息2xx. 成功3xx. 重定向4xx. 客户端错误5xx. 服务器错误RESTful API5xx 永久性否定HTTP 状态码备忘清单。 每个 HTTP 状态代码的快速参考。 参考: 常见 HTTP/FTP/WebSocket 错误代码大全 (gith…

蓝桥杯Python赛道备赛——Day3:排序算法(二)(归并排序、堆排序、桶排序)

本博客是蓝桥杯备赛系列中排序算法的第二期,包括:归并排序、堆排序和桶排序。每一个算法都在给出概念解释的同时,给出了示例代码,以供低年级师弟师妹们学习和练习。 由于本期的三个算法的复杂度相对来说要高于上一期的三个算法&am…

数学 :矩阵

文章目录 前言1. 基本矩阵运算1.1 矩阵加法1.2 矩阵减法1.3 矩阵乘法 2. 转置矩阵3. 旋转矩阵小结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 前言 在许多应用场合下,我们都需要用矩阵来表示公式,接下来简洁描述矩阵…

C++ 滑动窗口

前言 C 中滑动窗口分两种,一种是给定窗口长度,还有一种是不定长窗口长度。 本篇文章主要讲解这两种状态的滑动窗口,结合例题让读者更好的理解 一、给定窗口长度K 一般的,对于给定窗口长度的题,通常要求我们对窗口内…

6、STL中list的使用方法

一、了解 list 是标准模板库(STL)提供的一个双向链表容器。它与 std::vector 或 std::array 不同,不支持随机访问(即通过下标直接访问元素)[只能用迭代器访问元素],但支持在任意位置的高效插入和删除操作。…