Rust-代码组织(package crate module)

代码组织结构

Rust在语言层面提供了3个代码管理单元,分别是:

  • package:一个package可以视为一个项目,cargo new 命令创建的就是package
  • crateRust编译的最小单元,和java中的jar包类似,每个crate中有一个Cargo.toml文件来配置crate相关信息 有可执行crate和库crate两种
    • 一个package可以包含多个crate,但最少要包含一个crate
    • 一个package可以包含多个可执行crate,只能包含一个库crate
    • src/main.rs是默认的根可执行crate,其他可执行crate放于src/bin目录下
    • src/lib.rs是默认的根库crate
  • module:模块,类似于其他语言中的命名空间(java中的package),一般是封装了某个具体功能的实现

模块

rust 使用 mod 关键词用来定义模块和引入模块,以 mod 关键字为起始,然后指定模块的名字,并且用大括号包围模块的主体

rust 复制代码
// src/main.rs
mod add {
    pub mod add_one {
        pub fn add_one (base: u32) -> u32 {
            base + 1
        }
    }
}

fn main() {
    print!("{}", add::add_one::add_one(0));
}

模块拆分

拆分成文件

rust 复制代码
- Cargo.toml
- src/
    - add.rs
    - main.rs

// src/add.rs
pub mod add_one {
    pub fn add_one (base: u32) -> u32 {
        base + 1
    }
}

// src/main.rs
mod add;

fn main() {
    print!("{}", add::add_one::add_one(0));
}

拆分成文件夹

rust 复制代码
- Cargo.toml
- src
    - add/
        - add_one.rs
        - mod.rs
    - main.rs

// src/add/add_one.rs
pub fn add_one (base: u32) -> u32 {
  base + 1
}

// src/add/mod.rs
pub mod add_one;

// src/main.rs
mod add;

fn main() {
    print!("{}", add::add_one::add_one(0));
}

拆分成文件+文件夹

rust 复制代码
- Cargo.toml
- src
    - add/
        - add_one.rs
    - add.rs
    - main.rs

// src/add/add_one.rs
pub fn add_one (base: u32) -> u32 {
  base + 1
}

// src/add.rs
pub mod add_one;

// src/add.rs
pub mod add_one;

可见性

Rust 中的项(例如函数、结构体、枚举等)默认情况下是私有的,只能在同一个模块中访问。使用 pub 关键字可以将项设置为公共的,以便在其他模块中访问

rust 复制代码
mod mxsm_module {
    pub fn public_function() {
        // 公共函数
    }

    fn private_function() {
        // 私有函数
    }
}

fn main() {
    mxsm_module::public_function(); // 可以访问公共函数
    // mxsm_module::private_function(); // 无法访问私有函数
}

use super self

Rust模块的引用有两种方式,相对路径的引用和绝对路径的引用。

绝对引用以crate开头,可以把crate理解为的代码的根模块。 相对引用有两个关键字,selfsuperself表示同级的模块,super表示上一级的模块

在 Rust 中,可以使用 use 关键字引入模块和其内部的内容,以便在其他地方直接使用

rust 复制代码
mod my_module { 
    pub fn greet() { 
        println!("Hello, world!"); 
    } 
} 
// 在其他地方使用模块和函数 
use my_module::greet; 
fn main() { 
    greet(); // 调用模块内部的函数 
}

cargo.toml

[package]

ini 复制代码
[package]
name = "project_name"     # 包名(必需,遵循crates.io命名规则)
version = "0.1.0"         # 语义化版本号(必需)
authors = ["Alice <a@example.com>"]  # 维护者列表(可选)
edition = "2021"          # Rust版本(2015/2018/2021,默认2015)
description = "项目描述"   # 简短说明(crates.io展示)
license = "MIT OR Apache-2.0" # 许可证标识符(crates.io必需)
repository = "https://github.com/..." # 代码仓库链接
keywords = ["web", "async"] # 分类关键词(最多5个)
categories = ["network"]  # crates.io分类(https://crates.io/category_slugs)
readme = "README.md"      # 自述文件路径(默认README.md)
documentation = "https://..." # 自定义文档链接
default-run = "bin_name"  # 默认执行的可执行文件

依赖管理

普通依赖

ini 复制代码
[dependencies]
serde = "1.0"            # 从 crates.io 安装最新 1.x 版
reqwest = { version = "0.11", features = ["json"] } # 启用特定特性
uuid = { git = "https://github.com/uuid-rs/uuid", rev = "dffd9f9" } # Git依赖
pathlib = { path = "../pathlib" } # 本地路径依赖

开发依赖

ini 复制代码
[dev-dependencies]       # 测试/示例/基准测试专用
tokio = { version = "1.0", features = ["full"] }

[build-dependencies]     # 构建脚本(build.rs)专用
cc = "1.0"

平台特定依赖

ini 复制代码
[target.'cfg(windows)'.dependencies]
winapi = "0.3"

[target.'cfg(unix)'.dependencies]
libc = "0.2"

[features] [workspace]

ini 复制代码
[features]
default = ["ssl"]        # 默认启用的特性
ssl = ["openssl"]        # 特性可组合其他依赖
postgres = ["dep/postgres"]

[workspace]
members = ["crates/*"]   # 包含的子crate路径
exclude = ["crates/old"] # 排除的目录
resolver = "2"           # 依赖解析器版本(Cargo特性)

构建管理

ini 复制代码
[lib]
name = "mylib"          # 库名称(默认与包名相同)
path = "src/lib.rs"      # 入口文件路径
crate-type = ["cdylib"]  # 编译类型(lib/dylib/cdylib/rlib等)

[[bin]]
name = "main"           # 可执行文件名
path = "src/main.rs"     # 入口文件路径
test = true             # 是否参与测试(默认true)
bench = false           # 是否参与基准测试

[profile.dev]
opt-level = 0           # 调试模式(默认)

[profile.release]
opt-level = 3           # 发布模式优化
lto = true              # 链接时优化
codegen-units = 1       # 代码生成单元数

脚本与元数据

构建脚本 build = "build.rs" # 指定构建脚本(默认build.rs

自定义扩展数据(被工具使用): [package.metadata.docs.rs] features = ["full"] # 文档生成配置示例

相关推荐
Rhi63716 分钟前
从零搭建项目:React 19 + Vite 8 + Tailwind CSS v4 实战配置
前端
Vane121 分钟前
从零开发一个AI插件,经历了什么?
人工智能·后端
竹林81823 分钟前
用Viem替代ethers.js:从一次签名失败到完整迁移的实战记录
前端·javascript
之歆28 分钟前
DAY08_CSS浮动与行内块布局实战指南(上)
前端·css
9523643 分钟前
SpringBoot统一功能处理
java·spring boot·后端
light blue bird1 小时前
主子端台二分法任务汇总组件
前端·数据库·.net·桌面端winform
rleS IONS1 小时前
SpringBoot中自定义Starter
java·spring boot·后端
DevilSeagull1 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
jeffwang2 小时前
我做了个让 AI 看屏幕跑测试的工具,因为 Playwright 测不了我的 Flutter Web
前端
HSunR2 小时前
dify 搭建ai作业批改流
开发语言·前端·javascript