【Rust】变量与可变性

目录

思维导图

[1. 变量与可变性](#1. 变量与可变性)

[1.1 不可变性](#1.1 不可变性)

[1.2 可变性](#1.2 可变性)

[2. 常量](#2. 常量)

[2.1 定义与特性](#2.1 定义与特性)

[3. 变量遮蔽(shadowing)](#3. 变量遮蔽(shadowing))

[3.1 影子机制](#3.1 影子机制)

[3.2 遮蔽与可变性的区别](#3.2 遮蔽与可变性的区别)

4.示例

[4.1 变量和可变性示例](#4.1 变量和可变性示例)

[4.2 可变变量示例:](#4.2 可变变量示例:)

[4.3 常量示例:](#4.3 常量示例:)

[4.4 遮蔽示例:](#4.4 遮蔽示例:)


思维导图

1. 变量与可变性

1.1 不可变性
  • 默认特性:在Rust中,变量默认是不可变的。这种设计旨在提高代码的安全性和并发性,避免因意外修改变量而引发的错误。
1.2 可变性
  • 声明可变变量 :可以通过在变量前添加mut关键字将变量声明为可变。例如,let mut x = 5;允许后续对x的值进行修改。

2. 常量

2.1 定义与特性
  • 不可变性 :常量是始终不可变的,使用const关键字声明,且必须注释类型。
  • 作用域:常量可以在任何作用域中声明,包括全局作用域,适用于需要多个部分共享的值。

3. 变量遮蔽(shadowing)

3.1 影子机制
  • 定义 :可以通过重复使用let关键字来声明与之前变量同名的新变量,这称为"影子"。
3.2 遮蔽与可变性的区别
  • 编译时错误 :如果尝试在不使用let的情况下重新赋值,将会导致编译错误。遮蔽机制允许开发者在不改变原始变量的情况下对其进行转换。
  • 类型变化:遮蔽还允许在重新声明时改变变量的类型,例如将字符串类型的变量重新声明为数字类型。

4.示例

4.1 变量和可变性示例

不可变变量示例:

复制代码
fn main() {
 let x = 5;
 println!("The value of x is: {x}");
 x = 6; // 这里会产生错误
 println!("The value of x is: {x}");
}

编译错误信息:

复制代码
error[E0384]: cannot assign twice to immutable variable `x`
 --> src/main.rs:4:5
 |
2 | let x = 5;
 | first assignment to `x`
3 | println!("The value of x is: {x}");
4 | x = 6;
 | ^^^^^ cannot assign twice to immutable variable
4.2 可变变量示例:
复制代码
fn main() {
 let mut x = 5;
 println!("The value of x is: {x}");
 x = 6; // 这里可以成功赋值
 println!("The value of x is: {x}");
}

运行输出:

复制代码
The value of x is: 5
The value of x is: 6
4.3 常量示例:
复制代码
#![allow(unused)]
fn main() {
 const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
}
4.4 遮蔽示例:
复制代码
fn main() {
 let x = 5;
 let x = x + 1; // 创建一个新的变量x
 {
 let x = x * 2; // 在内部作用域中再次创建新的变量x
 println!("The value of x in the inner scope is: {x}");
 }
 println!("The value of x is: {x}"); // 输出外部作用域的x
}

运行输出:

复制代码
The value of x in the inner scope is: 12
The value of x is: 6
相关推荐
荒川之神1 小时前
拉链表概念与基本设计
java·开发语言·数据库
chushiyunen1 小时前
python中的@Property和@Setter
java·开发语言·python
2401_895521341 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
小樱花的樱花1 小时前
C++ new和delete用法详解
linux·开发语言·c++
froginwe111 小时前
C 运算符
开发语言
disgare1 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL1 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
fengfuyao9852 小时前
低数据极限下模型预测控制的非线性动力学的稀疏识别 MATLAB实现
开发语言·matlab
摇滚侠2 小时前
搭建前端开发环境 安装 nodejs 设置淘宝镜像 最简化最标准版本 不使用 NVM NVM 高版本无法安装低版本 nodejs
java·开发语言·node.js
t198751282 小时前
MATLAB十字路口车辆通行情况模拟系统
开发语言·matlab