所有权的规则。当我们通过举例说明时,请谨记这些规则:


  1. Rust 中的每一个值都有一个被称为其 所有者owner)的变量。
  2. 值有且只有一个所有者。
  3. 当所有者(变量)离开作用域,这个值将被丢弃。

1.move

  1. let s1 = String::from("hello");
  2. let s2 = s1;
  3. println!("{}, world!", s1);
  1. Rerror[E0382]: use of moved value: `s1`
  2. --> src/main.rs:5:28
  3. |
  4. 3 | let s2 = s1;
  5. | -- value moved here
  6. 4 |
  7. 5 | println!("{}, world!", s1);
  8. | ^^ value used here after move
  9. |
  10. = note: move occurs because `s1` has type `std::string::String`, which does
  11. not implement the `Copy` trait

所有权(ownership) - 图1

等同于C++调用move函数

  1. let s1 = String::from("hello");
  2. let s2 = s1.clone();
  3. println!("s1 = {}, s2 = {}", s1, s2);

如果我们 确实 需要深度复制 String 中堆上的数据时,可以显示调用clone的通用函数,但这也更明显的提醒我们这些代码可能相当消耗资源,找问题就找这里!

只在栈上的数据:拷贝

  1. let x = 5;
  2. let y = x;
  3. println!("x = {}, y = {}", x, y);

Copy trait 特殊注解,如

  • 所有整数类型,比如 u32
  • 布尔类型,bool,它的值是 truefalse
  • 所有浮点数类型,比如 f64
  • 字符类型,char
  • 元组,当且仅当其包含的类型也都是 Copy 的时候。比如,(i32, i32)Copy 的,但 (i32, String) 就不是。