Rust 学习笔记(41)-高级类型

参考章节《Rust程序设计语言》第19.3章 高级类型
参考章节《Rust程序设计语言》第19.3章 从不返回的 never type
参考章节《Rust程序设计语言》第19.3章 动态大小类型和 Sized trait

Rust 的类型系统有一些我们曾经提到但没有讨论过的功能。包括 newtype 模式类型别名!,和 动态大小类型

为了类型安全和抽象而使用 newtype 模式

这里,书上说了一堆理论,我看的也是云里雾里,参考为了类型安全和抽象而使用 newtype 模式这一小节

总的来说它提供了以下能力

  1. 静态的确保某值不被混淆
1
2
3
比如我函数接收一个 u32 类型的值,但我把它当作"毫秒值"来计算,此时,如果我传u32的值1是允许的,传u32的值1000也是允许的  
这就容易不小心发生歧义,如果你没注意参数的含义,你可能就会传递一个"秒值"进去,这样的话,结果自然不是我们想要的  
这时候我们就可以通过 newtype 模式,把 u32 封装到一个元祖结构体中,而参数类型使用这个结构体类型,此时你再使用普通的 u32 值来调用该函数的程序是不能编译的。
  1. 抽象掉一些类型的实现细节
1
例如,A类型有一些它自己的方法,此时我们可以通过newtype模式,封装一个包含A的MyTypes(A)结构体,然后提供我们自己的公有方法,从而隐藏A类型自身的方法
  1. 隐藏其内部的泛型类型
1
2
3
例如,我们有一个 HashMap<i32, String> 用来存储一个人名和其对应的身份证id,此时我们就可以利用newtype模式,封装一个 People(HashMap<i32, String>) 的结构体
我们可以为 People 提供一个API,你只需要提供一个名字,它就会在内部为这个名字生成一个对应的ID,并一同增加到内部的 HashMap 中
使用 People 的代码只需与我们提供的公有 API 交互即可,这样这些代码就无需知道在内部我们将一个 i32 ID 赋予了这个名字了。

类型别名用来创建类型同义词

这里书上说的非常清楚,我觉得我没有必要再写一遍了,参考-> 类型别名用来创建类型同义词

总结一下就是,通过 type 关键字声明类型别名,它主要可以为我们减少重复

总结一下就是,Rust 有一个特定的 trait 来决定一个类型的大小是否在编译时可知,这就是 Sized trait。这个 trait 自动为编译器在编译时就知道大小的类型实现。

1
2
3
4
// <T: Sized>表示,T 是在编译时就能确定大小的类型
fn generic<T: Sized>(t: T) {
    // --snip--
}
updatedupdated2025-03-012025-03-01