Rust使用权

类型是否实现copy特征的对应表

类型 Copy trait
i8, i16, i32, i64, u8, u16, u32, u64, usize 是
f32,f32 是
char 是
bool 是
Tuple 是
[T; N] T impl Copy 是
[T; N] T not impl Copy 否
fn 是
String 否
Vec T impl Copy 是
Vec T not impl Copy 否
Box 否
Rc 否
Rc 否

实现了copy trait类型,变量转移给另一个变量,不会发生所有权转移

let a:usize = 1024;

let b:usize = a;    //usize具有copy特征,变量a不转移所有权 接下来还可以继续使用

assert_eq!(a, b);

未实现copy trait类型,变量转移给另一个变量时会发生所有权转移

let a:String = String::from("1024");

let b:String = a;    //String不具有copy特征,a转移所有权给b, a moved

assert_eq!(a, b);   //move occurs because `a` has type `String`, which does not implement the `Copy` trait

//How to solve: use clone, let b:String = a.clone()

引用

let a: String = String::from("1024");

let b: &String = &a;    //引用(References)允许你借用变量的值而不获取其所有权。因此,b 不会转移 a 的所有权,而是创建了一个指向 a 的不可变引用

assert_eq!(a, *b);