Rust中通过模拟高阶类型(HKTs)导致编译器崩溃
前言
作者在开发一个函数式编程脚本语言时,遇到了Rust不支持高阶类型的问题。
Rust不完全支持高阶类型(HKTs)
什么是高阶类型?
- 高阶类型是指泛型可以拥有泛型的概念
- 例如
struct Foo<T>(T<i32>),其中T是一个可以接受泛型类型的类型构造器 - 类型系统存在于自己的"宇宙"中,与值的世界相对应
类型构造器的概念:
Vec本身不是一个类型,而是类型构造器Vec<i32>才是完整的类型- 类型构造器可以理解为
fn(type) -> type,接受一个类型参数并返回新类型
对比表格:
| 层级 | 函数 | 类型构造器 |
|------|------|------------|
| 功能 | fn(bool) -> bool | fn(type) -> type |
| 示例 | 逻辑非运算 ! | Vec |
| 参数 | 值(如 true) | 类型(如 i32) |
| 输出 | 值(布尔值) | 类型(如 Vec<i32>) |
关键问题
作者在尝试抽象代码时发现需要写 Ast<W: ???>,但Rust无法直接表达"W是一个接受类型参数的类型构造器"这个约束,这正是缺少高阶类型支持的体现。
https://www.harudagondi.space/blog/torturing-rustc-by-emulating-hkts
Cargo 构建目录布局 v2 测试征集
Rust 官方博客发布于 2026 年 3 月 13 日,作者 Ed Page 呼吁社区测试 Cargo 的新构建目录布局。
核心要点
测试方法:
- 使用 nightly 2026-03-10 或更高版本
- 在测试、发布流程等场景中添加
-Zbuild-dir-new-layout标志 - 示例:
cargo test -Zbuild-dir-new-layout
背景说明:
- 从 Cargo 1.91 开始,用户可以分离中间构建产物(build-dir)和最终产物(target-dir)的存储位置
- 虽然构建目录布局属于内部细节,但许多项目因 Cargo 功能缺失而依赖这些未规范的细节
已知失败场景
- 从
[[test]]路径推断[[bin]]路径- 解决方案:使用
std::env::var_os("CARGO_BIN_EXE_*")(Cargo 1.94+)
- 解决方案:使用
- 构建脚本从二进制或 OUT_DIR 查找 target-dir(Issue #13663)
- 从 rustc 查找用户请求的产物(Issue #13672)
库支持状态:
- 已修复:assert_cmd、executable-path、snapbox、trycmd
- 待处理:cli_test_dir、compiletest_rs、term-transcript、test_bin
主要变化
不变内容:
- target 目录中最终产物的布局
- 构建产物在配置文件和目标元组下的嵌套结构
变化内容:
- 从按内容类型组织切换为按包名和构建单元哈希值划分
- 旧布局:按
.fingerprint/、build/、deps/等类型目录组织 - 新布局:按包名分组,每个包下包含不同哈希值的构建单元
实施原因
这项改进是实现跨工作空间缓存的基础步骤,由贡献者 ranger-ross 主导开发。
https://blog.rust-lang.org/2026/03/13/call-for-testing-build-dir-layout-v2/
--
From 日报小组 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论