rust 引用怎么用

本来好好的引用,被 rust 玩坏了,搞得自己都不会使用引用了,我们还是从简单的例子入手,来探索使用引用可能遇到额问题。

下面的示例代码编译不通过,在 s1 赋值给变量 s2 的过程中,字符串 neojos 值的所有权由 s1 转移给了 s2,然后 s1 变成了未初始化的状态。

fn main() {let s1: String = "neojos".to_string();let s2 = s1;println!("print s1:{}", s1)
}

假设是 go 语言来实现同样的代码,程序没有任何问题,s1 和 s2 实际指向的同样的字符串,可以正常打印 s1,赋值前后压根不会对 s1 产生影响。而 rust 偏偏要引入所有权的概念,内存中的一个值只能属于一个变量,最终,字符串值属于了 s2 之后,s1 也就相当于被垃圾回收了。

快速解决上述问题的方案,是将赋值的方式修改为引用赋值,就像下面这样,给 s2 赋值的是 s1 的引用,这样 s2 就不能接管 neojos 字符串的所有权,引用赋值过程就属于 借用。下面的方式属于只读借用,对 s2 的任何读操作实际操作的还是 s1 。

fn main() {let s1: String = "neojos".to_string();let s2 = &s1;println!("print s1:{}", s1)
}

如果我们取引用的值,会发生值的移动吗?比如下面的例子,s2 指向了 s1 的可修改引用,s3 试图通过从 s2 取值,那么,s1 变量所拥有的值会发生转移吗?

fn main() {let mut s1: String = "neojos".to_string();let s2 = &mut s1;let s3: String = *s2;println!("print s1:{}", s1);
}

代码编译会发生报错,报错的信息见截图。*s2 确实会发生所有权转移,但 rust 禁止了这样的动作。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dede tag彩色随机大小的样式修改方法

dede tag彩色随机大小的样式修改方法,打开include/common.func.php 在最下面添加以下代码: //TAG彩色 jinmengqiang.cn function getTagStyle() { $minFontSize8; //最小字体大小,可根据需要自行更改 $maxFontSize18; //最大字体大小,可根据需要自行更改…

Unity 上传文件到阿里云 对象存储OSS服务器

首先登录阿里云 免费试用–对象存储OSS --点击立即试用,可以有三个月的免费试用 创建Buket 新建AccessKey ,新建完成后,会有一个CSV文件,下载下来,里面有Key ,代码中需要用到 下载SDK 双击打开 sln文件&#xff0…

STM32(HAL库)通过ADC读取MQ2数据

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置 2.4 项目生成 3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代 3.4 效果展示 1、简介 本文通过STM32F103C8T6单片机通过HAL库方式对M…

解决Git fatal: refusing to merge unrelated histories报错

问题描述 当在远程建立了一个仓库,并且远程的仓库已经初始化了的情况,使用 git remote add origin gitgithub.com:xxx/xxx.git命令添加远程仓库后,执行git pull,然后提示如下: 大致意思就是需要关联我们的本地和远程分支。按照…

Nginx正向代理和反向代理详解

目录 一、什么是正向代理? 二、什么是反向代理? 三、正向代理和反向代理的作用 一、什么是正向代理? 正向代理,“它代理的是客户端”,是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内…

给httprunnermanager接口自动化测试平台加点功能(七)

文章目录 一、背景1.1、用例列表test_list1.2、套件列表suite_list 二、实现2.1、用例edit页面2.2、套件edit页面 三、数据结构3.1、更新数据结构 四、知识扩展五、总结 一、背景 前面几章优化,从功能bug的优化、到列表的优化、还有字段的优化,暂时满足…

数据从发出到接收的细节介绍{封装与解封装}

系列文章目录 数通王国历险记(5) 目录 前言 一,数据封装的全过程 1.1,应用层的封装形式 1.2,传输层的封装形式 理解: 1.3,网络层的封装形式 理解: 1.4,数据链路层…

编程导航算法通关村第 1关 | 两个链表的第一个公共节点

编程导航算法通关村第 1关 | 白银挑战 剑指 Offer 52. 两个链表的第一个公共节点 集合/map 将headA中的链表,放在一个set集合中, 依次遍历headB, headB中第一个包含在set集合中的节点就是第一个公共子节点 ListNode getIntersectionNode(L…

WireShark

文章目录 IP协议部分协议对应协议号路由器IP分片IP分片的缺点 TCP协议[TCP MSS](https://blog.csdn.net/meihualing/article/details/113739693) UDP协议ARP ICMPDHCPDNSFTP wireshark可以学习网络协议,解决一些问题 IP协议 IP指网际互连协议,Internet P…

ROS节点通信Demo

0 开始之前 确保你已经安装了ROS (Robot Operating System)。 1 第一步: 创建一个ROS包 在开始编程前,我们首先创建一个新的ROS包(package)。移动到你的catkin workspace的 src 文件夹下,然后运行以下命令: cd ~/catkin_ws/sr…

Sentinel整合OpenFegin

之前学习了openFeign的使用&#xff0c;我是超链接 现在学习通过Sentinel来进行整合OpenFegin。 引入OpenFegin 我们需要在当前的8084项目中引入对应的依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sta…

Spring:表达式语言

Spring EL 概述使用概述 Spring 表达式(Spring EL) 是一种功能强大的表达式语言,以 #{ 表达式 } 作为定界符,用于在运行时对对象进行访问和操作。通过使用 Spring 表达式达到简化开发、减少逻辑或配置的编写的目的。 使用 Spring EL 主要可以引用 bean ,调用其属性和方…