所有权的规则。当我们通过举例说明时,请谨记这些规则:
- Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
- 值有且只有一个所有者。
- 当所有者(变量)离开作用域,这个值将被丢弃。
1.move
let s1 = String::from("hello");
let s2 = s1;
println!("{}, world!", s1);
Rerror[E0382]: use of moved value: `s1`
--> src/main.rs:5:28
|
3 | let s2 = s1;
| -- value moved here
4 |
5 | println!("{}, world!", s1);
| ^^ value used here after move
|
= note: move occurs because `s1` has type `std::string::String`, which does
not implement the `Copy` trait
等同于C++调用move函数
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {}, s2 = {}", s1, s2);
如果我们 确实 需要深度复制 String
中堆上的数据时,可以显示调用clone的通用函数,但这也更明显的提醒我们这些代码可能相当消耗资源,找问题就找这里!
只在栈上的数据:拷贝
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
Copy
trait 特殊注解,如
- 所有整数类型,比如
u32
。 - 布尔类型,
bool
,它的值是true
和false
。 - 所有浮点数类型,比如
f64
。 - 字符类型,
char
。 - 元组,当且仅当其包含的类型也都是
Copy
的时候。比如,(i32, i32)
是Copy
的,但(i32, String)
就不是。