Rust : 关于Deref
一、原码
Deref Trait的原码如下:
pub trait Deref: PointeeSized {type Target: ?Sized;fn deref(&self) -> &Self::Target;
}impl<T: ?Sized> const Deref for &T {type Target = T;fn deref(&self) -> &T {*self}
}
二、关键词
隐式、自动解引用。
Deref Trait 是Rust的特色。它隐藏的很深,有时侯会感觉到很上头。
自动解引用,就是化繁为简的操作。
只有深刻理解这两者,才能真正理解Deref Trait的初衷。
三、常见的取引用和解引用操作
当 T实现了Deref Trait:
*T = *(T.deref()) = <T as Deref>::Target
正常解引用;其中,T.deref() -> &< T as Deref >::Target。
&*T = &(*T):
先解引用得到< T as Deref>::Target,再取地址
&**T = &(*(*T))
先进行第1次解引用,得到< T as Deref>::Target,再对< T as Deref>::Target进行解引用,得到<< T as Deref>::Target as Deref>::Target。再取地址。
*&T = T
先取引用,后解引用。需要注意:这种操作可能报错,已经被move了。
*&&T = &T;
先两次取引用,后做一次解引用。
&*T = T.deref();
四、点操作
以 T.method() 为例,其中点操作内含的自动解引用顺序如下:
step 1:
T.method()
如果T没有实现method(),则进行step 2
step 2:
(&*T).method() = T.deref().method()
第2次解引用,如果没有成功,则进行step 3
step 3:
(&**T).method() = T.deref().deref().method()
第3次解引用,如果没有成功,则进行step 3…
…
五、类型转换:&T ->&U
T: Deref<Target=U> => &T =>&U
常见场景:函数的参数操作,如:
fn(&T)(){} ->fn(&U)(){}