这是关于 Context-Generic Programming(CGP)的介绍文档,主要内容如下:
- 发布信息:发布了
cgp
crate 的 v0.3.0 版本及 CGP Patterns 新书的新章节,可阅读博客文章获取更多细节。 - 介绍:CGP 是 Rust 的新编程范式,可模块化、泛型且类型安全地实现和组合强类型组件,官网提供概述及关键特性,深入了解可阅读书籍。
- 当前状态:2025 年初仍处于早期开发阶段,存在文档、工具、调试技术、社区支持和生态成熟度等方面的问题,用于重要项目有风险,适合早期采用者和贡献者。
- Hello World 示例:通过简单的 hello world 示例演示 CGP 的各种概念,包括定义 greeter 组件、引入依赖、实现提供者等。
- Greeter 组件:使用
#[cgp_component]
宏定义 greeter 组件,包括消费者 trait 和提供者 trait,以及相关的类型和方法。 - A Name Dependency:引入抽象
Name
类型和访问器 trait,用于获取上下文的名称值,通过cgp_type!
宏定义和#[cgp_auto_getter]
属性宏自动生成实现。 - Hello Greeter:在不同模块或 crate 中独立实现
CanGreet
、HasNameType
和HasName
traits,通过impl
块指定约束,实现Greeter
提供者,利用依赖注入处理类型和值。 - Person Context:定义具体的
Person
上下文,使用#[derive(HasField)]
宏自动派生HasField
实现,通过delegate_components!
宏连接提供者组件,实现组件布线。 - Calling Greet:构造
Person
实例并调用greet
方法,通过一系列 blanket 实现实现调用,展示 CGP 的工作原理。 关键特性:
- 模块化组件系统:利用 Rust 的 trait 系统定义通用组件接口,分离提供者和消费者 trait,实现多提供者共存和更高的灵活性与模块化。
- 高度表达性宏:允许编写抽象程序,消除显式指定泛型参数的需求,简化代码结构和可读性,提供强大的宏用于定义组件接口和布线。
- 类型安全组合:利用 Rust 的类型系统保证组件布线的类型安全性,在编译时捕获缺失依赖,避免 CGP 特定错误在运行时发生。
- No-Std 友好:创建完全抽象的程序,不依赖具体依赖,可在 no-std 环境中使用,将核心逻辑与特定依赖分离。
- 零成本抽象:在编译时运行,利用 Rust 的类型系统确保正确性,不引入运行时开销,实现零成本抽象。
解决的问题:
- 错误处理:通过
HasErrorType
和CanRaiseError
traits 解耦核心应用逻辑和错误处理,可选择适合的错误库和处理策略。 - 异步运行时:使应用核心逻辑依赖抽象运行时上下文,提供所需功能,方便切换具体运行时实现。
- 重叠实现:引入提供者 trait 消除重叠实现的限制,支持使用抽象类型代替 newtype 包装器,实现专门的提供者实现。
- 动态调度:通过委托变体集合的“组装”到具体上下文,解决动态调度问题,提供强大的数据类型泛型模式。
- 单体重合 trait:CGP 可将大 trait 分解为小而专注的 trait,避免单体重合 trait 导致的代码膨胀和维护困难。
- 错误处理:通过
- 开始使用:建议阅读Context-Generic Programming Patterns书籍,探索实际应用和项目,查看Resources页面获取学习材料。
- 贡献:欢迎对 CGP 感兴趣的开发者参与,可通过阅读文档提供反馈、参与讨论、撰写文章等方式贡献,包括在 GitHub、Reddit 上交流,在社交媒体分享,撰写博客或教程等。
- 致谢:CGP 由Soares Chen创建,灵感来自 Haskell 类型类,其开发得到Informal Systems的支持,最初在Hermes SDK项目中引入和完善。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。