“最近看到一道关于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。
领取专属 10元无门槛券
私享最新 技术干货