Rust 系列
🎀Rust编程语言入门教程(一)安装Rust🚪
🎀Rust编程语言入门教程(二)hello_world🚪
🎀Rust编程语言入门教程(三) Hello Cargo🚪
🎀Rust编程语言入门教程(四)猜数游戏:一次猜测🚪
🎀Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测🚪
🎀Rust编程语言入门教程 (六)变量与可变性🚪
🎀Rust编程语言入门教程 (七)函数与控制流🚪
目录
- Rust 系列
- 引言
- 一、变量与可变性
- 二、变量与常量
- shadowing
- 三、标量和复合类型
- (一) 标量类型
- ①整数类型(默认类型 i32)
- ②浮点类型 (默认 f64)
- ③布尔类型
- ④字符类型
- (二)复合类型
- ①元组(Tuple)
- ②数组
- 总结
引言
在 Rust 中,变量默认是不可变的,这种设计有助于防止程序中的意外修改,从而提高代码的安全性和可维护性。通过使用 mut 关键字,可以将变量声明为可变,从而允许在程序运行时修改其值。此外,Rust 提供了常量、标量类型(如整数、浮点数、布尔值和字符)以及复合类型(如元组和数组),这些特性为开发者提供了灵活而强大的工具来构建高效、安全的程序。
一、变量与可变性
声明变量使用 let 关键字默认情况下,变量是不可变的 (Immutable)
不可变的变量不能进行二次赋值
。
运行cargo run
可以发现会报错的。
加上mut
就好啦。声明变量时,在变量前面加上mut,就可以使变量可变
。
cargo run 运行 这个警告是说还没有引用 x 变量。
二、变量与常量
常量(constant)
,常量在绑定值以后也是不可变的,但它与不可变的变量有很多区别:
- 不可以使用mut,常量永远都是不可变的
- 声明常量使用
const 关键字
,它的类型必须被标注 - 常量可以在任何作用域内进行声明,包括全局作用域
- 常量只可以绑定到常量表达式,无法绑定到函数的调用结果或只能在运行时才能计算出的值
在程序运行期间,常量在其声明的作用域内一直有效。
命名规范: Rust 里常量使用全大写字母
,每个单词之间用下划线
分开,
例如:
MAX POINTS
const MAX_POINTS : u32 = 100_000; //下划线 _ 增强可读性
shadowing
可以使用相同的名字声明新的变量,新的变量就会 shadow(隐藏) 之前声明的同名变量
- 在后续的代码中这个变量名代表的就是新的变量(例子)
shadow
和把变量标记为 mut
是不一样的:- 如果不使用 let 关键字,那么重新给
非 mut 的变量赋值
会导致编译时错误,
而使用 let 声明的同名新变量,也是不可变的. 使用 let 声明的同名新变量
,它的类型可以与之前不同
三、标量和复合类型
Rust 是静态编译语言
,在编译时必须知道所有变量的类型
- 基于使用的值,编译器通常能够推断出它的具体类型
- 但如果可能的类型比较多(例如
把 String 转为整数的 parse 方法
),就必须添加类型的标注,否则编译会报错。
这个 u32 是需要写的,不然编译器或者 parse 方法不知道 要把 “42” 字面值解析成哪种整数类型。
(一) 标量类型
一个标量类型代表一个单个的值Rust有四个主要的标量类型:
①整数类型(默认类型 i32)
- 整数类型没有小数部分
- 例如
u32
就是一个无符号的整数类型,占据32位的空间 无符号整数类型
以U开头有符号整数类型
以i 开头
Rust 的整数类型列表如图:
每种都分 i 和 u,以及固定的位数
有符号范围:
-(2的n次方 - 1)
到 2的n次方 - 1
无符号范围:
0
到 2的n次方 - 1
isize 和 usize 类型
isize
和 usize 类型
的位数由程序运行的计算机的架构所决定:
- 如果是64位计算机,那就是64位的
- 使用 isize 或 usize的主要场景是对某种集合进行索引操作。
整数字面值
- 除了byte 类型外,所有的数值字面值都允许使用类型后缀。
例如 57 u8 - 如果你不太清楚应该使用那种类型,可以使用Rust 相应的默认类型:
整数的默认类型就是 i32
总体上来说速度很快,即使在64位系统中。
整数溢出
例如: u8 的范围是 0-255
,如果你把一个 u8 变量的值设为 256,那么
- 调试模式下编译:
Rust 会检查整数溢出
,如果发生溢出,程序在运行时就会 panic - 发布模式下 ( --release ) 编译:
Rust不会检查可能导致 panic 的整数溢出
。 - 如果溢出发生:
Rust 会执行 “环绕” 操作
:
256 变成 0,257 变成 1 …
但程序不会 panic。
②浮点类型 (默认 f64)
Rust有两种基础的浮点类型,也就是含有小数部分的类型
- f32,32位,单精度
- f64,64位,双精度
Rust 的浮点类型使用了IEEE-754标准来表述
f64 是默认类型,因为在现代 CPU 上 f64 和 f32 的速度差不多,而且精度更高
③布尔类型
Rust的布尔类型也有两个值: true 和 false
一个字节大小
符号是 pool
④字符类型
- Rust 语言中
char 类
型被用来描述语言中最基础的单个字符
。 - 字符类型的字面值使用单引号
- 占用
4字节
大小 - 是 Unicode 标量值,可以表示比 ASCIl 多得多的字符内容:拼音、中日韩文、零长度空白字符、emoji 表情等。
- U+0000 到 U+D7FF
- U+E000 到 U+10FFFF
但 Unicode 中并没有 “字符” 的概念,所以直觉上认为的字符也许与 Rust 中的概念并不相符。
(二)复合类型
复合类型可以将多个值放在一个类型里Rust 提供了两种基础的复合类型:
①元组(Tuple)
- Tuple 可以将
多个类型的多个值
放在一个类型
里 - Tuple 的
长度是固定的
:一旦声明就无法改变
创建 Tuple
- 在小括号里,将值用
逗号
分开 - Tuple 中的每个位置都对应一个类型,Tuple 中各元素的类型不必相同
x y z 分别对应 500,6.4, 1
访问 Tuple 的元素
在 tuple 变量使用点标记法
,后接元素的索引号
②数组
- 数组也可以将
多个值放在一个类型
里 - 数组中每个元素的
类型必须相同
- 数组的长度也是
固定的
: 一旦声明就无法改变
声明一个数组
在中括号里,各值用逗号
分开。
数组的用处
- 如果想让你的数据存放在
stack(栈)
上而不是 heap(堆)上
,或者想保证有固定数量的元素,这时使用数组更有好处 - 数组
没有 Vector 灵活
- Vector和数组类似,它由标准库提供
Vector 的长度可以改变
- 如果你不确定应该用数组还是 Vector,那么估计你应该用 Vector。
数组的类型
[类型:长度]
例如: let a: [i32; 5] = [1, 2, 3, 4, 5];
另一种声明数组的方法:
如果数组的每个元素值都相同,那么可以在在中括号里指定初始值,然后是一个“ ; ” ,最后是数组的长度
例如:let a = [3; 5]; 它就相当于:let a = [3, 3, 3, 3, 3];
访问数组的元素
- 数组是
Stack上分配的单个块的内存
- 可以
使用索引
来访问数组的元素 - 如果访问的索引超出了数组的范围,那么:
编译会通过
运行会报错(runtime 时会panic)。
Rust不会允许其继续访问相应地址的内存
总结
Rust 的变量默认不可变,通过 mut 可使其可变,而常量则始终不可变。标量类型(如整数、浮点数、布尔值和字符)和复合类型(如元组和数组)为程序提供了丰富的数据结构支持。变量的 shadowing 机制和类型推断规则进一步增强了 Rust 的灵活性和安全性,使其成为现代系统编程语言中的佼佼者。