Rust中不可变变量与const有何区别?

Rust作者认为变量默认应该是immutable,即声明后不能被改变的变量。这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust的变量。

什么是变量?

如果你初次学习编程语言,变量会是一个比较抽象的概念。
以Rust语言来说,声明一个变量就是申请一块内存,内存的大小由变量的类型决定,类型我们会在后面的课程介绍。

let a = "abc";

我们使用let关键字声明一个变量a,同时把abc存放到变量里面。
此时,我们可以说变量中存储了abc,也可以说这块内存中存储了abc

具体怎么来理解呢?

image.png

内存就像这个鸡蛋收纳盒, 我们为每一个蛋格编码(这个编码就相当于内存地址)。声明一个变量a,相当于找到一个空格把它叫做a,同时把鸡蛋放到这个空格里面。我们可以把任何一个空格叫做a,它不过是为蛋格的编码起了一个别名。

下面这个图就描述了我们这段代码实际做的事情,把0xBA0F0140到0xBA0F0152这段内存叫做变量a,并且存储了字符串abc

image.png

let a = "abc";
a = "efg"; // X 此处报错

我们把在声明变量a时赋值了“abc”,就不能再修改这个变量了。这是Rust的一个语言特性,如果我们后续可能会修改变量a的内容,就需要在声明时添加上mut关键字,如下:

let mut a = "abc";
a = "efg"; // √

Rust引入mut关键字的有何优势?

  1. 不可变变量可以防止意外修改,从而避免数据竞争和内存错误。例如,如果一个变量是不可变的,则无法在多个线程中同时修改它,从而避免数据竞争。
  2. 不可变变量可以使代码更加简洁易读。例如,如果一个变量是不可变的,则可以明确地表明该变量的值在代码块内不会改变,从而使代码的逻辑更加清晰。
  3. 不可变变量可以帮助编译器进行优化。例如,如果一个变量是不可变的,则编译器可以知道该变量的值在代码块内不会改变,从而可以进行一些优化,例如消除不必要的计算。
  4. 不可变变量是函数式编程的重要概念。函数式编程鼓励使用不可变变量和纯函数,从而使代码更加易于理解和测试。

Rust中不可变变量与const有何区别?

const MAX_SIZE: usize = 100;

const 关键字用于定义常量。常量与不可变变量类似,但常量在编译期就确定了值,不能在运行时改变。不可变变量直到运行期来能确定下来。

常量具有以下优点:

  • 性能: 常量可以帮助编译器进行优化。
  • 可读性: 常量可以使代码更加易读。

如何销毁一个变量?

声明变量对应着申请内存,销毁变量也就是释放对应的内存。

Rust中释放内存有非常复杂的机制,主要分为两类:

  1. 释放栈内存,离开作用域即使放作用域内的变量。
  2. 释放堆内存,通常就是由智能指针来释放内存。也是模拟栈内存的释放模式,即在离开作用域时判断是否需要释放内存。

内存的释放是Rust的核心内容,涉及到所有权、借用、和生命周期以及智能指针。这些也是Rust的难点,劝退了众多想尝试Rust的开发者。后面我们会详细介绍这一部分。不过接下来我们需要先铺垫Rust基础内容,以后再探秘这些难点。

总结:

  • let关键字用于声明变量,此外它还用于模式匹配。
  • mut关键字用于声明可变变量。
  • const关键字用于声明常量。

更多关键词可以查看:
https://doc.rust-lang.org/reference/keywords.html
随着课程的展开我们会一一介绍这些关键词,不需要刻意记忆,使用的多了,就会形成肌肉记忆了。

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

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

相关文章

GPT-4对编程开发的支持

在编程开发领域,GPT-4凭借其强大的自然语言理解和代码生成能力,能够深刻理解开发者的意图,并基于这些需求提供精准的编程指导和解决方案。对于开发者来说,GPT-4能够在代码片段生成、算法思路设计、模块构建和原型实现等方面给予开…

javaweb学习day02(CSS)

一、CSS介绍 1 官方文档 CSS 指的是层叠样式表* (Cascading Style Sheets)地址: https://www.w3school.com.cn/css/index.asp离线文档: W3School 离线手册(2017.03.11 版).chm 2 为什么需要 CSS 在没有 CSS 之前,我们想要修改 HTML 元素的样式需要为每个 HTML …

【评论送书】AIGC重塑教育:AI大模型驱动的教育变革与实践

作者:刘文勇 来源:IT阅读排行榜 本文摘编自《AIGC重塑教育:AI大模型驱动的教育变革与实践》,机械工业出版社出版 这次,狼真的来了。 AI正迅猛地改变着我们的生活。根据高盛发布的一份报告,AI有可能取代…

原型模式-Prototype Pattern

原文地址:https://jaune162.blog/design-pattern/prototype-pattern/ 引言 在Java中如果我们想要拷贝一个对象应该怎么做?第一种方法是使用 getter和setter方法一个字段一个字段设置。或者使用 BeanUtils.copyProperties() 方法。这种方式不仅能实现相同类型之间对象的拷贝,…

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令(06h) 2. 写禁…

《区块链公链数据分析简易速速上手小册》第1章:区块链基础(2024 最新版)

文章目录 1.1 区块链技术概览:深入探究与实用案例1.1.1 区块链的核心概念1.1.2 重点案例:供应链管理1.1.3 拓展案例 1:数字身份验证1.1.4 拓展案例 2:智能合约在房地产交易中的应用 1.2 主流公链介绍1.2.1 公链的核心概念1.2.2 重…

【复现】大华 DSS SQL 注入漏洞_46

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 大华DSS是大华的大型监控管理应用平台,支持几乎所有涉及监控等方面的操作,支持多级跨平台联网等操作。 可…

人工智能学习与实训笔记(一):零基础理解神经网络

目录 一、什么是神经网络模型 二、机器学习的类型 2.1 监督学习 2.2 无监督学习 2.3 半监督学习 2.4 强化学习 三、网络模型结构基础 3.1 单层网络 ​编辑 3.2 多层网络 3.3 非线性多层网络 四、 回归问题实操:使用Python和NumPy实现波士顿房价预测任务 一…

深度学习基础之《TensorFlow框架(4)—Operation》

一、常见的OP 1、举例 类型实例标量运算add,sub,mul,div,exp,log,greater,less,equal向量运算concat,slice,splot,canstant,rank&am…

【汇总】解决IndexedDB报Failed to execute ‘transaction‘ on ‘IDBDatabase‘

问题发现 再学习HTML5中&#xff0c;有介绍到 Web 存储&#xff0c;当代码编写完成后&#xff0c;运行报错 Failed to execute ‘transaction’ on ‘IDBDatabase’: One of the specified object stores was not found. 示例代码如下&#xff1a; <!DOCTYPE html> <…

迷失在前端框架中的初级开发者,总觉得大厦要从二层开始建

知乎有人提问&#xff1a;现在是框架主导前端时代&#xff0c;还有必要学习Html&#xff0c;CSS和JavaScript吗&#xff1f;我看很愕然&#xff0c;框架可以节省力气&#xff0c;难道都可以替代前端基础了吗&#xff1f; 一、起因 因为贝格前端工场的主营业务就是前端开发&…

Linux桌面

系统信息的截图 登录界面右下角可以切换 Ubuntu on Wayland &#xff0c;虽然还是测试版&#xff0c;不过体验已经比之前的 Xorg 好多了&#xff0c;最笔记本上使用最影响体验的高分屏适配功能&#xff0c;在 wayland 中也是几乎完美支持的。 卸载 snap 这个 snap 是 Ubuntu …