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);