move, copy, drop, clone
move
当变量的类型没有实现Copy trait
时,发生赋值、函数入参、函数返回值等会被自动move
,move
后原变量将不可用。
1 | let a=String::from("ABC"); |
因为String
并没有实现Copy trait
,此时a
的值被move
给了b
,当再使用a
时,会报错
1 | error[E0382]: borrow of moved value: `a` |
copy
Copy trait
是一种特殊的Clone trait
,但不能手动调用。
当变量的类型实现了Copy trait
时,发生move
的情况会使用定义的Copy
方法,Copy
后原变量依旧有效。
1 | let a=3; |
因为i32
实现了Copy trait
,此时a
的值会被Copy
给b
,a
依旧有效。
clone
clone
只能手动调用。
1 | let a=String::from("ABC"); |
String
没有实现Copy trait
,a.clone()
生成一个clone对象
并move
给了b
,因为move
的是clone对象
,不影响a
。
drop
即析构方法。当变量结束作用域时,会自动调用Drop trait
,若没有实现Drop trait
则会调用默认的Drop::drop
方法回收资源。
Copy trait
和Drop trait
不能同时实现,因为Copy
并不能实现深复制(Copy trait
可以),即克隆对象与被克隆对象可能拥有同一个资源引用,将在析构时重复释放资源。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AlMirai!