Rust 变量基础知识

news/2024/12/23 6:41:49/

文章目录

  • 发现宝藏
  • 一、 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…