【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
相关推荐
南玖yy3 分钟前
数据结构完全指南:C语言实现与核心原理剖析
c语言·开发语言·数据结构
Python数据分析与机器学习8 分钟前
《基于大数据的营养果蔬推荐系统的设计与实现》开题报告
大数据·开发语言·人工智能·深度学习·神经网络·算法·计算机视觉
烂蜻蜓8 分钟前
HTML 表格的详细介绍与应用
开发语言·前端·css·html·html5
爱康代码1 小时前
c语言经典基础编程题
c语言·开发语言
沙漏无语2 小时前
Spring Boot集成Spring Statemachine
spring boot·后端·spring
Java开发追求者2 小时前
java 手搓一个http工具类请求传body
java·开发语言·http·调用第三方接口工具
鲤籽鲲3 小时前
C# 事件使用详解
开发语言·c#·c# 知识捡漏
小白学大数据3 小时前
Python爬虫:从人民网提取视频链接的完整指南
大数据·开发语言·爬虫·python·音视频
zhuyasen3 小时前
Go错误码规范化指南:构建优雅的HTTP & gRPC错误处理体系
后端·go
愚戏师3 小时前
Python:函数(一)
开发语言·windows·python