Rust 变量基础知识

news/2024/9/19 10:14:05/ 标签: rust, 开发语言, 后端

文章目录

  • 发现宝藏
  • 一、 Rust变量与可变性
  • 二、变量与常量
  • 三、变量隐藏(shadowing)

发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【宝藏入口】。

一、 Rust变量与可变性

在 Rust 编程语言中,变量的可变性质是理解 Rust 关键特性的核心之一。Rust 是一种强调安全和并发的语言,其变量系统设计旨在提供最大程度的内存安全性,同时允许程序员高效地控制资源。

1. 不可变变量

Rust 中的变量默认是不可变的。这意味着一旦你为一个变量绑定了一个值,你就不能再改变它。例如:

rust">let x = 5;

在这个例子中,x 的值是 5,且你不能再给 x 赋予其他值。如果尝试修改它,例如:

rust">x = 10;  // 这是一个编译错误

编译器会报错,因为 Rust 强调不可变性能提高代码的可靠性和减少错误。

2.可变变量

如果需要改变变量的值,Rust 提供了一个机制来显式声明变量为可变。通过在 let 绑定前加上 mut 关键字,可以创建一个可变变量。例如:

rust">let mut y = 10;
y = 20;  // 这是合法的

这里,y 的初始值是 10,但之后被重新赋值为 20。这个 mut 关键字明确表示 y 的值可以改变,从而允许在程序运行时修改它的值。

3.不可变性与多线程

Rust 的不可变性不仅有助于单线程代码的稳定性,还能增强多线程编程的安全性。不可变变量可以被多个线程安全地共享,因为不会有线程修改其值。这减少了数据竞争的风险,是 Rust 的所有权和借用系统的核心部分。

二、变量与常量

在 Rust 编程语言中,变量和常量是存储数据的两种方式,它们在不可变性和使用方式上有明显区别。了解这些区别对于写出清晰且高效的 Rust 代码至关重要。以下是关于 Rust 中常量(const)的一些关键点:

1. 常量 (constant) 的特点

  • 不可变性

    常量在定义后其值是不可变的。与不可变变量类似,常量一旦绑定了值,就不能再改变。常量不能使用 mut 关键字,因为它们永远都是不可变的。

  • 声明方式

    常量使用 const 关键字进行声明,并且必须显式指定类型。例如:

    rust">const MAX_POINTS: u32 = 100_000;
    

    这里 MAX_POINTS 是一个常量,其值为 100,000,并且类型为 u32

  • 作用域

    常量可以在任何作用域中声明,包括全局作用域。它们的作用范围不限于定义所在的代码块。

  • 绑定到常量表达式

    常量只能绑定到常量表达式,而不能绑定到函数的返回值或需要在运行时才能计算出的值。例如:

    rust">const PI: f64 = 3.141592653589793;
    

    PI 绑定到一个常量表达式。常量表达式是在编译时就能确定的值。

  • 命名规范

    Rust 约定常量使用全大写字母,并用下划线分隔每个单词,例如:MAX_POINTS。这种命名规范有助于区分常量和变量。

  • 示例代码

rust">// 定义常量
const MAX_POINTS: u32 = 100_000;
const PI: f64 = 3.141592653589793;fn main() {// 使用常量println!("Max points: {}", MAX_POINTS);println!("Value of PI: {}", PI);
}

在上面的示例中,MAX_POINTSPI 是常量,其值在程序编译时就已确定,并在整个作用域内保持不变。常量的这种特性使得它们非常适合用于定义那些不会改变的固定值,例如数学常数、配置参数等。

理解常量的这些特性和使用规范,有助于在 Rust 中编写清晰且可靠的代码,确保数据的稳定性和一致性。

三、变量隐藏(shadowing)

在 Rust 编程语言中,变量隐藏(shadowing)是一种非常有用的特性,它允许使用相同的名字声明新的变量,从而“隐藏”之前的同名变量。这种机制与变量的可变性(通过 mut 关键字)是不同的,并且在代码中具有独特的作用。

1. 什么是变量隐藏(Shadowing)

在 Rust 中,变量隐藏(shadowing)指的是重新声明一个与之前变量同名的新变量。这个新变量会遮盖(或隐藏)之前声明的同名变量。在后续代码中,使用的将是新的变量,而不是之前的变量。

2. Shadowing 的特点

  • 重新声明

    变量隐藏通过使用 let 关键字重新声明一个与之前变量同名的变量来实现。例如:

    rust">let x = 5;
    let x = x + 1;
    

    在这个例子中,第一次声明的 x 的值是 5。第二次使用 let 重新声明 x,新的 x 将是之前 x 的值加 1,即 6。这样,新的 x 隐藏了之前的 x

  • 作用域

    变量隐藏的作用范围仅限于重新声明后的代码块。也就是说,新的变量在其声明后的代码中有效,而之前的变量在这段代码中变得不可见。

  • 不可变性

    使用变量隐藏声明的新变量是不可变的,除非在新变量的声明中明确使用 mut 关键字。例如:

    rust">let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("The value of x is: {}", x);  // 输出 12
    

    在这个例子中,x 的值依次变为 6 和 12,新的 x 隐藏了之前的 x

  • mut 的不同

    变量隐藏与将变量标记为 mut(可变)是不同的。如果你标记一个变量为 mut,你可以修改这个变量的值,而变量隐藏则是通过声明新的同名变量来实现值的改变,而不是修改原有变量的值。例如:

    rust">let mut x = 5;
    x = x + 1;  // 修改原有变量的值
    

    在上面的代码中,x 是可变的,可以通过直接赋值来修改其值。

  • 示例代码

下面的代码演示了变量隐藏的基本用法:

rust">fn main() {let x = 5;println!("The value of x is: {}", x); // 输出 5let x = x + 1;println!("The value of x after shadowing is: {}", x); // 输出 6let x = x * 2;println!("The value of x after another shadowing is: {}", x); // 输出 12
}

在这个例子中,第一次打印显示 x 的值为 5。第二次打印显示新的 x 的值为 6,第三次打印显示新的 x 的值为 12。每次使用 let 关键字重新声明 x 时,新的 x 隐藏了之前的 x

  • 变量隐藏的使用场景

    • 简化代码:变量隐藏可以帮助你在需要的地方简化代码。特别是在处理复杂的计算或临时变量时,使用隐藏可以让代码更清晰。
    • 避免不必要的 mut:通过使用变量隐藏,可以避免使用 mut 关键字,从而保持不可变性的优点,确保代码的可靠性。

变量隐藏(shadowing)是 Rust 提供的一个强大功能,它允许使用相同的名字声明新的变量,并通过新的值隐藏之前的变量。这种机制不仅帮助简化代码,也与变量的可变性(mut)机制有所区别,使得 Rust 编程更加灵活和强大。理解和掌握变量隐藏的用法,可以提高你的代码质量,并让你的程序更加健壮。


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

相关文章

Zabbix自定义监控项与触发器

当我们需要获取某台主机上的数据时,直接利用 zabbix 提供的模板可以很方便的获得需要的数据,但是有些特别的数据,利用这些现有的模板或监控项是无法实现的,例如网站状态信息的监控、mysql数据库主从状态等信息。这是就需要自己定义键值和监控…

【玩转贪心算法专题】406. 根据身高重建队列【中等】

【玩转贪心算法专题】406. 根据身高重建队列【中等】 1、力扣链接 https://leetcode.cn/problems/queue-reconstruction-by-height/ 2、题目描述 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。…

反激电路的参数设计,基于TI-UC3843芯片,Simplis仿真验证

采用TI官方提供的UC3843芯片手册给的DEMO图,通过MATHCAD计算参数得出环路补偿的各项参数,最后使用simplis进行仿真验证,一起进行学习吧。 UCx84x 电流模式 PWM 控制器 datasheet (Rev. G) (semiee.com) UCx84x 系列控制集成电路提供了实现离…

HCIP--<OSPF2>

目录 一,OSPF的不规则区域 1)远离骨干区域的非骨干区域 2)不连续骨干区域(和上面一样) 二,OSPF数据库表 三。优化OSPF的LSA(缺少LSA的更新量) [1]手工汇总:减少骨干区域的LSA [2]特殊区域&…

零基础小白能学网络安全吗?

最近看到很多朋友都在问“零基础能学网络安全吗?” 今天整一篇帮大家分析一下,希望对你有帮助。 首先,问出这个问题的朋友,我大致判断一下,你对网络安全并不了解,只是单纯看到某个视频某篇文章&#xff0…

React第四章(babel)

Babel 什么是Babel? Babel 是一个 JavaScript 编译器,提供了JavaScript的编译过程,能够将源代码转换为目标代码。 AST -> Transform -> Generate 官网 https://babeljs.io/ 查看AST https://astexplorer.net/ Babel所有的包 https://babeljs.io/docs/ba…

Spring Boot事务管理

事务管理 事务进阶 如果在删除了部门之后,出现了异常。那么就会出现部门被删除之后其中的员工并未被删除。 Transactional注解,在事务执行完成之后自动提交或者回滚。只需要在执行多次数据修改的事务上加上该注解即可。(比如两次Update或者…

[hadoop全分布部署]安装Hadoop、配置Hadoop 配置文件②_core-site

hadoop.tmp.dir file:/opt/module/hadoop/tmp ![564f66a5de794bb2a022a0bd193eecbd.png](https://img-blog.csdnimg.cn/564f66a5de794bb2a022a0bd193eecbd.png)****注:I********P********地址是master的****### ******二、配置 mapred-site.xml********&#xff08…

828华为云征文 | 云上私人数据管家,jMalCloud个人网盘在华为云Flexus的Docker化部署实践

华为云服务器Flexus X实例介绍 华为云Flexus云服务器X实例,是由国家科技进步奖获得者、华为公司Fellow、华为云首席架构师顾炯炯牵头研发。它基于擎天QingTian架构、瑶光云脑、盘古大模型等根技术创新,是业界首款应用驱动的柔性算力云服务器,…

Java中的内存模型与并发编程优化

Java中的内存模型与并发编程优化 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在Java开发中,内存模型和并发编程优化是提高应用性能和稳定性的关键。Java内存模型(Java Me…

ALIENTEK电容按键按键的介绍与驱动代码

目录 前言 电容触摸按键原理 硬件接线 检测电容触摸按键过程 驱动代码 tpad.h tpad.c main.c 按键扫描函数 前言 我没有独立的电容触摸按键模块,所以使用正点原子STM32F103ZET6精英版开发板上的电容触摸按键。采用STM32F103C8T6检测电容触摸按键&#…

grep和zgrep命令的简单使用-可以查看日志内容

在 Linux 系统中,grep 和 zgrep 是两个非常有用的文本搜索工具,它们用于搜索文件中的文本模式: grep grep 是一个强大的文本搜索工具,用于搜索文件中匹配特定模式的行。它的基本语法如下: grep [选项] 模式 文件名基…

在LEMP服务器上安装phpMyAdmin的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 关于 phpMyAdmin phpMyAdmin 是一个免费的软件,用于在 web 上操作 MySQL,它为 MySQL 的功能提供了一个方便的可…

源代码保密:探索沙箱环境加密的优势

在数字化时代,源代码保密对于企业而言至关重要,它不仅关系到企业的核心竞争力,还涉及到知识产权的保护和商业利益的安全。深信达的沙箱防泄密软件(SDC沙盒)为源代码保密提供了一种有效的解决方案。以下是结合深信达沙箱…

Apache SeaTunnel基础介绍

一、什么是Apache SeaTunnel? Apache SeaTunnel(最初名为Waterdrop)是一个开源的分布式数据集成平台,专为大规模数据处理设计。SeaTunnel可以从多种数据源读取数据,进行实时流式处理或批处理,然后将处理后…

opencv之Canny边缘检测

文章目录 前言1.应用高斯滤波去除图像噪声2.计算梯度3.非极大值抑制4.应用双阈值确定边缘5.Canny函数及使用 前言 Canny边缘检测是一种流行的边缘检测算法,用于检测图像中的边缘。它通过一系列步骤将图像中的像素边缘突出显示出来,主要分为以下几个步骤…

0x07 Nginx越界读取缓存漏洞 CVE-2017-7529 复现

参考: Nginx越界读取缓存漏洞 CVE-2017-7529 | PeiQi文库 (wgpsec.org)Nginx越界读取缓存漏洞(CVE-2017-7529)复现分析 - qweg_focus - 博客园 (cnblogs.com) 一、fofa 搜索 nginx && port"80" 我这里写了个脚本将ip保存…

Java中List集合去重

反问问题:为什么不直接使用 Set 或者 LinkedHashSet 呢 实际场景:实际的业务开发中遇到的情况会更复杂。比如,List 集合可能是历史遗留问题,也有可能是调用接口返回的类型限制,只能使用 List 接收,又或者是…

8.Bug流程管理,禅道的使用(包含笔试/面试题)

一、bug的生命周期(重点) bug的生命周期就是从bug被发现到bug被关闭的整个过程。 1.bug生命周期: 新建(提交bug) - 指派 - 已解决 - 待验 - 关闭 new(新建) - assign额的&…

ChatGPT+2:修订初始AI安全性和超级智能假设

最初的假设是,通过监管大模型可以使[大部分]人工智能变得安全。但自从 ChatGPT 推出后的这两年,这一假设被证明是不准确的。 前沿的人工智能模型,即使没有监管,也在诉讼、媒体、投资者、用户、委员会调查和国会听证的监督下运作&…