为什么基础的还没介绍完,就开始介绍一些很生僻的内容?一方面是因为这些内容迟早要介绍,另一方面是满足大家的好奇心,让我们看看Rust到底有藏了多少宝贝。还有就是尽早面基这些内容,可以消除对语言的陌生感,要一种回看似曾相识以及恍然大悟的感觉
为什么基础的还没介绍完,就开始介绍一些很生僻的内容?一方面是因为这些内容迟早要介绍,另一方面是满足大家的好奇心,让我们看看Rust到底有藏了多少宝贝。还有就是尽早面基这些内容,可以消除对语言的陌生感,要一种回看似曾相识以及恍然大悟的感觉。言归正传,我们先来看看幻影类型PhantomData<T>
一般情况下,只要在类型中声明了泛型,那就必须使用,否则是无法编译通过的。比如:
但是我们都知道,泛型一方面可以扩展类型,比如一个泛型结构体,等到赋值的时候才确定它的成员是什么类型。这样就能够是实现一次声明,多次使用。另一方面,泛型有时候也起着约束类型的所用,我们来看一个例子
在明确了泛型这两种特性以后,我们在来看看 PhantomData<T>,它更多的用在约束的语义下,例如,当我们想要使用某个类型但实际上并不想为其定义一个实实在在的参数时,它就可以使用了。也就是说它可以让我们在定义时不使用它,在使用时在明确是什么类型
那有的朋友就问了,为什么不直接使用泛型呢?因为PhantomData<T>是零大小类型,在又好像不在。而我们知道,泛型在编译时都会单态化,也就是按照具体类型一个个展开
再看一个类型Pin<T>,如字面意思,它具有把什么东西定住的能力。其实它定的是指针,核心是让指针指向的值位置不发生改变,从而避免一些安全问题。哎?我们讲,在Rust中,引用总指向有效的地址。怎么会出现要把值定住的需求呢?难道地址并不总是有效的?其实,是的,在safe rust中,引用总是指向有效的地址,借用检查和所有权机制会牢牢的保证这一点。但是有些自引用结构数据,可能会出现一些UB行为,如下:
那关于Pin<T>和PhantomData<T>的介绍这期就到这里了,涉及到它们背后的原理以及应用场景,我们后面还会再介绍
可以选择clone本仓库代码,使用cargo doc --open
阅读,体验更佳
git clone git@github.com:shiyivei/from-principle-to-practice.git
cd from-principle-to-practice
cargo doc --open
更多内容欢迎关注公众号拾一维
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!