【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
相关推荐
Dxy123931021614 分钟前
Python 使用正则表达式将多个空格替换为一个空格
开发语言·python·正则表达式
我学上瘾了14 分钟前
Spring Cloud的前世今生
后端·spring·spring cloud
波波0071 小时前
ASP.NET Core 健康检查实战:不只是一个 /health 接口
后端·asp.net
小码哥_常1 小时前
Spring Boot 搭建邮件发送系统:开启你的邮件自动化之旅
后端
故事和你912 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
石榴树下的七彩鱼2 小时前
图片修复 API 接入实战:网站如何自动去除图片水印(Python / PHP / C# 示例)
图像处理·后端·python·c#·php·api·图片去水印
我叫黑大帅2 小时前
为什么TCP是三次握手?
后端·网络协议·面试
我叫黑大帅3 小时前
如何排查 MySQL 慢查询
后端·sql·面试
techdashen3 小时前
Rust项目公开征测:Cargo 构建目录新布局方案
开发语言·后端·rust
星空椰3 小时前
JavaScript 进阶基础:函数、作用域与常用技巧总结
开发语言·前端·javascript