“在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。
领取专属 10元无门槛券
私享最新 技术干货