• 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更适合叫引用,&叫借用。

  • 相关阅读:
    CentOS 8.2上安装Cassandra Web部署
    CentOS 8.2上安装Apache Cassandra 3.11.9
    CentOS 8.2使用pgAdmin安装PostgreSQL 13.1
    windows 服务器报错处理,TLS升级为1.2
    网站跳转index.html
    安装fail2ban,防止ssh爆破及cc攻击
    服务器数据盘挂载
    2条命令在centos7.5中安装谷歌浏览器
    部署安装python3.7
    部署安装snort--入侵检测工具
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/15913289.html
Copyright © 2020-2023  润新知