所有权
所有权
变量的所有权总是遵循相同的模式:将值赋给另一个变量时移动它。当持有堆中数据值的变量离开作用域时,其值将通过 drop 被清理掉,除非数据被移动为另一个变量所有。
- 变量与数据交互的方式(一):移动
- 基本数据类型,直接复制
// 所有整数类型,例如 i32 、 u32 、 i64 等。
// 布尔类型 bool,值为 true 或 false 。
// 所有浮点类型,f32 和 f64。
// 字符类型 char。
// 仅包含以上类型数据的元组(Tuples)。
let x = 5;
let y = x;
Rust 永远也不会自动创建数据的 “深拷贝”
```rust
// 堆中的数据
let s1 = String::from("hello");
let s2 = s1;
// 此时s1就无效了,防止函数结束`}`时候内存释放(drop),造成二次释放,只释放一次,
```
-
变量与数据交互的方式(二):克隆
let s1 = String::from("hello"); let s2 = s1.clone();
引用
- 在任意给定时间,要么 只能有一个可变引用,要么 只能有多个不可变引用。
- 引用必须总是有效的。
Sync和Send
- Send trait允许线程间转移所有权 独占访问是线程安全的
- Sync trait允许引用可以在不同的线程间共享 共享访问是线程安全的