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 <[email protected]>"]  # 维护者列表(可选)
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"] # 文档生成配置示例

相关推荐
koooo~6 分钟前
【无标题】
前端
Attacking-Coder38 分钟前
前端面试宝典---前端水印
前端
linweidong2 小时前
Go开发简历优化指南
分布式·后端·golang·高并发·简历优化·go面试·后端面经
咖啡啡不加糖3 小时前
雪花算法:分布式ID生成的优雅解决方案
java·分布式·后端
姑苏洛言3 小时前
基于微信公众号小程序的课表管理平台设计与实现
前端·后端
烛阴3 小时前
比UUID更快更小更强大!NanoID唯一ID生成神器全解析
前端·javascript·后端
why1513 小时前
字节golang后端二面
开发语言·后端·golang
还是鼠鼠3 小时前
单元测试-断言&常见注解
java·开发语言·后端·单元测试·maven
Alice_hhu4 小时前
ResizeObserver 解决 echarts渲染不出来,内容宽度为 0的问题
前端·javascript·echarts
cainiao0806054 小时前
Spring Boot 4.0实战:构建高并发电商系统
java·spring boot·后端