4.1 所有权机制(OwnerShip)
OwnerShip Model
OwnerShip规则
- 每个值都有一个变量称为所有者
- 每个值只能有一个所有者
- 当所有者超出作用域时,值被销毁
Stack 和 Heap
- Stack存储已知大小的数据 快 基础数据类型等
- Heap存储未知大小的数据 慢 Struct等
move
浅拷贝加失效
fn main() {
let a = "abc".to_string();
let b = a; // a失效
}
其它语言在这样子的赋值时大多数只做一个浅拷贝,但在rust里,它是把所有权交给b,将a失效
clone
- 深度拷贝
- 开辟新的空间
fn main() {
let a = "abc";
let b = a;
println!("{}, {}", a, b);
}
输出如下:
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target\debug\hello.exe`
abc, abc
引用
reference
- 通过
&
可以获得值的引用 - 未获得值的所有权,那么它就不会在作用域结束后被销毁
- 这种情况叫借用borrowed
struct A {
a: i32,
}
fn change_a(a: &mut A) {
a.a = 233;
println!("{}", a.a);
}
fn main() {
let mut a = A {
a: 1 };
println!("{}", a.a);
change_a(&mut a);
println!("{}", a.a);
}
注意
在同一作用域下,对某一块数据:
- 可以有多个不可变引用
- 只能有一个可变的引用
- 不能同时拥有一个可变引用和一个不可变引用
Copy 和 Clone
这两个都是特质(trait
)
Copy trait
Clone trait
#[derive(Debug, Clone, Copy)]
struct Person<'a> {
name: &'a str,
age: i32,
}
fn main() {
let person = Person {
name: "Star-tears",
age: 18,
};
let pp = person;
println!("{:?}", person);
}
tips:手动标注name作用域与结构体实例作用域一致