AMAZINGINDEX.COM 让生活多一点 Amazing
52.7
VOL. 2026.09
2026.09.13
← 返回 2026.09.13 日报
日报快照 · Daily Snapshot
NO. 015

Crystal 的 Flow Typing 让静态语言像动态一样写

#ARTICLE HackerNews 2026.09.13
推荐指数 44.0 NO. 015 · 2026.09.13
发布2026/09/12Score58Comments40

Crystal 语言通过 Flow Typing 允许变量在生命周期内被赋值为不同类型,同时保持静态类型检查。这对厌倦了 TypeScript 复杂类型体操、又舍不得动态语言灵活性的开发者有参考价值。

Flow Typing 不是 Crystal 首创,Kotlin 的 smart cast、TypeScript 的 type narrowing 都有类似思想,但 Crystal 把它推到了极致——变量可以在分支里彻底改头换面,编译器靠控制流分析自动追踪。这实际上是在静态类型安全和开发效率之间走了一条中间路线。

不过 Crystal 的编译器为此付出了沉重代价:控制流分析的开销直接拉长了编译时间,而且跨方法边界的类型传播仍然受限。这也是它多年未能进入主流的原因之一。如果你在做语言设计或静态分析工具,Crystal 的这个 trade-off 值得研究;如果是业务选型,建议先看编译速度和生态成熟度能否接受。

意见分歧 41 条评论

核心争论:Flow typing 是实用特性还是'穷人的动态类型',静态验证与运行时契约孰优

diath

out (; balance == balance + amount) // checked after method returns How exactly does it work? Is this a typo?

lgas

I've never used D, but it appears to be valid syntax. https://dlang.org/spec/function.html#postconditions

prydt

The syntax is correct but I made a logical error since balance is being compared to itself (as opposed to the new balance at the end).

替代方案: DTypeScriptRustSPARK/AdaEiffelEffect
查看原文 →