第 2 章:所有权与借用
第 2 章:所有权与借用
2.1 所有权规则
Rust 的内存安全核心在于所有权系统。每个值都有一个所有者,且同一时刻只能有一个所有者。
- 变量离开作用域时值会被释放
- 赋值时发生移动,而不是复制(对于非
Copy类型)
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权移动到 s2
2.2 可变性与借用
Rust 强制借用规则:
- 一个不可变引用
&T或多个不可变引用 - 一个可变引用
&mut T - 同一时间只能存在一个可变引用,不能与不可变引用混合
let mut s = String::from("hello");
let r1 = &s;
let r2 = &s;
println!("{} {}", r1, r2);
let r3 = &mut s;
2.3 引用生命周期
生命周期用于保证引用在使用时仍然有效。
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {if x.len() > y.len() { x } else { y }
}
<'a>定义生命周期参数- 函数签名中标记引用的生命周期关系
2.4 所有权与函数调用
函数参数传递会移动或借用值:
fn takes_ownership(s: String) {println!("{}", s);
}fn makes_copy(x: i32) {println!("{}", x);
}
String会移动所有权i32是Copy类型,可复制
2.5 案例练习
练习建议:
- 实现一个函数接收
String并返回其长度 - 编写一个函数返回两个字符串中较长的那个
- 观察不同借用方式下编译器如何报错
