移动语义
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
)。