rust 引用怎么用

news2025/2/4 17:47:41

本来好好的引用,被 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.coloradmin.cn/o/761802.html

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

相关文章

webGPT浏览器安装

edge点击“获取” https://microsoftedge.microsoft.com/addons/detail/wetab%E5%85%8D%E8%B4%B9chatgpt%E6%96%B0%E6%A0%87%E7%AD%BE%E9%A1%B5/bpelnogcookhocnaokfpoeinibimbeff?utm_sourceSteamDB # 其他浏览器安装教程如下: https://www.wetab.link/

springcloud gateway 介绍与使用

定义 该项目提供了一个用于在 Spring WebFlux 之上构建 API 网关的库。Spring Cloud Gateway 旨在提供一种简单而有效的方法来路由到 API,并为它们提供横切关注点,例如:安全性、监控/指标和弹性 特征 Spring Cloud Gateway 特性:…

Smartbi 身份认证绕过漏洞

0x00 简介 Smartbi是广州思迈特软件有限公司旗下的商业智能BI和数据分析产品,致力于为企业客户提供一站式商业智能解决方案。 0x01 漏洞概述 Smartbi在安装时会内置三个用户(public、service、system),在使用特定接口时&#x…

只会用插件可不行,这些前端动画技术同样值得收藏-JavaScript篇(上)

目录 前言 settimeout/setinterval requestAnimationFrame 基本用法 时间戳参数 帧数与时间戳计算 自动暂停 JS中的贝塞尔曲线 概念 公式 二次贝塞尔 三次贝塞尔 N次贝塞尔 贝塞尔曲线动画 动画类 在动画中使用贝塞尔 总结 相关代码: 贝塞尔曲线相…

【深度学习】:《PyTorch入门到项目实战》(十五):三大经典卷积神经网络架构:LeNet、AlexNet、VGG

【深度学习】:《PyTorch入门到项目实战》(十五):三大经典卷积神经网络架构:LeNet、AlexNet、VGG(代码实现及实际案例比较) ✨本文收录于【深度学习】:《PyTorch入门到项目实战》专栏,此专栏主要…

数据结构与算法——顺序表的基本操作(C语言详解版)

顺序表插入元素 向已有顺序表中插入数据元素,根据插入位置的不同,可分为以下 3 种情况: 插入到顺序表的表头;在表的中间位置插入元素;尾随顺序表中已有元素,作为顺序表中的最后一个元素; 虽然…

GaussDB OLTP 云数据库配套工具DAS

目录 一 、前言 二、DAS的定义 1、DAS的定义 2、DAS功能特点 三、DAS应用场景 1、标准版 2、企业版 四、操作示例(标准版) 1、登录华为控制台登录,输入账号密码 2、新增数据库实例链接 3、新建对象 4、SQL操作 5、导入导出 五、…

OC多态性浅析

OC多态性浅析 小实验 假设有以下两个类classA与class B的声明与实现&#xff1a; /// classA.h#ifndef classA_h #define classA_h#import <Foundation/Foundation.h>interface classA : NSObject-(void) printVar;end#endif /* classA_h *//// classB.h#ifndef class…

微信小程序事件点击跳转页面的五种方法

第一种:标签 这是最常见的一种跳转方式,相当于html里的a标签 <navigator url"/pages/main/main"></navigator>第二种:wx.navigateTo({})方法 1.前端wxml <button bindtap"getCeshi" type"primary"> 测试按钮 </button>…

基于SpringBoot+vue的外卖点餐系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【Android知识笔记】应用进程(二)

Service的启动原理 向AMS发送startService请求 startService时会首先拿到AMS的Binder代理对象,向AMS发起startService请求: AMS处理startService请求 接下来看AMS端处理应用的startService请求: 回忆一下应用进程启动流程: 接下来看如果Service所在应用进程没有启动的情…

GitLab 私有 Go Modules 的搭建配置

配置步骤 配置 GitLab Access Token 将 GitLab Access Token 写入到 ~/.netrc 文件里(也就是根目录下的 .netrc 文件),没有则新建,并写入内容:machine git.tenorshare.cn login ${USER_NAME} password ${GITLAB_ACCESS_TOKEN},其中 ${USER_NAME} 是GitLab 用户名,${GIT…

K8S的部署项目流程

步骤 &#xff08;1&#xff09;条件准备 &#xff08;2&#xff09;制作镜像 &#xff08;3&#xff09;docker启动程序 &#xff08;4&#xff09;启动制作好的镜像&#xff0c;看是否可以访问 &#xff08;5&#xff09;上传镜像到镜像容器中&#xff08;如&#xff1a;阿里…

Hive最全总结,学习与面试,看这一篇就行了!

废话不多说,上题: 1.Hadoop中两个⼤表实现join的操作,简单描述。 (1)Hive中可以通过分区来减少数据量;(2)还可以通过优化HQL语句,⽐如只查询需要的字段,尽量避免全表、全字段查询; 2.Hive中存放是什么? 表。存的是和hdfs的映射关系,hive是逻辑上的数据仓库,…

使用docker安装portainer

portainer是一个非常好用的docker可视化工具&#xff0c;这篇文章就介绍一下怎么使用docker来安装portainer。 第一步&#xff1a;在docker仓库查找portainer的版本 docker search portainer 我们可以看到&#xff0c;第一个portainer/portainer的描述中说了&#xff0c;这个仓…

【数据架构实践】Netflix 万亿级实时数据基础架构的四个创新阶段

Netflix 是一个很棒的地方&#xff0c;周围有许多了不起的同事。我为参与将共同信念变为现实的旅程中的每个人感到无比自豪。我想花点时间分享一下团队的主要成就&#xff1a; 我们在 Netflix 的所有组织中将流数据用例从 0 增加到 2000 多个。我们构建和发展了成功的产品&…

【Spring框架】getBean的更多用法

目录 用法1&#xff1a;根据名称获取Bean对象用法2&#xff1a;根据类型获取Bean对象用法3&#xff1a;根据名称类型来获取Bean对象 用法1&#xff1a;根据名称获取Bean对象 UserService userService (UserService)context.getBean("user");用法2&#xff1a;根据类…

如何利用量比和换手率?

1 量比 有人说&#xff0c;量比指标是盘口语言的翻译器&#xff0c;堪称股市风向标&#xff01;这一说法究竟从何而来&#xff0c;量比大小到底意味着什么呢&#xff1f; 量比是衡量相对成交量的指标。它是指股市开市后平均每分钟的成交量与过去5个交易日平均每分钟成交量之比…

【高并发网络通信架构】4.高效事件驱动模型:Reactor 模型

目录 一&#xff0c;往期文章 二&#xff0c;基本概念 1.前言 2.基本框架 3.核心特征 4.工作流程 5.用“网络通信”来理解 Reactor 模型 三&#xff0c;代码实现 1.使用 epoll 进行多路复用实现 Reactor 模式的操作流程 2.Reactor 模式实现代码&#xff08;参考&…

【SQL】Your password has expired. To log in you must change it.......

在配置SQL的编辑器的时候&#xff0c;连接过程出现了如下的错误&#xff1a; Your password has expired. To log in you must change it using a client that supports expired passwords.当连接到 SQL 时&#xff0c;如果出现 “Your password has expired. To log in you m…