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!