Rust学习入门--【16】Rust 借用所有权 Borrowing / 引用

news2024/9/25 17:16:07

系列文章目录

Rust 语言是一种高效、可靠的通用高级语言,效率可以媲美 C / C++ 。本系列文件记录博主自学Rust的过程。欢迎大家一同学习。

Rust学习入门–【1】引言
Rust学习入门–【2】Rust 开发环境配置
Rust学习入门–【3】Cargo介绍
Rust学习入门–【4】Rust 输出到命令行
Rust学习入门–【5】源代码文件结构简介
Rust学习入门–【6】Rust 基础语法
Rust学习入门–【7】Rust 数据类型
Rust学习入门–【8】复合类型
Rust学习入门–【9】Rust 函数
Rust学习入门–【10】Rust 条件语句
Rust学习入门–【11】Rust 运算符
Rust学习入门–【12】Rust 循环
Rust学习入门–【13】Rust 字符串(上)
Rust学习入门–【14】Rust 字符串(下)
Rust学习入门–【15】Rust 所有权


文章目录

  • 系列文章目录
  • Rust 借用所有权 Borrowing / 引用
  • 1、什么是借用 Borrowing ?
  • 2、可变引用


Rust 借用所有权 Borrowing / 引用

Rust 支持对所有权的 出借 borrowing。当把一个具有所有权的变量传递给函数时,就是把所有权借用给函数的参数,当函数返回后则自动收回所有权。


1、什么是借用 Borrowing ?

借用 Borrowing (出借) ,就是 临时性的把东西借给别人,当别人用完了之后就要还回来。

这里的重点有两个字:

  • : 把东西借给他人后,自己就暂时性的失去了东西的所有权。
  • : 借了别人的东西要主动还,这应该养成一个良好的习惯,如果不还,就是 占为己有 了。

Rust 语言中,借用 就是一个函数中将一个变量传递给另一个函数作为参数暂时使用。

同时,Rust 也引用了自动 的概念,就是要求函数的参数离开其作用域时需要将 所有权 还给当初传递给他的变量,这个过程,我们需要将函数的参数定义为 & variable_name,同时传递参数时,需要传递 & variable_name

站在 C++ 语言的角度考虑,就是将 函数的参数定义为引用,同时传递变量的引用。

fn print_vector(x:&Vec<i32>){  // 1. 第一步,定义参数接受一个引用
    println!("Inside print_vector function {:?}",x);
}


fn main(){

    let v = vec![1,2,3];     // 声明一个向量,变量 v 具有数据的所有权
    print_vector(&v);           // 第二步,传递变量的引用给函数
    println!("{}",v[0]);        // 这行会报错
}

编译运行以上 Rust 代码,输出结果如下

在这里插入图片描述

2、可变引用

借用 Borrowing 或者说引用默认情况下是只读的,也就是我们不能修改引用的的变量的值。

例如下面的代码

fn add_one(num: &i32) {
   *num+= 1;
}

fn main() {
   let i = 3;
   println!("before {}",i);
   add_one(&i);
   println!("after {}", i);
}

编译运行以上 Rust 代码,输出结果如下
在这里插入图片描述

编译失败的原因,就像错误信息里说的那样,引用 默认情况下是不可编辑的。

Rust 中,要让一个变量可编辑,唯一的方式就是给他加上 mut 关键字。

因此,我们可以将上面的代码改造下,改成下面这样

fn add_one(num: &mut i32) {
   *num+= 1;
}

fn main() {
   let mut i = 3;
   println!("before {}",i);
   add_one(&mut i);
   println!("after {}", i);
}

编译运行以上 Rust 代码,输出结果如下

从上面的代码中可以看出: 借用 Borrowing 或者说引用的变量如果要变更,必须符合满足三个要求:

  1. 变量本身是可变更的,即定义时必须添加 mut 关键字。
  2. 函数的参数为可变更的,加上 借用 Borrowing 或者说引用,也就是必须添加 &mut 关键字。
  3. 传递 借用 Borrowing 或者说引用也必须声明时 可变更传递,也就是传递参数时必须添加 &mut 关键字。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/356235.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

KubeSphere 社区双周报 | OpenFunction 集成 WasmEdge | 2023.02.03-02.16

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者&#xff0c;并对近期重要的 PR 进行解析&#xff0c;同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为&#xff1a;2023.02.03-2023.…

众德全自动批量剪辑工具,批量去重伪原创视频,全自动合成探店带货等视频

众德全自动批量剪辑工具已连续更新两年&#xff0c;服务了大大小小的自媒体公司工作室共200多个&#xff0c;成就了几百个草根创业者&#xff0c;实现月入10万&#xff0c;自从创办众德传媒之前&#xff0c;我一直坚信自媒体才是年轻草根创业者的出路&#xff0c;不需要技术门槛…

整合K8s+SpringCloudK8s+SpringBoot+gRpc

本文使用K8s当做服务注册与发现、配置管理&#xff0c;使用gRpc用做服务间的远程通讯一、先准备K8s我在本地有个K8s单机二、准备service-providerpom<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.…

2023年PMP考试教材有哪些?(含pmp资料)

PMP考试教材是《PMBOK指南》&#xff0c;但这次的考试因为大纲的更新&#xff0c;而需要另外的敏捷书籍来备考。且官方发了通知&#xff0c;3、5月还是第六版指南&#xff0c;8月及8月之后&#xff0c;使用第七版教材。 新版考纲将专注于以下三个新领域: 人 – 强调与有效领导项…

java设计模式——观察者模式

概述 定义:又被称为发布-订阅(Publish/Subscribe)模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时&#xff0c;会通知所有的观察者对象&#xff0c;使他们能够自动更新自己。 结构 在观察者模式…

数据分析:旅游景点销售门票和消费情况分析

数据分析&#xff1a;旅游景点销售门票和消费情况分析 文章目录数据分析&#xff1a;旅游景点销售门票和消费情况分析一、前言二、数据准备三、分析数据四、用户购买门票数量分析五、用户复购分析六、用户回购分析七、占比分析1.每个月分层用户占比情况。2.每月不同用户的占比3…

网络模型OSI

网络模型OSI定义模型分布数据封装、解封过程数据链路层1.LLC逻辑链路控制子层(Logic Link Control Sub Layer)2.MAC媒介访问控制子层(Medium Acess Control Sub Layer)CSMA/CARST-CST原理OSI定义 OSI&#xff1a;Open Systems Interconnection Reference Model&#xff0c;开放…

2023年前端开发的八大趋势,值得你关注下

随着新年的到来&#xff0c;许多人制定了提高自己和工作的决心。对于前端开发人员而言&#xff0c;跟上最新的潮流趋势是成功的关键。特别是在经济不好的情况下&#xff0c;很多科技专家在最近一个季度内被解雇&#xff0c;这更加强调了这一点。在2023年&#xff0c;有许多令人…

学习 Python 之 Pygame 开发坦克大战(五)

学习 Python 之 Pygame 开发坦克大战&#xff08;五&#xff09;坦克大战完善地图1. 创建砖墙2. 给砖墙增加子弹击中的碰撞效果3. 给砖墙坦克不能通过的碰撞效果坦克大战完善地图 我的素材放到了百度网盘里&#xff0c;里面还有原版坦克大战素材&#xff0c;我都放在一起来&am…

Blazor入门100天 : 身份验证和授权 (2) - 角色/组件/特性/过程逻辑

目录 建立默认带身份验证 Blazor 程序角色/组件/特性/过程逻辑DB 改 Sqlite将自定义字段添加到用户表脚手架拉取IDS文件,本地化资源freesql 生成实体类,freesql 管理ids数据表初始化 Roles,freesql 外键 > 导航属性完善 freesql 和 bb 特性 本节源码 https://github.com/…

Flink03: 集群安装部署

Flink支持多种安装部署方式 StandaloneON YARNMesos、Kubernetes、AWS… 这些安装方式我们主要讲一下standalone和on yarn。 如果是一个独立环境的话&#xff0c;可能会用到standalone集群模式。 在生产环境下一般还是用on yarn 这种模式比较多&#xff0c;因为这样可以综合利…

C++入门:引用

目录 一. 什么是引用 1.1 引用的概念 1.2 引用的定义 二. 引用的性质和用途 2.1 引用的三大主要性质 2.2 引用的主要应用 三. 引用的效率测试 3.1 传值调用和传引用调用的效率对比 3.2 值返回和引用返回的效率对比 四. 常引用 4.1 权限放大和权限缩小问题 4.2 跨…

【超好用】自定义的mybatis-plus代码生成器

BACKGROUND你是否也有这样的烦恼&#xff1a;每次写代码都需要创建很多包很多层很多类很多接口&#xff1f;耗时且费力姑且不谈&#xff0c;有时可能还大意了没有闪&#xff0c;搞出一堆bug这谁顶得住啊都3202年了&#xff0c;让程序自力更生吧&#xff01;&#xff01;教程 le…

原创|关于一次产品需求程序设计及优化的经历

文章目录一、流程梳理二、设计梳理三、技术方案3.1、下单接口扩展3.3.1、Request类新增deviceType3.3.2、申请单新增字段产品策略(productStrategy)3.3.3、下单产品策略的处理逻辑3.2、询价模块的设计3.2.1、Context设计3.2.2、ProductStrategy类设计3.2.2.1、AbstractProductS…

k8s篇之概念介绍

文章目录时光回溯什么是K8SK8S不是什么一、K8S构成组件控制平面组件&#xff08;Control Plane Components&#xff09;kube-apiserveretcdkube-schedulerkube-controller-managercloud-controller-managerNode 组件kubeletkube-proxy容器运行时&#xff08;Container Runtime&…

Spring Cloud Nacos实战(七)- Nacos之Linux版本安装

Nacos之Linux版本安装 Linux版NacosMySql生产环境配置 ​ 已经给大家讲解过了Nacos生产环境下需要搭建集群配置&#xff0c;那么这里我们预计需要&#xff1a;1个Nginx3个Nacos注册中心1个MySql 具体配置&#xff1a; 在官网上下载NacosLinux版本&#xff1a;https://github…

基于SSM框架的CMS内容管理系统的设计与实现

基于SSM框架的CMS内容管理系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目…

并查集(高级数据结构)-蓝桥杯

一、并查集并查集(Disioint Set)&#xff1a;一种非常精巧而实用的数据结构用于处理不相交集合的合并问题。用于处理不相交集合的合并问题。经典应用&#xff1a;连通子图。最小生成树Kruskal算法。最近公共祖先。二、应用场景有n个人&#xff0c;他们属于不同的帮派。 已知这些…

Kafka漏洞修复之CVE-2023-25194修复措施验证

Kafka漏洞修复之CVE-2023-25194修复措施验证前言风险分析解决方案AdoptOpenJDK Zookeeper Kafka多版本OpenJDK安装切换Zookeeper安装Kafka安装与使用其他Kafka消息发送流程Linux配置加载顺序参考链接前言 场景介绍 Kafka最近爆出高危漏洞CNNVD-202302-515&#xff0c;导致Apa…

LeetCode刷题复盘笔记—一文搞懂贪心算法之56. 合并区间(贪心算法系列第十四篇)

今日主要总结一下可以使用贪心算法解决的一道题目&#xff0c;56. 合并区间 题目&#xff1a;56. 合并区间 Leetcode题目地址 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间…