AgentSkillsCN

rust-abstraction-patterns

在编写带有泛型类型参数的 Rust 结构体、实现特质以支持多态性、设计服务/客户端/处理器层、在 Box<dyn Trait>、枚举与泛型之间进行选择、添加中间件(重试、日志记录、缓存)、对现有类型进行包装或装饰、将方法转发至内部字段,或重构代码以减少相似结构体间的重复时,均可使用此技能。

SKILL.md
--- frontmatter
name: rust-abstraction-patterns
description: Use when writing Rust structs with generic type parameters, implementing traits for polymorphism, designing service/client/handler layers, choosing between Box<dyn Trait> vs enum vs generics, adding middleware (retry, logging, caching), wrapping or decorating existing types, forwarding methods to inner fields, or refactoring to reduce duplication across similar structs.

Rust Abstraction Patterns

Files

FileContent
generics-pattern.mdGeneric parameters, infection chain, meaningful generics
reuse-patterns.mdWrapper (composition), trait polymorphism (dispatch), extension traits

When to Use

  • Composing behaviors (retry, logging, caching)
  • Enhancing existing types without modification
  • Choosing dispatch strategy (enum vs generic vs dyn)
  • Cutting generic infection in deep struct hierarchies
  • Adding methods to foreign types

Prerequisites

  • rust-over-engineering - Abstraction summarizes existing code, not predicts future cases. Start concrete first.

Workflow

  1. Adding generics to structs? → Read generics-pattern.md first
  2. Enhancing/decorating types? → Use wrapper pattern in reuse-patterns.md
  3. Finite polymorphism? → Use enum dispatch
  4. Need to cut generic infection? → Enum at appropriate layer
  5. Plugin system or heterogeneous collection?dyn Trait is acceptable

Priority

PatternPriorityUse Case
Generic methodsHighFlexible APIs without struct infection
Wrapper (Inner)HighLayer enhancement, decoration
Enum dispatchHighFinite variants, cut infection
Extension traitsMediumAdd methods to foreign types
dyn TraitLowOnly when static dispatch impossible

Quick Reference

  • Wrapper: struct Wrapper<T> { inner: T } - composable, stackable
  • Enum dispatch: Known variants, no vtable, cuts infection
  • Generic method: fn process<T>(&self, arg: T) - no struct infection
  • Generic struct: struct S<T> - infects all layers above, use cautiously