< 返回我的博客

爱国的张浩予 发表于 2021-07-21 07:30

Tags:smart-pointer,dereference,coercion

智能指针【去引用】强制转换计算公式

之前在github上看各个大神的rust代码,我经常会遇到

  • &str形参传递&String实参
  • &[T]形参传递&Vec<T>实参

的语言现象。不理解之(哎,我也是·席勒马虎·写代码),我都是见一个记一个、见一类记一类。这照实低效。最近在地铁上(最伟大的公众交通),仔细捋了捋Deref/DerefMutRust 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 共 0 条评论, 1 页