文章分享《Rust中的New Type解答了我十多年前的一个疑问》

文章分享《Rust 中的 New Type 解答了我十多年前的一个疑问》

🔗 mp.weixin.qq.com/s/1-peBDmwSRRgtol...

本文简单介绍了两种定义 “新” 类型的方法,New Type 和类型别名,并通过时间段 Duration 这个类型,对比了二者的区别。

New Type 的主要用途有以下几点,

  • 用更加有意义,更具描述性和表现力的词语作为类型名,提升可读性(对比 intAgestringUserEmail

  • 类型检查、类型安全(struct T(t)Tt 是不同的类型)

  • (可能是 Rust 独有的)为外部的类型实现外部的 Trait,如为 std.string.String 实现 std.fmt.Display

  • 定义单位,明确数字的含义

  • 封装、抽象私有的内部类型,并可以将校验逻辑绑定到类型上(如作为身份证号的字符串必须是 18 位)

  • 缩减、限制类型的行为(如作为时间段或年龄的整数不能相乘)

New Type 的一个缺点是,在重构代码时,若要使用 New Type struct T(t) 替换基础数据类型 t,如用 struct UserId(String) 替换作为用户 ID 的 String,那么就不得不沿着函数的调用链,逐一修改每个函数的参数。

而类型别名的主要用途包括:

  • 用更加有意义,更具描述性和表现力的词语作为类型名,提升可读性(在这一点上与 New Type 一样)

  • 缩短冗长的类型定义,减少重复出现的类型

有些 New Type 的用途文中并没有提及,关于这些内容,大家可以参考以下文章