- Rust 教程
- 铁锈 - 主页
- Rust - 简介
- Rust - 环境设置
- Rust - HelloWorld 示例
- Rust - 数据类型
- Rust - 变量
- 铁锈 - 恒定
- Rust - 字符串
- Rust - 运算符
- Rust - 决策
- 铁锈 - 循环
- Rust - 函数
- Rust - 元组
- Rust - 数组
- Rust - 所有权
- Rust - 借用
- 铁锈 - 切片
- Rust - 结构
- Rust - 枚举
- Rust - 模块
- Rust - 收藏
- Rust - 错误处理
- Rust - 泛型类型
- Rust - 输入输出
- Rust - 文件输入/输出
- Rust - 包管理器
- Rust - 迭代器和闭包
- Rust - 智能指针
- Rust - 并发
- Rust 有用的资源
- Rust - 快速指南
- Rust - 有用的资源
- Rust - 讨论
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); }
main 函数调用函数print_vector()。向量作为参数传递给该函数。矢量的所有权也从main()传递给print_vector()函数。当main()函数尝试访问向量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); }
main ()函数声明一个可变整型变量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 ()函数将变量名称的可变引用传递给display()函数。显示函数将附加字符串附加到原始名称变量。
输出
param_name value is :TutorialsPoint The value of name after modification is:TutorialsPoint Rocks