生活中,我们对工具有所有权,但是也不妨碍我们可以把工具借给别人甚至租用给别人,别人用完了,要还给你的。
Rust 中,Borrowing(借用),就是一个函数中的变量传递给另外一个函数作为参数暂时使用。也会要求函数参数离开自己作用域的时候将所有权 还给当初传递给它的变量(好借好还,再借不难嘛!)。
代码语言:txt复制&变量名 //要把参数定义的时候这样定义。
例子如下:
代码语言:txt复制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语言微服务架构师"]
可变的借用
上面我们的例子可以说都是只读的,我们看下面:
代码语言:txt复制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 关键字。
修改如下:
代码语言:txt复制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(借用)的时候改变其中的值:
- 变量要用mut关键字。
- 函数参数为可变的要用 &mut 关键字。
- 传递参数的时候,也要用 &mut 关键字。