智能指针【去引用】强制转换计算公式
之前在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
运行结果: