Rust-理解所有权借用与引用

我们在学习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和&有什么区别?

以下总结内容引用自这里: 

我们在不同情况下解释&的意思:

  1. 在表达式上,表示的是借用。
  2. 在变量绑定上,表示解地址操作与*类似。
  3. 在类型声明上,表示引用类型。
  4. 在模式匹配上,无效关键字

那么ref的通用解释是:

  1. 在表达式上,无效关键字
  2. 在变量绑定上,表示引用类型。
  3. 在类型声明上,无效关键字
  4. 在模式匹配上,表示引用类型。

非要给区分ref&到底哪个是引用,哪个是借用。我们可以先从词性划分,引用我归类为名词,而借用归类为动词。

&A在表达式上 表示借用A,这是一个动作,那结果就是产出一个引用类型。

所以let ref B表示声明了一个引用类型,它只能绑定到某次借用动作上。

所以ref更适合叫引用,&叫借用。

posted @ 2022-02-19 18:08  johnny_zhao  阅读(407)  评论(0编辑  收藏  举报