移动语义

An assignment will transfer ownership between variables:

fn main() {
    let s1: String = String::from("Hello!");
    let s2: String = s1;
    println!("s2: {s2}");
    // println!("s1: {s1}");
}
  • s1 赋值给 s2,即转移了所有权。
  • When s1 goes out of scope, nothing happens: it does not own anything.
  • s2 离开作用域时,字符串数据被释放。
  • 变量绑定在任一时刻有且“只有”一个值。
  • 指出这与 C++ 中的默认值相反。除非你使用 std::move(并已定义 move 构造函数!),否则 C++ 中的默认值是按值复制的。

  • 只有所有权发生了转移。是否会生成任何机器码来操控数据本身是一个优化方面的问题,系统会主动优化此类副本。

  • 简单的值(例如整数)可以标记为“Copy”(请看后续幻灯片)。

  • 在 Rust 中,克隆是显式的(通过使用 clone)。