引用分为可变引用与不可变引用
1.1 不可变引用
代码示例
js
fn main() {
let s1 = String::from("I am a superman.");
let s2 = &s1;
let s3 = &&&&&s1;
let s4 = &s2;
let s5 = s2;
}
知识点
通过在变量前面加 & 就是不可变引用 比如 &s1
s1 是所有权变量,拥有字符串的所有权。
let s2 = &s1 s1是引用变量,是对所有权变量s1的引用。
let s3 = &&&&&s1; 这里s3是s1的多级引用,本质上跟s2(一级引用没有什么太大的区别)
let s4 = &s2 s4是s1的间接引用,等效于 let s4 = &&s1
let s5 = s2 把引用变量s2直接赋值给s5,这里是进行的copy,不是move,copy的话就是s5 根 s2 是独立的,都可以正常使用,如果是move的话,被move的就不可以再次使用了。这里执行copy,主要是因为引用变量是固定size的变量。
1.2 可变引用
js
fn main() {
let mut a = 10u32;
let b = &mut a;
*b = 20;
println!("{b}");
}
// 输出
20
知识点
通过在变量前面加 &mut 就是不可变引用 比如 &mut s1
let b = &mut a; 这里b就是a的可变引用。
*b = 20;b是可变引用,所以可以通过b修改a的值。这里的 * 是解引用的意思,有几级引用就需要解几次。
- 这里通过b修改a的值的前提是a也必须是可变的。因为b解引用最终是解到他最开始引用的那个变量,然后在通过那个变量修改值。在这里*b = 20 等同于 a = 20,因为a是可变的所以可以赋值,如果a是不可变的这里也是不能赋值修改的.