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

  • 相关阅读:
    selenium+python常用函数
    不同网络层的协议与工具
    Loudrunner编写WinSocket接口测试脚本
    python常见问题汇总
    Appium简介及工作原理
    Http协议详解
    Selenium 工作原理
    HTTP与HTTPS有哪些区别?
    【Appium】Appium工作原理(2)
    MySQL 必知必会学习笔记(常用命令二)
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/15913289.html
Copyright © 2020-2023  润新知