聊聊 Rust 变量,你学会了吗?

news2025/2/28 6:21:16

Rust 是一门强调安全、并发、高效的系统编程语言。无 GC 实现内存安全机制、无数据竞争的并发机制、无运行时开销的抽象机制,是 Rust 独特的优越特性。 它声称解决了传统 C 语言和 C++语言几十年来饱受责难的内存安全问题,同时还保持了很高的运行效率、很深的底层控制、很广的应用范围, 在系统编程领域具有强劲的竞争力和广阔的应用前景。

在 Rust 笔记(三)中,讲了复核类型,本文就认识一下 Rust 中的变量。

可变 & 不可变

Rust 默认支持类型推导,在编译器能够推导类型的情况下,变量类型一般可以省略,但常量(const)和静态变量(static)必须声明类型。

图片

let a: &str = "一个不可变变量";
const B: &str = "一个常量";
static C: &str = "一个静态变量";

变量默认是不可变的。如果需要让变量具有可变性,必须为变量添加 mut 关键字。默认变量不可变是一个很重要的特性,它符合最小权限原则(Principle of Least Privilege),有助于我们写出健壮且正确的代码。当你使用 mut 却没有修改变量,Rust 编译期会友好地报警,提示你移除不必要的 mut。

let mut x = 10; // 声明一个可变的整型变量
x = 20; // 可以修改 x 的值

当使用 mut 关键字声明一个引用时,该引用就可以被修改所指向的变量,例如:

let mut s = String::from("hello");
let r = &mut s; // 声明一个可变的字符串引用
r.push_str(" world!"); // 可以修改 s 的值

在其他大多数语言中,要么只支持申明可变的变量,要么只支持申明不可变的变量,但是 Rust 就不一样了,两者我都要,既要灵活性又要安全性。还有一个很大的优点,那就是运行性能上的提升,因为将本身无需改变的变量声明为不可变在运行期会避免一些多余的 runtime 检查。

选择可变还是不可变,更多的还是取决于你的使用场景,

  • 不可变: 有安全性,但是丧失了灵活性和性能
  • 可变变量:最大的好处就是使用上的灵活性和性能上的提升

使用下划线开头忽略未使用的变量

在 Rust 中创建了一个变量却不在任何地方使用它,Rust 会给你一个警告,因为这可能会是个 BUG。

图片

但是有时创建一个不会被使用的变量是有用的,比如你正在设计原型或刚刚开始一个项目。这时你希望告诉 Rust 不要警告未使用的变量,为此可以用下划线作为变量名的开头:

图片

变量绑定

在其他语言中,比如 JS,我们使用 var a = "Hello World"。意思是将 "Hello World" 赋值给变量 a。在 Rust 中,let a = "Hello World",意思和 JS 中一样,但是这个过程起了有一个名字:变量绑定。

其实本质上是一回事,赋值 === 绑定,但是 Rust 存在“所有权”这一特性,所以绑定的含义更清晰准确。绑定就是把这个对象绑定给一个变量,让这个变量成为它的主人。

变量解构 & 解构赋值

let 表达式不仅仅用于变量的绑定,还能进行复杂变量的解构:从一个相对复杂的变量中,匹配出该变量的一部分内容:

let (a, mut b): (bool, bool) = (true, false);
// a = true,不可变; b = false,可变
println!("a = {:?}, b = {:?}", a, b);

也可以进行变量的解构赋值:

let (a, b, c, d, e);
(a, b) = (1, 2);

变量遮蔽

Rust 允许对申明的变量再次声明,也就是允许申明相同的变量,后面的变量就会遮蔽前端的变量。

let x: i32 = 1;
let x: i32 = 2;
let x: i32 = x +1;
println!("x: {}", x);

这和 mut 变量的使用是不同的,第二个 let 生成了完全不同的新变量,两个变量只是恰好拥有同样的名称,涉及一次内存对象的再分配 ,而 mut 声明的变量,可以修改同一个内存地址上的值,并不会发生内存对象的再分配,性能要更好。

变量命名

在命名方面,和其它语言没有区别,不过当给变量命名时,需要遵循 Rust 命名规范。详情可看RFC 430

  • type-level 的构造 Rust 倾向于使用驼峰命名法,value-level 的构造使用蛇形命名法。
  • 特殊命名:名称应该使用动词,而不是形容词或者名词。
  • 类型转换要遵守 as_,to_,into_ 命名惯例(C-CONV)。
  • 读访问器(Getter)的名称遵循 Rust 的命名规范(C-GETTER)。
  • 一个集合上的方法,如果返回迭代器,需遵循命名规则:iter,iter_mut,into_iter (C-ITER)。
  • 迭代器的类型应该与产生它的方法名相匹配(C-ITER-TY)。
  • Cargo Feature 的名称不应该包含占位词(C-FEATURE)。
  • 命名要使用一致性的词序(C-WORD-ORDER)

变量和常量之间的差异

有变量就有常量。常量也是绑定到一个常量名且不允许更改的值,但是常量和变量之间存在一些差异:

  • 常量不允许使用 mut。常量不仅仅默认不可变,而且自始至终不可变,因为常量在编译完成后,已经确定它的值。
  • 常量使用 const 关键字而不是 let 关键字来声明,并且值的类型必须标注。
let a: &str = "一个不可变变量";
const B: &str = "一个常量";

常量可以在任意作用域内声明(包括全局作用域),在声明的作用域内,常量在运行的整个过程中都有效。对于需要在多处代码共享一个不可变的值时非常有用。

参考

  • Rust语法-mut关键词 - 知乎
  • 03|初窥门径:从你的第一个Rust程序开始!-极客时间
  • Rust 函数 | 菜鸟教程
  • rust的数据结构(入门篇) - 知乎
  • 命名规范 - Rust语言圣经(Rust Course)

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

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

相关文章

第4天:基础入门-30余种加密编码进制amp;Webamp;数据库amp;系统amp;代码amp;参数值

第4天:基础入门-30余种加密编码进制&Web&数据库&系统&代码&参数值 一、知识点 1. 存储密码加密-Web&数据库&系统2. 传输数据编码-各类组合传输参数值3. 代码特性加密-JS&PHP&NET&JAVA4. 数据显示编码-字符串数据显示编码二…

资源限流 + 本地分布式多重锁——高并发性能挡板,隔绝无效流量请求

前言 在高并发分布式下,我们往往采用分布式锁去维护一个同步互斥的业务需求,但是大家细想一下,在一些高TPS的业务场景下,让这些请求全部卡在获取分布式锁,这会造成什么问题? 瞬时高并发压垮系统 众所周知…

C#开发的OpenRA游戏之选择建筑物显示状态信息

C#开发的OpenRA游戏之选择建筑物显示状态信息 前面已经分析了金钱系统,有了钱之后,就可以放任地建造万物了。 在建造的过程中,当你选择建筑物时,就可以看到当前建筑物的健康信息和制造当前物品的进度,如下图所示: 从上图可以看到最上面的进度条是这个建筑物的健康程度,…

Java 代码读取自定义的配置文件里面的东西

目录 1 问题2 实现 1 问题 Java 代码读取自定义的配置文件里面的东西,在代码里面进行使用。 也就是随便一个配置文件,如何在代码里面进行读取 2 实现 将配置文件,随便起一个名字,将这个配置文件写到 resource 这个目录下&#…

Java调用HTTPS接口,绕过SSL认证

1:说明 网络编程中,HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议,跟http相比更安全,因为他加上了SSL/TLS协议来加密通信内容。 Java调…

主播直播美颜SDK:性能优化策略

当下,主播直播美颜SDK成为了越来越多主播的利器。这些SDK可以实时美化主播的外貌,提高视觉吸引力,但同时也需要处理大量的图像数据。因此,性能优化成为了不可或缺的一环。本文将探讨主播直播美颜SDK的性能优化策略,以确…

【word技巧】word文档如何转换为ppt文件?

大家是否会遇到需要将word文档转换为ppt文件的情况?除了反反复复粘贴复制以外,还有其他方法可以转换文件格式,今天给大家分享word转换ppt方法。 首先我们先将word文件打开大纲模式 然后我们将文中的大标题设置为1级标题,副标题设…

【C++初阶】——初始化列表static成员友元内部类匿名对象

个人主页点击直达:小白不是程序媛 C系列专栏:C头疼记 代码仓库:Gitee 目录 前言 再谈构造函数 初始化列表 explicit关键字 匿名对象 static成员 友元 友元函数 友元类 内部类 再次理解类和对象 前言 前几篇文章我们对于分别对C类…

未来的无人驾驶时代会对我们带来哪些影响?

未来的无人驾驶时代:无人驾驶技术发展现状、未来趋势以及迈入无人驾驶时代后会给我们带来哪些积极影响 过去,说起无人驾驶汽车,就像是科幻小说中的情节。但时至今日,这种情况已经改观:谷歌、特斯拉、福特等多家大型公…

docker打包container成image,然后将image上传到docker hub

第一步&#xff1a;停止正在运行的容器 docker stop <container_name> eg: docker stop xuanjie_mlir 第二步&#xff1a;将对应的container打包成image docker commit <container_id> <镜像名&#xff1a;版本> eg&#xff1a;docker commit 005672e6d97a…

开放式耳机能保护听力吗,开放式耳机跟骨传导耳机哪个更好?

如果从严格意义上来讲的话&#xff0c;开放式耳机中的骨传导耳机是能保护听力&#xff0c;现如今的开放式耳机是一个统称&#xff0c;将所有不入耳的类目全部规划到一块。因此在开放式耳机中存在着一些耳机是只能够保持周边环境音&#xff0c;而不是保护听力的。 下面让我来给…

基于单片机设计的电子柜锁

一、前言 随着现代社会的不断发展&#xff0c;电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处&#xff0c;例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。 该电子柜锁系统通过电磁锁作为柜锁的开关&…

esp32 WiFi连接失败后,可打印错误码分析连接失败的原因

esp32 WiFi连接失败后,可打印错误码分析连接失败的原因; 在事件中添加红色选框中的代码: WiFi连接失败错误码如下所示: REASON_UNSPECIFIED = 1,REASON_AUTH_EXPIRE = 2,REASON_AUTH_LEAVE = 3,REASON_ASSOC_EXPIRE …

基于uniapp与uview做一个按拼音首字母排序的通讯录页面

效果图&#xff1a; 第一步导入pinyin库并应用&#xff0c;用于区分汉字的拼音首字母 npm i pinyin import pinyin from "pinyin" 完整算法&#xff1a; function getListByPinyinFirstLetter(data) {const newList {};for (const item of data) {let firstLett…

AI全栈大模型工程师(十四)数据连接封装

文章目录 二、数据连接封装2.1 文档加载器:Document Loaders2.2 文档处理器2.3 文档向量化:Text Embeddings2.4 向量的存储(与索引):Vectorstores2.5 向量检索:Retrievers后记二、数据连接封装 2.1 文档加载器:Document Loaders !pip install pypdffrom langchain.docu…

MICCAI2023论文多模态论文速读-1

文章目录 1.Attentive Deep Canonical Correlation Analysis for Diagnosing Alzheimer’s Disease Using Multimodal Imaging Genetics2.Bidirectional Mapping with Contrastive Learning on Multimodal Neuroimaging Data3.CoLa-Diff: Conditional Latent Diffusion Model f…

ruoyi系统改造

前端启动报错&#xff1a;Error: error:0308010C:digital envelope routines::unsupported 修改ruoyi-ui/package.json&#xff0c;添加export NODE_OPTIONS–openssl-legacy-provider && "scripts": {"dev": "export NODE_OPTIONS--openssl…

C#Onnx模型信息查看工具

效果 Netron效果 项目 代码 using Microsoft.ML.OnnxRuntime; using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string…

性能测试怎么入门?一文7个知识点带你成功入门

一、相关概念 1、性能测试相关&#xff1a;负载测试&#xff0c;性能测试&#xff0c;压力测试&#xff0c;稳定性测试&#xff0c;全链路测试等 2、性能指标&#xff1a;吞吐率&#xff0c;tps&#xff0c;并发用户数&#xff0c;吞吐量&#xff0c;响应时间等 二、性能测试…

colly库的爬虫程序

使用colly库的爬虫程序&#xff0c;该程序将使用Go语言爬取内容。 package main ​ import ("fmt""log" ​"github.com/gocolly/colly" ) ​ func main() {// 创建一个Colly爬虫实例c : colly.NewCrawler() ​// 设置服务器c.OnRequest(func(r …