首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一段代码弄懂Rust的自动解引用规则

在StackOverflow上看到一个Rust自动解引用的帖子,觉得非常有意思,本文在学习该贴后,试图通过一个简单例子解释Rust的自动解引用规则。

在StackOverflow上看到一个探讨Rust自动解引用的帖子,帖子地址为https://stackoverflow.com/questions/28519997/what-are-rusts-exact-auto-dereferencing-rules。

01

Rust自动解引用规则

如果你不想去自己看StackOverflow上的原贴,也不想对照代码去看后面的内容,那我们这里直接来看Rust解引用规则。

在涉及到解引用时,我们假定具体的参数类型T,是否解引用为某个类型U时,其解引用匹配规则如下:

02

一个例子

下面我们通过一个例子,来验证是否是匹配上面的规则。

这段代码的输出结果为:

下面我们就来解释执行结果为什么是这样。

按照上面的规则,我们在第7~23行分别为Check,&Check,&&&Check实现了OrTrait,那么当调用该trait中的foo方法时,匹配规则中的U可以是Check、&Check、&&&Check三个类型。下面我们再回到main函数中,对各个类型调用foo函数的输出结果进行分析。

第32行,a.foo()可以写成(Check).foo(),T=Check。按照规则1匹配,可以匹配U=Check的情况,所以输出结果为A。

第33行,b.foo()可以写成(&Check).foo(),T=&Check。按照规则1匹配,可以匹配U=&Check的情况,所以输出结果为B。

第34行,c.foo()可以写成(&&Check).foo(),T=&&Check。按照规则1匹配,不匹配Check、&Check、&&&Check中的任何一种,规则1匹配失败;接下来按照规则2匹配,加上&为&(&&Check)->&&&Check匹配成功,输出D。

第35行,d.foo()可以写成(&&&Check).foo(),T=&&&Check。按照规则1匹配,可以匹配U=&&&Check的情况,所以输出结果为D。

第36行,e.foo()可以写成(&&&&Check).foo(),T=&&&&Check。按照规则1匹配,不匹配Check、&Check、&&&Check中的任何一种,规则1匹配失败;按照规则2匹配,加上&为&(&&&&Check)->&&&&&Check,匹配不成功;按照规则3解引用,可以&**(&&&&)Check->&&&Check 匹配成功,所以输出D。

第37行,f.foo()可以写成(&&&&&&&&Check).foo(),T=&&&&&&&&Check。按照规则1匹配,不匹配Check、&Check、&&&Check中的任何一种,规则1匹配失败;按照规则2匹配,加上&为&(&&&&&&&&Check)->&&&&&&&&&Check,匹配不成功;按照规则3解引用,可以&******(&&&&&&&&)Check->&&&Check 匹配成功,所以输出D。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230205A04M8N00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券