学习rust_day04

所有权

1
2
3
4
5
6
7
8
9
10
11
fn main() {
let a = String::new();
let b = a; //在此之后无法再使用a除非重新对其定义

let c = fun1(b); //在此之后无法再使用b
}

fn fun1(mut name: String) -> String {
name.push_str("Hello");
return name;
}
  • 变量如果发生转接赋值操作后(主要是处于堆上的内存)就不能再使用。

克隆

1
2
3
4
5
6
7
8
9
10
11
12
13
fn main() {
let a = String::new();
let b = a; //在此之后无法再使用a除非重新对其定义

let c = fun1(b); //在此之后无法再使用b

let d = c.clone(); //在此之后c和d都能正常使用,相当于两份内容
}

fn fun1(mut name: String) -> String {
name.push_str("Hello");
return name;
}

引用和借用

1
2
3
4
5
6
7
8
9
fn main() {
let a = String::from("Hello");
let b = String::from("world");
fun(& a, & b); //"&" 用来创建引用,在此之后仍然可以使用a和b
}

fn fun(t1: &String, t2: &String) {
println!("{t1} {t2}"); //这里做了自动解引用,t1实际上是t1 -> a -> "Hello",手动解引用应该使用"*"
}

数据不应该同时“被别名引用” 和 “具有可变性”

1
2
3
4
5
6
fn main() {
let mut v: Vec<i32> = vec![1, 2, 3];
let num: &i32 = &v[2];
v.push(4); //但是你仍然可以在num不在使用后再来修改
println!({*num}); //此时v的物理内存可能已经搬走了,发生了危险的行为
}

R(读权限)、W(写权限)、O(可释放或移动权限)

1
2
3
4
5
fn main() {
let a = 1; //a有R + O
let mut b = 2; //b有R + W + O
let mut c = &a; //c有R + W + O
}

当然,这里的权限仅只对于自己来说,而非指向的变量。


简单来说,就是当一个数据被多个变量指向时,不能随意为其做出更改,且同时最多只能有一个变量有修改权限。


学习rust_day04
https://zlsf-zl.github.io/2026/03/13/学习rust-day04/
作者
ZLSF
发布于
2026年3月13日
许可协议