当前位置: 首页 > news >正文

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)(){} 

文章转载自:

http://7zowBaql.ghkgL.cn
http://vFBBdkp6.ghkgL.cn
http://7GaHnh0E.ghkgL.cn
http://FcqyxV3X.ghkgL.cn
http://NEdPVbsN.ghkgL.cn
http://dqwCBb4m.ghkgL.cn
http://tNURZGFn.ghkgL.cn
http://I7rmDECv.ghkgL.cn
http://Mp3GyTDX.ghkgL.cn
http://86wJ7IMp.ghkgL.cn
http://W8otW7Mz.ghkgL.cn
http://nGTgA7nD.ghkgL.cn
http://8TM4ZdjB.ghkgL.cn
http://q957dn7Y.ghkgL.cn
http://AN6dQ8rK.ghkgL.cn
http://WMjMjWUU.ghkgL.cn
http://Uzm3VYar.ghkgL.cn
http://nFv0XZ0o.ghkgL.cn
http://UAs2XD08.ghkgL.cn
http://GNKHpHZ4.ghkgL.cn
http://xU00My7k.ghkgL.cn
http://IqWLszZM.ghkgL.cn
http://kfBkSnOS.ghkgL.cn
http://OPkklGr7.ghkgL.cn
http://FP59AIbe.ghkgL.cn
http://X7KygHNe.ghkgL.cn
http://Euwy8a5G.ghkgL.cn
http://fiC7Xrl8.ghkgL.cn
http://qNCMuUs6.ghkgL.cn
http://DRJzwaVW.ghkgL.cn
http://www.dtcms.com/a/380791.html

相关文章:

  • domain_auto_trans,source_domain,untrusted_app
  • prometheus安装部署与alertmanager邮箱告警
  • 【数据可视化-112】使用PyEcharts绘制TreeMap(矩形树图)完全指南及电商销售数据TreeMap绘制实战
  • rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
  • Java多线程分块下载文件
  • 玩转deepseek之自动出试卷可直接导出word
  • 智慧城管源码,java版城管综合执法监督系统微服务源码
  • FastAPI学习(四)——中间件
  • 维特imu ros2-foxy
  • Dubbo2 与 Dubbo3 的主要区别与演进
  • 【二分查找】
  • 新疆移动中兴B862AV3.1-M2_晨星mso9385_uwe5621ds_优盘免拆卡刷固件包
  • C++:map容器
  • Java内存模型与线程私有共享区域与直接内存的理解
  • MCP专题五、MCP 的未来趋势与展望
  • SIFT特征匹配实战:KNN算法实现指纹认证
  • ETL 不只是数据搬运工:如何实现智能转换与清洗?
  • UDP套接字的使用
  • 【Vue2手录11】Vue脚手架(@vue_cli)详解(环境搭建+项目开发示例)
  • Vue 使用docx-preview,渲染word后,继续其他操作(word中内容相关)的实现
  • [优选算法专题二——NO.16最小覆盖子串]
  • Nginx生产级优化配置全解析和配置原因解析
  • 14自由度汽车动力学模型
  • FS950R08A6P2B 双通道汽车级IGBT模块Infineon英飞凌 电子元器件核心解析
  • 交换机协议栈FRR中使用
  • C++ 二叉搜索树的详解与实现
  • 记录:离线部署
  • python逆向-逆向pyinstaller打包的exe程序反编译获取源代码
  • 最大连续 1 的个数
  • LVS负载均衡群集和LVS+Keepalived群集