学习Rust的第7天:参考资料

Hey Everyone, 大家好,

Today is references and borrowing. Immutable references allow reading data without ownership transfer, while mutable references enable modification, subject to rules ensuring exclusive access and preventing data races.
今天的内容是引用和借用。这是内存安全的基本概念。不可变引用允许阅读数据而不需要所有权转移,而可变引用允许修改,但要遵守确保独占访问和防止数据竞争的规则。

Referencing 引用

Yesterday we saw how passing an argument to a function does the same effect as assigning the value to another variable and effectively resulting in a loss of ownership. Well there’s a workaround to that.
昨天我们看到了如何将参数传递给一个函数与将值分配给另一个变量产生相同的效果,并有效地导致所有权的丧失。有一个解决办法。
If you know anything about C, pointers are an essential concept of C. Well references are similar.
如果你对C有所了解,那么 pointers 是C的一个基本概念。参考文献是相似的。

Lets take a look at the code and understand it:
让我们看看代码并理解它:

fn main(){
  let s1: String = String::from("Hello World");
  let length: usize = calculate_length(&s1); // & is used to pass in a reference to a string
  println!("The length of `{}` is {}" ,s1,length);
}

fn calculate_length(s: &String) -> usize {
  s.len()
 }

Rust references are pointers that allow borrowing and accessing data without transferring ownership, promoting memory safety and preventing data races.
Rust引用是指针,允许在不转移所有权的情况下借用和访问数据,促进内存安全并防止数据竞争。

Explanation: 说明:

  • fn main(): Entry point of the program.
    fn main() :程序的入口点。
  • let s1: String = String::from("Hello World");: Declares a String variable s1 with the value "Hello World".
    let s1: String = String::from("Hello World"); :声明一个值为“Hello World”的String变量 s1 。
  • let length: usize = calculate_length(&s1);: Calls the calculate_length function, passing a reference to the String s1.
    let length: usize = calculate_length(&s1); :调用 calculate_length 函数,传递对String s1 的引用。
  • fn calculate_length(s: &String) -> usize: Function that takes a reference to a String (&String) as a parameter and returns its length as a usize.
    fn calculate_length(s: &String) -> usize :函数接受对String( &String )的引用作为参数,并将其长度作为 usize 返回。
  • s.len(): Retrieves the length of the String referenced by s.
    s.len() :获取 s 引用的String的长度。
  • println!("The length of {} is {}" ,s1, length);: Prints the original String s1 and its length.
    println!("The length of {} is {}" ,s1, length); :打印原始字符串 s1 及其长度。

Key concept : 关键概念:

  • & is used to pass a reference to the String (&s1) rather than transferring ownership, preventing the String from being moved or cloned.
    & 用于传递对String( &s1 )的引用,而不是转移所有权,从而防止String被移动或克隆。
  • This borrowing allows the calculate_length function to operate on the String without taking ownership.
    这种借用允许 calculate_length 函数在不获取所有权的情况下对String进行操作。
  • References are immutable by default
    默认情况下,引用是不可变的

Credits to Let's Get Rusty for this amazing explanation on his YouTube channel.
感谢 Let's Get Rusty 在他的YouTube频道上的这一惊人的解释。

Mutable references 可变引用

What we saw above was an immutable reference, We cannot really change the value but we can read from it. Let’s take a look at mutable references
我们上面看到的是一个不可变的引用,我们不能真正改变值,但我们可以从中读取。让我们看看 mutable references

fn main() {
    let mut s1 = String::from("Hello");

    // Mutable reference passed to modify_string function
    modify_string(&mut s1);

    // The original string is now modified
    println!("Modified string: {}", s1);
}

fn modify_string(s: &mut String) {
    s.push_str(", World!"); // Modifying the string by appending
}

Explanation: 说明:

  • fn main(): Entry point of the program.
    fn main() :程序的入口点。
  • let mut s1 = String::from("Hello");: Declares a mutable String variable s1.
    let mut s1 = String::from("Hello"); :声明一个可变的String变量 s1 。
  • modify_string(&mut s1);: Calls the modify_string function, passing a mutable reference to s1.
    modify_string(&mut s1); :调用 modify_string 函数,传递一个可变引用给 s1 。
  • fn modify_string(s: &mut String): Function that takes a mutable reference to a String (&mut String) as a parameter.
    fn modify_string(s: &mut String) :将String( &mut String )的可变引用作为参数的函数。
  • s.push_str(", World!");: Modifies the String referenced by s by appending ", World!" to it.
    s.push_str(", World!"); :通过追加“,World!“对它。
  • println!("Modified string: {}", s1);: Prints the modified String.
    println!("Modified string: {}", s1); :打印修改后的String。

Key concept : 关键概念:

  • Mutable references can be passed using &mut variable_name.
    可变引用可以使用 &mut variable_name 传递。

Rules for mutable references
可变引用的规则

  • Only one mutable reference or multiple immutable references are allowed for a specific data piece.
    对于一个特定的数据块,只允许一个可变引用或多个不可变引用。
  • No other references to the same data are allowed while a mutable reference is active.
    当可变引用处于活动状态时,不允许对同一数据进行其他引用。
  • Mutable references are bound by their scope, preventing dangling references.
    可变引用由其作用域绑定,防止悬空引用。
  • Only one mutable reference can exist within a specific scope, ensuring coordinated modifications.
    在特定范围内只能存在一个可变引用,以确保协调的修改。

In simpler words only one mutable reference to a variable can exist in a particular scope.
简单地说,在一个特定的作用域中,只能存在一个对变量的可变引用。

Although there can be indefinite numbers of immutable references.
尽管不可变引用的数量可以是无限的。

BUT, Immutable and mutable references to the same variable can exist within the same scope.
但是,对同一变量的不可变和可变引用可以存在于同一范围内。

Example: 范例:

fn main(){
  let mut string1: String = String::from("Hello World");

  let reference1: &String = &string1;
  let reference2: &String = &string1;
  
  takes_ownership(reference1);
  takes_ownership(reference2);
  
  let _mut_ref: &mut String = &mut string1;
}

fn takes_ownership(_r1: &String){
}

This works just fine because reference1 and reference2 are already out of scope when we created _mut_ref.
这很好,因为当我们创建 _mut_ref 时, reference1 和 reference2 已经超出了范围。

//This code would result in an error
fn main(){
  let mut string1: String = String::from("Hello World");

  let reference1: &String = &string1;
  let reference2: &String = &string1;

  //because of this line
  let _mut_ref: &mut String = &mut string1;
  takes_ownership(reference1);
  takes_ownership(reference2);
  
}

fn takes_ownership(_r1: &String){
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

k8s控制器(五)_____DaemonSet

DaemonSet控制器 DaemonSet控制器是Kubernetes中的一种控制器,用于确保集群中的每个节点都运行一个Pod的副本。它通常用于在整个集群中部署一些系统级别的服务: 在每一个node节点运行一个存储服务,例如gluster,ceph。在每一个no…

Github copilot我用正版登录授权的,来体验一下吧

Github copilot 市面上的那种可以说是破解的,不是代码补全不稳定,就是chat不稳定,反正就是不怎样! 下面是官网正版开通的,欢迎体验15天 体验地址:https://www.bilibili.com/read/cv33696436 这种copilo…

半导体存储电路知识点总结

目录 一、SR锁存器 1.SR锁存器的概念 2.作用 二、电平触发器(Flip-Flop) 1.时钟信号 2.电平触发的触发器电路结构 3.带异步置位复位的电平触发器 三、边沿触发器 1.特点 2.两个D触发器组成的边沿触发D触发器 3.CMOS边沿触发D触发器的典型电路 …

钉钉对接T+生成总账凭证

客户介绍: 某餐饮连锁企业是一个专注于特色风味徽州菜的餐饮品牌,总部位于杭州市,其推出的各式特色徽菜深受市场的好评,在杭州本地的餐饮市场中有着很强的竞争力。公司ERP使用用友T系统,通过钉钉管理员工费用报销流程…

20240328-1-Prophet面试题

Prophet面试题 1. 简要介绍Prophet 常见的时间序列分解方法: 将时间序列分成季节项 S t S_t St​,趋势项 T t T_t Tt​,剩余项 R t R_t Rt​,即对所有的 t ≥ 0 t≥0 t≥0 y t S t T t R t y_{t}S_{t}T_{t}R_{t} yt​St​Tt…

janus部署

配置和运行janus 1. 配置nginx 安装nginx,主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…

【MySQL】20. 使用C语言链接

mysql connect mysql的基础,我们之前已经学过,后面我们只关心使用 要使用C语言连接mysql,需要使用mysql官网提供的库,大家可以去官网下载 我们使用C接口库来进行连接 要正确使用,我们需要做一些准备工作: …

Servlet的文件上传下载

Servlet的文件上传|下载 二、文件上传实现 2.1实现思路 需要使用到Commons-FileUpload组件需要将jsp页面form表单的enctype属性值设置为“multipart/form-data”&#xff0c;Servlet中使用IO流实现文件的上传 2.2、实现过程 2.2.1新建web项目导入jar包 <dependency>…

weblogic oracle数据源配置

在weblogic console中配置jdbc oracle数据源 1. base_domain->Service->DataSources 在Summary of JDBC Data Sources中&#xff0c;点击New, 选择【Generic Data Source】通用数据源。 2. 设置数据源Name和JNDI name 注&#xff1a;设置的JNDI Name是Java AP中连接…

数据可视化高级技术Echarts(桑基图入门)

目录 一、什么是桑基图 二、基本特征 三、设计注意事项 四、使用Echarts进行初级绘制 1.首先不能忘记五个基本步骤 2.绘制的时需要将图像类型series.type设定为sankey类型。 一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;&#xff0c;即桑基能量分流图&…

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM…

Grok-1.5 Vision:X AI发布突破性的多模态AI模型,超越GPT 4V

在人工智能领域&#xff0c;多模态模型的发展一直是科技巨头们竞争的焦点。 近日&#xff0c;马斯克旗下的X AI公司发布了其最新的多模态模型——Grok-1.5 Vision&#xff08;简称Grok-1.5V&#xff09;&#xff0c;这一模型在处理文本和视觉信息方面展现出了卓越的能力&#x…

Elasticsearch分布式搜索

实用篇-ES-环境搭建 ES是elasticsearch的简称。我在SpringBoot学习 数据层解决方案 的时候&#xff0c;写过一次ES笔记&#xff0c;可以结合一起看一下。 之前在SpringBoot里面写的相关ES笔记是基于Windows的&#xff0c;现在我们是基于docker容器来使用&#xff0c;需要你们提…

突破编程_前端_SVG(ellipse 椭圆形)

1 ellipse 元素的基本属性和用法 ellipse 元素用于创建椭圆形状。它具有一系列的基本属性&#xff0c;允许自定义椭圆的外观和位置。以下是一些 ellipse 元素的基本属性和用法&#xff1a; &#xff08;1&#xff09;基本属性 cx 和 cy&#xff1a;这两个属性定义了椭圆中心…

【CicadaPlayer】prepare和start的触发和异步处理

主线程可以直接用SuperMediaPlayer 但SuperMediaPlayer 的处理是异步的。实际上msgproc的目的在于异步处理外部请求 例如,启动后会先设置view,这个与播放流程无关,但是是必须要让播放器拥有的。用户点击prepare是直接调用SuperMediaPlayer的Prepare接口,才会触发url的设置 …

数据结构--栈,队列,串,广义表

3.栈 &#xff08;先进后出&#xff09; 栈是一种特殊的线性表&#xff0c;只能从一端插入或删除操作。 4.队列 4.1 4.1.1初始化 4.1.2判断队列是否为空 4.1.3判断队列是否为满 4.1.4入队 4.1.5出队 4.1.6打印队列 4.1.7销毁队列 5.串 5.1 串的定义 由零个或者任意多…

最新AI创作系统ChatGPT网站源码AI绘画,GPTs,AI换脸支持,GPT联网提问、DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

VMware安装Linux虚拟机(rocky9)

软件准备&#xff1a; VMware虚拟机ISO系统镜像文件 选择创建虚拟机→典型→下一步→点击稍后安装操作系统 选择Linux系统和对应版本 输入虚拟机名称和选择保存位置 设置磁盘大小 根据需要自定义硬件配置→完成 然后点击编辑虚拟机设置→CD/DVD→选择ISO镜像 然后开启虚拟机→…

vue2 二次封装element 组件,继承组件原属性,事件,插槽 示例

测试页面代码 这里主要记录如何封装element的el-input 并且封装后具有el-input原本的属性 事件 插槽 下面为测试页面即组件调用 <script> import CustomInput from /components/CustomInput.vue;export default {name: TestPage,components: { CustomInput },data() …

【洛谷 P4017】最大食物链计数 题解(深度优先搜索+动态规划+邻接表+记忆化搜索+剪枝)

最大食物链计数 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是重复数了几条或漏掉了几条。于是她来就来求助你&#xff0c;然而你也不会啊&#xff01;写一个程序来帮帮她吧。 题目描述 给你一个…