库 / SDK
skyzh/type-exercise-in-rust avatar
skyzh/type-exercise-in-rust

type-exercise-in-rust:用数据库表达式引擎练手 Rust 类型系统

该项目围绕「Learn advanced Rust techniques by building an expression evaluation framework for a database system.」构建,适用于实际场景的开源实践,提供可复用的工具链与集成方式。

1,515 个 Star66 个 ForkRustApache-2.0
GitHub

秒懂

它是什么?
这是一个通过搭建数据库向量化表达式引擎来学习 Rust 高级类型的开源课程。它把类型转换、借用、空值处理等难题拆成 13 章练习,适合想深入理解 Rust 类型系统的人。
适合谁用?
如果你已经熟悉 Rust 的枚举、trait 和引用,并且想通过一个真实项目来理解类型擦除、借用和空值传播,这个课程值得投入时间。它特别适合数据库内核初学者和 Rust 类型系统爱好者。
能商用吗?
可以。Apache-2.0 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
还在维护吗?
在维护。仓库最近一次提交在 9 天前。
用什么语言写的?
主要是 Rust(依据 GitHub 的语言统计)。

以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。

开源项目深度解析

一个课程,而不是一个库

这个仓库不是给你直接调用的库,而是一套循序渐进的编程练习。README 开篇就点出痛点:手写一个整数函数的循环很简单,但当引擎需要借用字符串而不复制、保留空值、读取多种列编码、做类型转换,还要在运行时选择函数时,代码就会失控。课程的目标是把这些决策从行循环里移出来,构建类型族和检查边界。最终产物是一个小型向量化表达式引擎,新类型、新算子、新参数个数都能复用同一条执行路径。适合的人群很明确:已经掌握 Cargo、枚举、trait、引用和 Option 的 Rust 开发者,想通过实际项目理解类型系统的高级用法。

从逻辑类型到擦除枚举:课程的核心脉络

课程分为 13 章,每章都建立在同一个 starter 项目上。你可以从 README 列出的成果看出它的设计思路:先把逻辑类型、拥有值的类型、借用值的类型、物理数组和检查过的擦除枚举连接起来。然后处理可空数组、常量和 Indexed 视图,这些都不需要物化新列。接着实现一元、二元、三元标量函数,通过泛型、擦除和绑定三种接口调用。之后是数值类型的提升,支持加减乘除、比较和字符串 contains。列表类型用检查过的偏移量表示,外层和子层的空值性独立。最后通过静态、擦除和已绑定三种路径暴露每批一个 future。这个顺序不是随意的,它从类型定义开始,逐步走向运行时调度,每一步都复用前面的设计。

动手方式:复制测试,实现 API

开始练习的步骤很具体。先执行 git fetch origin,然后创建自己的分支,比如 git switch --create course-work --track origin/main。接着运行 cargo check -p type-exercise-starter --lib --locked,确保 starter 能编译。每章开始前,用 cargo x copy-test --chapter 1 这样的命令把测试复制到 starter 项目里,然后运行 cargo test -p type-exercise-starter chapter_1 --locked。第一次运行应该失败,因为新行为还没实现。你需要阅读复制到 type-exercise-starter/src/tests/ 下的测试文件,在 starter 的其他文件里实现对应的 API,然后重新运行测试直到通过。规则很严格:不能修改复制的测试文件,也不能修改 src/tests.rs,而且要保持之前所有章节的测试都是绿的。这种机制保证了每个练习都是增量式的,不会破坏已有功能。

明确的边界:课程不教什么

这个项目最诚实的地方在于它明确列出了不覆盖的内容。README 说课程刻意止步于 Decimal 算术、类型转换和舍入,不涉及隐式窄化或有损转换,也没有嵌套或生成列表的函数,没有具体的四参数和五参数内建函数,没有穷尽的快速路径,没有聚合引擎,也没有按行的 future。这不是遗漏,而是设计选择。作者把范围限制在类型系统和表达式求值的核心,避免让练习者陷入数据库引擎的其他复杂领域。但这意味着如果你需要这些功能,课程不会提供现成答案。你可能会在学完后发现,自己构建的引擎只能处理它定义的那组类型和操作,离一个可用的数据库还很远。

与直接读 Rust 书籍的差异

另一种学习 Rust 高级类型的方式是读《Programming Rust》或《Rust for Rustaceans》,然后自己写小例子。但那些书是参考性的,不会强迫你面对类型擦除和借用检查在真实场景中的冲突。这个课程逼你写代码,而且是通过测试驱动的方式。每一章的测试都是预先写好的,你只需要让它们通过,这比从零设计一个项目要省力,但比阅读示例要深入得多。相比之下,如果你只是想了解某个具体技巧,比如 trait object 的使用,直接看书更快。但如果你想建立一种对类型系统如何影响运行时性能的直觉,这个项目的练习密度更高。它让你在实现过程中体会到泛型代码的复用价值,而不是只在理论上知道。

维护状态与许可证

仓库没有归档,主分支是 main,但没有最近的 release 信息。README 显示课程文本的版权是 2022-2026,说明作者还在维护。源代码使用 Apache 2.0 许可证,这意味着你可以自由使用和修改代码,但课程文本本身使用 CC BY-NC-SA 4.0,这是一个非商业的共享许可。如果你计划把课程内容用于商业培训或产品文档,需要特别注意这个限制。从维护角度看,这个项目的更新节奏未知,但既然没有归档,可以假设作者还在活跃。不过,课程的练习机制依赖于 cargo x 命令,如果 Cargo 或 Rust 版本变化,这个命令可能需要调整。你开始学习时,最好检查一下环境设置页面是否仍然有效。

编辑结论

如果你已经熟悉 Rust 的枚举、trait 和引用,并且想通过一个真实项目来理解类型擦除、借用和空值传播,这个课程值得投入时间。它特别适合数据库内核初学者和 Rust 类型系统爱好者。但如果你需要的是可直接用于生产的表达式引擎,或者想学习并行、索引、聚合等高级数据库主题,这个项目不适合你,因为它明确不涉及这些内容。开始之前,先确认你的环境能运行 cargo check -p type-exercise-starter --lib --locked,并仔细阅读环境设置页面。另外注意,课程文本采用 CC BY-NC-SA 4.0 许可,这意味着如果你要复用书中的内容,必须遵守非商业和相同方式共享的条件。

官方来源

  1. Official README
  2. Project repository
社区笔记

社区笔记