智能指针【去引用】强制转换计算公式
之前在github上看各个大神的rust代码,我经常会遇到
- 给
&str形参传递&String实参 - 给
&[T]形参传递&Vec<T>实参
的语言现象。不理解之(哎,我也是·席勒马虎·写代码),我都是见一个记一个、见一类记一类。这照实低效。最近在地铁上(最伟大的公众交通),仔细捋了捋Deref/DerefMut的Rust Docs,算是解惑了,且总结了如下的公式。没准也有助于你的参悟。
若 T: Deref<Target = U: ?Sized>,则有
T被视作有额外“能力”(即,成员方法)的U的引用。即,智能指针。- 公式:
T->&U
- 公式:
- 对
T执行【·显示·去引用】操作*,得到的就是U。- 公式推导:
*T->*(&U)->U
- 公式推导:
- 对
T执行【·显示·引用】操作&,得到的就是&U。- 公式推导:
&T- 自动去引用 ->&(*T)->&U
- 公式推导:
- 从
T实例上可直接访问到U上所有成员方法与成员字段,因为【·自动/隐式·去引用】。即,- 公式推导:
T.u_member()- 自动去引用 ->(*T).u_member()->U.u_member()
- 公式推导:
若T: DerefMut<Target = U: ?Sized>,则有
T被视作有额外“能力”(即,成员方法)的U的可修改引用。即,智能指针。- 公式:
T->&mut U
- 公式:
- 对
T执行【·显示·去引用】操作*,得到的就是mut U。- 公式推导:
*T->*(&mut U)->mut U
- 公式推导:
- 对
T执行【·显示·引用】操作&mut,得到的就是&mut U。- 公式推导:
&mut T- 自动去引用 ->&mut (*T)->&mut (mut U)->&mut U
- 公式推导:
- 从
T实例上可直接访问到U上所有成员方法与成员字段,因为【·自动/隐式·去引用】。即,- 公式推导:
T.u_member()- 自动去引用 ->(*T).u_member()->(mut U).u_member()
- 公式推导:
至于【自动·去·引用】触发时机的描述,那就得再写另一篇笔记来分享了。一次只填一个小坑。
1
共 1 条评论, 1 页
评论区
写评论好文! 总结成两句话:
在T上实现了Deref<Target = U: ?Sized>这个trait,就是赋予了通过T获得&U的能力, 用能力公式:“T -> &U”来表达,推导出实际用例:*T -> *(&U) -> U 与 &T -> &&U -> &U
在T上实现了DerefMut<Target = U: ?Sized>这个trait,就是赋予了通过T获得&mut U的能力, 用能力公式:“T -> &mut U”来表达,推导出实际用例:*T -> *(&mut U) -> mut U 与 &mut T -> &mut (&mut U) -> &mut U
运行结果: