【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
相关推荐
Source.Liu5 分钟前
【LibreCAD】 RS_Units 类完整解析
c++·qt·rust
老华带你飞6 分钟前
健身房|基于springboot + vue健身房管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
JIngJaneIL11 分钟前
基于Java酒店预约系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
编程小Y28 分钟前
php.ini 的核心作用与全面解析
开发语言·php
曹牧34 分钟前
Java:List<Map<String, String>>转换为字符串
java·开发语言·windows
我是一棵无人问荆的小草42 分钟前
编码演变史
开发语言·c++
不会写DN1 小时前
存储管理在开发中有哪些应用?
前端·后端
偶像你挑的噻1 小时前
2.Qt-基础核心以及信号与槽
开发语言·qt
potato_may2 小时前
CC++ 内存管理 —— 程序的“五脏六腑”在哪里?
c语言·开发语言·数据结构·c++·内存·内存管理
饕餮怪程序猿2 小时前
A*算法(C++实现)
开发语言·c++·算法