首页 > 其他分享 >详细讲解一下Rust中package、crate、module的概念

详细讲解一下Rust中package、crate、module的概念

时间:2024-12-26 16:43:56浏览次数:4  
标签:src rs utils package crate module 模块 main

在 Rust 中,packagecratemodule 是三个层次不同但又相互关联的概念,它们共同组成了 Rust 的代码组织和管理体系。以下是它们的详细介绍:


1. Package(包)

  • 定义:一个 package 是一个由 Cargo(Rust 的构建工具和包管理器)管理的项目,包含一个或多个 crate
  • 核心文件:每个 package 至少有一个 Cargo.toml 文件,用于描述包的元信息(例如包名、版本、依赖等)。
  • 限制:一个 package 至多可以包含一个库(library crate),但可以包含多个二进制(binary crate)。

示例

# Cargo.toml
[package]
name = "my_package"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = "1.0"  # 添加外部依赖

如果项目目录下有多个二进制文件,可以在 src/bin 目录下存放:

src/
  main.rs    # 默认的 binary crate
  bin/
    tool.rs  # 额外的 binary crate
    helper.rs

2. Crate(板块/单元)

  • 定义:一个 crate 是一个独立的编译单元,可以是一个二进制可执行文件或一个库。
    • Binary Crate:有一个 main 函数,编译后生成可执行文件。
    • Library Crate:没有 main 函数,主要用作库供其他 crate 调用。
  • 构成:一个 crate 通常由一个 lib.rsmain.rs 文件作为入口。

关键特性

  • Rust 编译器一次只能编译一个 crate。
  • 一个 crate 的作用域由 mod(模块)系统进一步划分。

示例

src/
  main.rs   # Binary crate 的入口

或者:

src/
  lib.rs    # Library crate 的入口

在代码中可以声明模块:

mod utils; // 引用一个模块

3. Module(模块)

  • 定义:一个 module 是用来组织代码的逻辑单位,用于拆分一个 crate 中的代码。
  • 作用
    • 控制代码的可见性(pub 和私有性)。
    • 将代码分隔到不同的文件中以提高可读性。
  • 模块的声明
    • 可以嵌套多个模块。
    • 模块可以定义在一个文件内,也可以拆分为多个文件。

示例

// src/main.rs
mod utils; // 声明模块 utils,自动加载 src/utils.rs 或 src/utils/mod.rs

fn main() {
    utils::greet();
}

// src/utils.rs
pub fn greet() {
    println!("Hello from utils!");
}

如果模块复杂,可以拆分成目录形式:

src/
  main.rs
  utils/
    mod.rs   # 模块的入口文件
    helper.rs

代码

// src/utils/mod.rs
pub mod helper;

pub fn greet() {
    println!("Hello from utils!");
}

// src/utils/helper.rs
pub fn assist() {
    println!("Helper function");
}

调用时:

fn main() {
    utils::greet();
    utils::helper::assist();
}

三者关系

  • Package 是最外层的单位,管理一个或多个 crate
  • Crate 是独立的编译单元,可以是二进制或库。
  • Modulecrate 内的代码组织方式,用于拆分代码、管理命名空间。

类比

  • Package 类似于一个文件夹,包含项目和依赖描述。
  • Crate 类似于一个项目中的独立程序或模块(可以是可执行程序或库)。
  • Module 类似于项目中的文件或命名空间,用于组织具体的代码逻辑。

如果有其他问题,欢迎继续交流!

标签:src,rs,utils,package,crate,module,模块,main
From: https://www.cnblogs.com/Tifahfyf/p/18633457

相关文章

  • 【PyTorch】ModuleNotFoundError: No module named ‘torchnet‘
    【PyTorch】ModuleNotFoundError:Nomodulenamed‘torchnet’问题描述Traceback(mostrecentcalllast):File"SketchyDatabase\train.py",line3,in<module>frommodels.TripletEmbeddingimportTripletNetFile"SketchyDatabase\model......
  • oracle packages
    oraclepackages|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|-------------|----......
  • 猫头虎 分享已解决Bug:解决 AttributeError: module ‘scipy.misc‘ has no attribute
    ......
  • pdfjs 报错提示Failed to load module script
    参考文章:pdfjs报错提示Failedtoloadmodulescript[JavaScript]MIMEtype异常在服务器好不容易配好nginx转发,jar包,静态资源等,访问网站一切ok,结果打开pdf时,无法预览:F12看了下,接口返回正常啊,说明接口没问题,接着看控制台,oh,问题在这:Failedtoloadmodulescript:Expecte......
  • javapackager JavaFx 打包 成exe 桌面应用 程序
    JavaFx打包成exe桌面应用程序java开发的GUI交付一般就是windows平台一般就是exe,还是比较多流程,依赖环境1.maven所有依赖jar都打包成一个jar,pom增加插件命令mvnassembly:assembly<plugin><artifactId>maven-assembly-plugin</artifactId>......
  • 【深度学习|语义分割之UNet】继承自 PyTorch 的 nn.Module的UNet——基于编码器-解码
    【深度学习|语义分割之UNet】继承自PyTorch的nn.Module的UNet——基于编码器-解码器结构的语义分割任务的卷积神经网络。附代码及解读。【深度学习|语义分割之UNet】继承自PyTorch的nn.Module的UNet——基于编码器-解码器结构的语义分割任务的卷积神经网络。附代码及......
  • Flutter Package of the Week All In One
    FlutterPackageoftheWeekAllInOneiOSApp/AndroidApp/WebApp/DesktopApphttps://www.youtube.com/playlist?list=PLjxrf2q8roU1quF6ny8oFHJ2gBdrYN_AKvideo_playerFlutterPackagehttps://www.youtube.com/watch?v=Jxw6FaA0j3I&list=PLjxrf2q8ro......
  • rust学习十四、编译和发布单元包Crate
    本文简要介绍如何编译和发布单元包(crate)。很可惜的是,找了一会,没有发现可以发布到除了Crates.io之外的地方。可能是我没有找到,也可能仅仅是因为我本人仅是初学者。希望国内的大学和其它机构能够创建那么一个国内的库,避免哪天封禁后,无处可去。本文对应相关书籍的第十四章节的第......
  • PaddleClas棘手问题:ImportError: attempted relative import with no known parent pa
    PaddleClasImportError问题问题背景事先通过pipinstall-e.安装了editional版本的PaddleClas包,也在PYTHONPATH当中添加了相关路径,但是在执行模型推理时,还是遇到了这个问题:Traceback(mostrecentcalllast):File"/root/mambaforge/envs/py310/lib/python3.10/runpy.py......
  • JavaScript 的模块化:AMD、ES Module 和 Webpack
    一、AMD(AsynchronousModuleDefinition)什么是AMD?AMD是一种为浏览器环境设计的模块定义规范。它通过异步加载模块,解决了早期前端开发中JavaScript文件依赖关系复杂的问题。require.jshttps://requirejs.org/docs/api.html#jsfiles语法示例define(['dependency1','......