move

当变量的类型没有实现Copy trait时,发生赋值、函数入参、函数返回值等会被自动movemove后原变量将不可用

1
2
let a=String::from("ABC");
let b=a;

因为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
2
let a=3;
let b=a;

因为i32实现了Copy trait,此时a的值会被Copyba依旧有效。

clone

clone只能手动调用。

1
2
let a=String::from("ABC");
let b=a.clone();

String没有实现Copy traita.clone()生成一个clone对象move给了b,因为move的是clone对象,不影响a

drop

即析构方法。当变量结束作用域时,会自动调用Drop trait,若没有实现Drop trait则会调用默认的Drop::drop方法回收资源。

Copy traitDrop trait不能同时实现,因为Copy并不能实现深复制(Copy trait可以),即克隆对象与被克隆对象可能拥有同一个资源引用,将在析构时重复释放资源。