我们在学习Rust的借用,引用时,会遇到References(引用)、borrowing(借用)、&关键字、*关键字,他们之间的关系非常困惑。
所有权不仅可以转移(原变量会丢失数据的所有权),还可以通过引用的方式来借用数据的所有权(borrow ownership)。
我们整理下相关问题:
1. &关键字是代表引用还是借用?
我们先看看以下代码:
let s = String::from("ssssss"); let sf1 = &s;//借用 let sf2 = &s;//再次借用 println!("sf1:{}",sf1); println!("sf2:{}",sf2);
&ss表示创建变量ss的引用,为某个变量创建引用的过程不会转移该变量所拥有的所有权。
2. 可变引用和不可变引用的所有权规则
变量的引用分为可变引用 &mut var 和不可变引用 &var ,
- 多个不可变引用可共存(可同时读)。
- 同一时刻,可有0个或多个不可变借用(&T)。
- 同一时刻,只能有一个可变借用(&mut T),且被借用的变量本身必须有可变性。
- 可变借用,借用可写权(包括可读权),允许修改其引用的数据。
- 借用在离开作用域后释放。
- 在可变借用释放前,不可访问源变量。
3. ref和&有什么区别?
以下总结内容引用自这里:
我们在不同情况下解释&的意思:
- 在表达式上,表示的是借用。
- 在变量绑定上,表示解地址操作与*类似。
- 在类型声明上,表示引用类型。
- 在模式匹配上,无效关键字
那么ref的通用解释是:
- 在表达式上,无效关键字。
- 在变量绑定上,表示引用类型。
- 在类型声明上,无效关键字。
- 在模式匹配上,表示引用类型。
非要给区分ref和&到底哪个是引用,哪个是借用。我们可以先从词性划分,引用我归类为名词,而借用归类为动词。
&A在表达式上 表示借用A,这是一个动作,那结果就是产出一个引用类型。
所以let ref B表示声明了一个引用类型,它只能绑定到某次借用动作上。
所以ref更适合叫引用,&叫借用。