< 返回版块

Mike Tang 发表于 2026-03-14 10:46

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 功能缺失而依赖这些未规范的细节

已知失败场景

  1. [[test]] 路径推断 [[bin]] 路径
    • 解决方案:使用 std::env::var_os("CARGO_BIN_EXE_*")(Cargo 1.94+)
  2. 构建脚本从二进制或 OUT_DIR 查找 target-dir(Issue #13663)
  3. 从 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

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页