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

一道关于clone的Rust题

最近看到一道关于Clone的题,分享出来与大家一起巩固Rust知识。

01

代码

这道题的代码如下:

运行这段代码,输入如下:

这道题的问题是,为什么第13行输出的结果是8,而第18行输出的结果为0?

02

分析

当然,我们从这道题的代码很快就可以看出两者的区别在于Foo结构体上面有#[derive(Clone)],而Bar结构体上面没有。那么为什么会这样呢?我们来逐一分析。

结构体Foo上面有[derive(Clone)],意味着结构体Foo实现了trait Clone,因此,我们可以写成如下:

而对于引用类型,是已经实现了trait Clone了的,我们可以简单写成如下:

那么,到这里,相信看过上一篇文章的小伙伴应该已经知道为什么了。

按照上一篇文章里面的匹配规则,调用clone时需要进行匹配。

对于第13行调用clone时,需要匹配第二条规则“&T = U”才能匹配成功,也就是调用的是引用的clone实现。因此第13行的调用等价于print_size(Clone::clone(&bar));而Clone::clone(&bar)返回的是bar,也就是&Bar,因此其大小为8。

而对于第18行调用clone时,因为Foo实现了Clone trait,所以在匹配第一条时就匹配成功。因此第18行的调用等价于print_size(Clone::clone(foo));

Clone::clone(foo)等价于Clone::clone(&Foo),返回的是Foo类型,因此其大小是0。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券