# rustPractice **Repository Path**: i_bobo/rust-practice ## Basic Information - **Project Name**: rustPractice - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-19 - **Last Updated**: 2025-11-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 关联类型 vs 泛型参数 - 选择依据演示 本项目通过4个实际场景演示 Rust 中关联类型(Associated Types)和泛型参数(Generic Parameters)的选择依据。 ## 核心选型原则 **金句:类型由谁决定、未来要不要扩、体积限不限,三者权衡即可。** ### 1. 语义角色 - **关联类型**:接口的输出,由实现者决定 - **泛型参数**:接口的输入,由调用方决定 ### 2. 一致性 - **关联类型**:同一实现块内只能取一个值 - **泛型参数**:可多次实例化出不同类型 ### 3. 前向兼容 - **关联类型**:可新增默认实现,不破坏现有代码(RFC 2532) - **泛型参数**:一旦追加即破坏所有调用点 ### 4. 编译器优化 - **关联类型**:参与类型归一化,减少重复单态化,降低LLVM codegen体积 - **泛型参数**:过度爆炸会让.rlib体积在嵌入式场景直接超标OTA分区 ## 演示场景 ### Demo 1: 关联类型 - 硬件寄存器映射 **场景**:类型由实现者唯一确定,调用方不应反复指定 **优势**: - 编译期锁死寄存器位宽,避免用户填错泛型参数导致MMIO踩内存 - 类型由实现者决定,减少调用方错误 **运行**: ```bash cargo run --bin demo1_associated_types ``` ### Demo 2: 泛型参数 - 云原生网关过滤器链 **场景**:调用方需要同一实现上产出不同类型 **优势**: - 一次编译,多次单态化 - 支持动态组合(HTTP1/HTTP2/gRPC) - 如果使用关联类型,所有协议必须使用同一类型,丧失扩展性 **运行**: ```bash cargo run --bin demo2_generic_params ``` ### Demo 3: 关联类型 + 默认类型 - 向后兼容 **场景**:未来可能新增类型参数但要保证向后兼容 **优势**: - 老代码零改动即可升级 - 新代码可以选择使用新特性(如缓存) - 如果使用泛型参数,添加参数会破坏所有调用点 **运行**: ```bash # 注意:关联类型默认值在某些 Rust 版本中可能需要 nightly 工具链 cargo +nightly run --bin demo3_default_types # 或者如果已设置 nightly 为默认工具链: cargo run --bin demo3_default_types ``` ### Demo 4: 编译体积对比 - 嵌入式场景 **场景**:嵌入式 + 尺寸敏感场景 **优势**: - 关联类型通过类型归一化减少30%+的LLVM IR重复 - 华为鸿蒙微内核实测:镜像体积下降22KB - 满足车规级ECU的128KB OTA分区限制 **运行**: ```bash cargo run --bin demo4_size_comparison ``` ## 选型决策树 ``` 需要抽象类型? ├─ 类型由谁决定? │ ├─ 实现者决定 → 关联类型 │ └─ 调用方决定 → 泛型参数 │ ├─ 未来需要扩展? │ ├─ 需要向后兼容 → 关联类型 + 默认类型 │ └─ 可以破坏性变更 → 泛型参数 │ └─ 体积限制? ├─ 嵌入式/尺寸敏感 → 优先关联类型 └─ 无限制 → 根据其他因素决定 ``` ## 实际案例 ### 使用关联类型的标准库示例 - `std::ops::Add::Output` - 加法运算的输出类型由实现者决定 - `Iterator::Item` - 迭代器的元素类型由实现者决定 - `Future::Output` - Future的输出类型由实现者决定 ### 使用泛型参数的标准库示例 - `Vec` - 容器元素类型由调用方决定 - `Option` - 可选值类型由调用方决定 - `Result` - 成功/错误类型由调用方决定 ## 编译和运行 ```bash # 编译所有演示 cargo build # 运行主程序(查看说明) cargo run # 运行各个演示 cargo run --bin demo1_associated_types cargo run --bin demo2_generic_params cargo run --bin demo3_default_types cargo run --bin demo4_size_comparison ``` ## 参考资料 - [Rust Book: Associated Types](https://doc.rust-lang.org/book/ch19-03-advanced-traits.html#specifying-placeholder-types-in-trait-definitions-with-associated-types) - [RFC 2532: Associated Type Defaults](https://rust-lang.github.io/rfcs/2532-associated-type-defaults.html) - [Rust Reference: Generic Parameters](https://doc.rust-lang.org/reference/items/generics.html)