Rust 高级语法之 PhantomData

2024-08-29 rust language

这个名字很直接,幽灵数据,不过使用时经常会有些疑问。

简介

简单来说,这是一个零成本的抽象,在运行时类似 () 类型,毫无成本;而在编译过程中,则会被视为指定的类型,这里有两层,可以是类型,也可以是生命周期。

型变

一般是编程语言中类型系统 (尤其是泛型) 中的概念,用来描述父子类型使用过程中是否允许替换,例如 RectangleShape 的子类型,那么有如下规则:

  • 协变 Covariance 使用父类 (Shape) 的地方可以用子类 (Rectangle) 替换。
  • 逆变 Contravariance 使用子类 (Rectangle) 的地方可以使用父类 (Shape) 替换。
  • 不变 Invariance 两者不能相互替换。

在 Java 中有继承关系,其中:A) 函数如参是协变,返回值是逆变;B) 泛型支持协变 <? super T> 和逆变 <? extends T> 两种。通常,逆变是希望使用更加具体的子类型。

而 Rust 没有继承的概念,但是生命周期采用的是相同的方式,详细可以查看 死灵书 - 子类型和协变 的内容,这里简单介绍。