rust 引用怎么用

news/2024/10/18 14:16:47/

本来好好的引用,被 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 禁止了这样的动作。

在这里插入图片描述
这样的编译结果让人无法理解,which does not implement the Copy trait。所以,针对字符串类型,不能对它取地址吗?删除给变量 s3 的赋值,直接打印输出 s2 的值,程序可以正常输出的。侧面说明,真正需要 Copy 特性的是赋值过程。

结合错误提示,我们可以看出 *s2 并不会导致原始值发生转移,但我们还需要更加直观的证据来证明这一点。更进一步,只要是引用就不会触发所有权转移吗?

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

http://www.ppmy.cn/news/950443.html

相关文章

前端处理后端传来的Long型数据精度丢失的问题--对象转换器Jackson0bjectMapper

前端处理后端的Long型数据精度丢失的问题 1、问题描述 前端提交参数 {id: "1681224986113204200", status: 0}后端处理 /*** 根据员工id修改员工账号** param employee* return*/PutMapping()public R<String> status(HttpServletRequest request, RequestB…

【JavaScript 03】语句 变量 变量提升 标识符 注释 区块 作用域 条件语句 循环语句 break continue 标签

CSS 语句变量变量提升标识符注释区块条件语句ifif...elseswitch三元运算符 ?: 循环语句whilefordo...whilebreak语句 and continue语句标签 语句 JS程序的执行单位是行&#xff08;line&#xff09; **语句&#xff08;statement&#xff09;**是为了完成特定任务而进行的操…

PMP证书怎么考?来自前辈的经验之谈

虽然我成功通过了 PMP 考试&#xff0c;这是我第一季度所做的事情的成果&#xff0c;但是考试的兴奋感很快就过去了。在交流群里&#xff0c;大家都在讨论证书的存续条件以及获得证书后带来的实质性收益&#xff0c;例如补贴、城市定居加分和职业晋升等。与这些相比&#xff0c…

InstructGPT:chatGPT的姊妹模型

1.简介 本文根据2022年《Training language models to follow instructions with human feedback》翻译总结的&#xff0c;文中提出了InstructGPT&#xff0c;从文章标题也可以看出来训练模型采用了人类指导反馈的数据。 因为chatGPT说是InstructGPT的姊妹模型&#xff0c;所…

【ChatGPT】ChatGPT的核心算法原理图文解析、大模型训练过程和数据集来源

目录 ChatGPT的核心算法、模型和数据来源 一、引言:ChatGPT的概述与背景

ChatGPT的模型介绍及GO语言实现API

ChatGPT除了大家熟悉的GPT3之外&#xff0c;还有其他辅助模型&#xff0c;比如处理代码的以及有害信息过滤的系统。总的来说是下面三个组成&#xff1a; GPT-3&#xff1a;一组能够理解和生成自然语言的模型 CodexLimited beta&#xff1a;一组可以理解和生成代码的模型&#x…

超越ChatGPT:大模型的智能极限

在此前《大型语言模型的涌现能力》、《ChatGPT进化的秘密》两篇文章中&#xff0c;符尧剖析了大型语言模型的突现能力和潜在优势&#xff0c;大模型所带来的“潜在的”范式转变&#xff0c;并拆解了ChatGPT演进的技术路线图。 在本文中&#xff0c;作者以终为始分析了大模型的智…

ChatGPT基础知识系列之模型介绍

ChatGPT基础知识系列之模型介绍 前面我们已经介绍很多ChatGPT的使用案例了,更多案例可以参考我们下面的文章 ChatGPT使用案例之写代码 ChatGPT使用案例之画思维导图 ChatGPT使用案例之自然语言处理 ChatGPT使用案例之操作Excel ChatGPT使用案例之图像生成 ChatGPT使用案…