Rust newtype 在编译期让非法状态无法表示,且零开销
一个单字段包装结构体就能在编译期捕获单位混淆和类型错用,不增加哪怕一个字节的开销。
把一个 用户 ID 传给期望 order ID 的函数,Rust 不会报错。两者都是 。编译器看到的是完全相同的类型,所以帮不了你。直到运行时你才会发现,通常是在生产环境,通常是在一次你以为安全的重构之后。 这正是 newtype 模式存在所要消灭的那类 bug。 newtype…
2 posts
一个单字段包装结构体就能在编译期捕获单位混淆和类型错用,不增加哪怕一个字节的开销。
把一个 用户 ID 传给期望 order ID 的函数,Rust 不会报错。两者都是 。编译器看到的是完全相同的类型,所以帮不了你。直到运行时你才会发现,通常是在生产环境,通常是在一次你以为安全的重构之后。 这正是 newtype 模式存在所要消灭的那类 bug。 newtype…
该传秒的地方传了毫秒,这种 bug 能躲过所有测试。下面介绍如何将单位直接编码进 TypeScript 的类型系统,让混用在编译阶段就报错,且运行时零开销。
某个函数的 timeout 参数要求毫秒,你传了 。另一个函数要求秒,你传了 。中间某个地方,你调用了 ,结果整整一小时二十三分钟什么也没发生。 TypeScript 在这里帮不了你。 和 都是 。编译器分辨不出米和英尺、摄氏和华氏、时间戳和时长的区别。你的测试套件大概率也抓不到,因为计算本身是对的,错的是单位。…