生活中,我们对工具有所有权,但是也不妨碍我们可以把工具借给别人甚至租用给别人,别人用完了,要还给你的。

Rust 中,Borrowing(借用),就是一个函数中的变量传递给另外一个函数作为参数暂时使用。也会要求函数参数离开自己作用域的时候将所有权 还给当初传递给它的变量(好借好还,再借不难嘛!)。

&变量名  //要把参数定义的时候这样定义。

例子如下:

fn show(v:&Vec<&str>){
    println!("v:{:?}",v)
}
fn main() {
    let studyList = vec!["Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师"];
    let studyList2 =studyList;
    show2(&studyList2);
    println!("studyList2:{:?}",studyList2); //我们看到,函数show使用完v2后,我们仍然可以继续使用
}
//输出
v:["Go语言极简一本通", "Go语言微服务架构核心22讲", "从0到Go语言微服务架构师"]
v2:["Go语言极简一本通", "Go语言微服务架构核心22讲", "从0到Go语言微服务架构师"]

可变的借用

上面我们的例子可以说都是只读的,我们看下面:

fn show2(v:&Vec<&str>){
    v[0]="第一个充电项目已完成";
    println!("v:{:?}",v)
}
报错如下:
error[E0596]: cannot borrow `*v` as mutable, as it is behind a `&` reference
| fn show2(v:&Vec<&str>){
| ---------- help: consider changing this to be a mutable reference: `&mut Vec<&str>`
| v[0]="第一个充电项目已完成";
| ^ `v` is a `&` reference, so the data it refers to cannot be borrowed as mutable

报错的原因:我们的这个借用不可以是可变的。那么 Rust 中,如果想要让一个变量是可变的,只能在前面加上 mut 关键字。

修改如下:

fn show2(v:&mut Vec<&str>){
    v[0]="第一个充电项目已完成";
    println!("v:{:?}",v)
}
fn main() {
 let mut studyList3 = vec!["Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师"];
 println!("studyList3:{:?}",studyList3);
 show2(&mut studyList3);
 println!("调用后,studyList3:{:?}",studyList3);
 }
 //输出
studyList3:["Go语言极简一本通", "Go语言微服务架构核心22讲", "从0到Go语言微服务架构师"]
v:["第一阶段学习已完成", "Go语言微服务架构核心22讲", "从0到Go语言微服务架构师"]
调用后,studyList3:["第一阶段学习已完成", "Go语言微服务架构核心22讲", "从0到Go语言微服务架构师"]

如果我们要在**Borrowing(借用)**的时候改变其中的值:

  1. 变量要用mut关键字。
  2. 函数参数为可变的要用 &mut 关键字。
  3. 传递参数的时候,也要用 &mut 关键字。