Rust 中的类型系统:封闭宇宙与开放宇宙

2025-02-21
Rust 中的类型系统:封闭宇宙与开放宇宙

本文探讨了在 Rust 中如何用类型系统建模现实世界中可能不断变化的选择。针对封闭宇宙(例如 Rust 的 Option 类型),枚举是合适的;而对于半开放宇宙(库作者可以添加新选项,但使用者不能),非穷尽枚举是更好的选择,它强制使用者处理通配符模式,保证了 API 的向后兼容性。对于完全开放的宇宙,可以使用字符串或带有新类型的包装器,或者使用 trait 来实现更大的灵活性。文章还分析了使用 "Unknown" 变体模式的缺点以及 sealed trait 的应用。最终,文章建议根据实际情况选择最合适的方案,并详细比较了字符串和 trait 的优缺点。

阅读更多
开发

Rust测试运行器nextest:为什么选择进程隔离?

2025-01-12
Rust测试运行器nextest:为什么选择进程隔离?

Rust测试运行器cargo-nextest的独特之处在于它为每个测试都创建一个单独的进程。这篇文章深入探讨了其背后的原因,并非仅仅是技术层面,更重要的是它在庞大Rust生态系统中所扮演的协调角色。进程隔离避免了测试间的相互干扰,解决了共享资源竞争、内存泄漏等问题,并提升了测试的可靠性。虽然进程创建会带来一些性能开销,但在应对大型测试套件时,其优势远大于劣势,成为Rust测试领域中的一个稳定可靠的“焦点”。

阅读更多

超越 Ctrl-C:Unix 信号处理的黑暗角落

2024-09-08
超越 Ctrl-C:Unix 信号处理的黑暗角落

本文深入探讨了Unix信号处理机制,从信号的基本概念、发送方式到信号处理函数的局限性都进行了详细介绍。作者以下载管理器为例,阐述了信号处理中可能遇到的问题,并引入了异步Rust以及Tokio框架中的select!机制来解决这些问题。文章还探讨了进程组的概念以及如何在异步Rust中管理子进程的信号处理。

阅读更多
未分类 异步Rust

在 illumos 上调试 rustc 段错误

2024-08-06
在 illumos 上调试 rustc 段错误

本文记录了一次在 illumos 操作系统上调试 Rust 编译器 (rustc) 段错误的经历。作者首先介绍了 Rust 编译器的自举过程以及段错误的背景信息,然后详细描述了使用 illumos 提供的各种调试工具(如 coreadm、mdb、pmap 和 truss)逐步定位问题的过程。通过分析寄存器、调用堆栈、地址空间和系统调用,作者最终确定问题是由 rustc 解析器中的调用堆栈耗尽引起的,并进一步发现 stacker 库的使用加剧了这个问题。作者还提供了一些改进建议,例如在 rustc 中更频繁地调用 stacker、修复 stacker 在 illumos 上无法检测堆栈大小的问题,以及在 illumos 上运行 Rust CI 等。

阅读更多
未分类 illumos