Rust 借用
把一个变量的所有权传递给另一个函数,然后返回所有权是非常不方便的。Rust支持一种称为借用的概念,其中值的所有权被暂时转移给一个实体,然后返回给原始所有者实体。
考虑以下内容−
fn main(){
// a list of nos
let v = vec
![10,20,30];
print_vector(v);
println!("{}",v[0]); // this line gives error
}
fn print_vector(x:Vec<i32>){
println!("Inside print_vector function {:?}",x);
}
主功能调用一个函数 print_vector()。将一个向量作为参数传递给此函数。向量的所有权也从主函数传递给 print_vector() 函数。当主函数尝试访问向量 v 时,上述代码将导致以下错误。
| print_vector(v);
| - value moved here
| println!("{}",v[0]);
| ^ value used here after move
这是因为一旦变量或值的所有权转移到另一个函数,原本拥有它的函数就无法再使用它。
什么是借用
当一个函数暂时将变量/值的控制权转移到另一个函数时,我们称之为借用。这是通过将变量的引用传递给函数,而不是传递变量/值本身来实现的。 **( & var_name) ** 在函数执行完毕后,变量/值的所有权将转移到变量的原始所有者手中。
fn main(){
// a list of nos
let v = vec
![10,20,30];
print_vector(&v); // passing reference
println!("Printing the value from main() v[0]={}",v[0]);
}
fn print_vector(x:&Vec<i32>){
println!("Inside print_vector function {:?}",x);
}
输出
Inside print_vector function [10, 20, 30]
Printing the value from main() v[0] = 10
可变引用
函数可以通过使用可变引用 修改借用的资源。可变引用以 ** &mut ** 为前缀。可变引用只能操作可变变量。
示例:修改整数引用
fn add_one(e: &mut i32) {
*e+= 1;
}
fn main() {
let mut i = 3;
add_one(&mut i);
println!("{}", i);
}
主函数声明一个可变整数变量 i,并将 i 的可变引用传递给 add_one() 函数。add_one() 将变量 i 的值增加一。
示例:改变一个字符串的引用
fn main() {
let mut name:String = String::from("TutorialsPoint");
display(&mut name);
//pass a mutable reference of name
println!("The value of name after modification is:{}",name);
}
fn display(param_name:&mut String){
println!("param_name value is :{}",param_name);
param_name.push_str(" Rocks");
//Modify the actual string,name
}
main()函数将变量name的可变引用传递给display()函数。display函数将一个附加字符串添加到原始name变量中。
输出
param_name value is :TutorialsPoint
The value of name after modification is:TutorialsPoint Rocks