文章目录
- 前言
- 一、Rust 的数据类型
- 基本数据类型:
- 复合数据类型:
- 二、使用注意点📢
- 整型溢出
- 总结
前言
Rust 学习系列 ,学习rust的数据类型。牢记其中的注意点📢
一、Rust 的数据类型
Rust 提供了丰富的数据类型,包括基本数据类型和复合数据类型。
基本数据类型:
- 布尔类型(bool):表示 true 或 false。
- . 字符类型(char):表示单个 Unicode 字符。
- 数值类型:
- 整数类型(i8、i16、i32、i64、i128、isize):有符号整数。
- 无符号整数类型(u8、u16、u32、u64、u128、usize):无符号整数。
- 浮点数类型(f32、f64):单精度和双精度浮点数。
复合数据类型:
- 数组(array):固定大小的相同类型元素的集合。
- 元组(tuple):固定大小的不同类型元素的集合。
- 切片(slice):动态大小的数组引用。
- 字符串(string):动态大小的 UTF-8 字符串。
- 结构体(struct):自定义数据类型,可以包含多个字段。
- 枚举(enum):定义一个类型的取值集合。
- 特定用途的数据类型:例如 Option、Result<T, E> 等。
除了这些基本和复合数据类型,Rust 还提供了一些高级数据类型和特性,如引用、生命周期、泛型、trait 等,用于更灵活地处理数据。这些数据类型和特性使得 Rust 具有强大的类型系统和内存安全性。
来一些代码示例练习一波⚽️
fn main() {
// 声明和初始化变量
let number: i32 = 42;
let is_true: bool = true;
let letter: char = 'a';
let array: [i32; 3] = [1, 2, 3];
let tuple: (i32, bool) = (10, false);
// 使用变量
println!("The number is: {}", number);
println!("Is it true? {}", is_true);
println!("The letter is: {}", letter);
println!("The array is: {:?}", array);
println!("The tuple is: {:?}", tuple);
// 使用引用
let reference: &i32 = &number;
println!("The reference is: {}", reference);
let mut number2: i32 = 42;
let mutable_reference: &mut i32 = &mut number2;
*mutable_reference += 1;
println!("The mutable reference is: {}", mutable_reference);
}
二、使用注意点📢
-
变量绑定:在声明变量时,需要指定变量的数据类型。Rust的类型推导功能可以自动推断变量的数据类型,但在某些情况下需要明确指定类型。
-
不可变和可变性:Rust中默认情况下,变量是不可变的。如果需要修改变量的值,需要使用
mut
关键字声明可变变量。 -
所有权系统:Rust的所有权系统是其最重要的特性之一。它规定了变量在内存中的所有权和使用规则。在Rust中,每个值都有一个所有者,并且只能有一个所有者。所有权可以通过移动(move)或借用(borrow)的方式转移。移动所有权规定了变量在传递给函数时的所有权转移,而借用所有权规定了变量在引用(borrow)时的限制。这个所有权系统可以避免内存安全问题和数据竞争。
-
引用:Rust中的引用(Reference)是指对变量的借用,它允许通过引用访问变量的值,但不允许修改变量的值。引用在函数传参和数据共享等场景下非常有用。
-
字面量和类型转换:Rust中的字面量可以直接表示特定类型的值,例如整数、浮点数和布尔值等。如果需要将一个类型转换为另一个类型,可以使用
as
关键字进行类型转换。 -
枚举和结构体:Rust提供了枚举(Enum)和结构体(Struct)两种复合数据类型。枚举用于表示一组相关的值,而结构体用于表示一组相关的字段。
整型溢出
比方说有一个 u8 ,它可以存放从 0 到 255 的值。那么当你将其修改为范围之外的值,比如 256,则会发生整型溢出(integer overflow),这会导致两种行为的其中一种。当在调试(debug)模式编译时,Rust 会检查整型溢出,若存在这些问题则使程序在编译时 panic。Rust 使用 panic 这个术语来表明程序因错误而退出。第 9 章 “panic! 与不可恢复的错误”会详细介绍 panic。
在当使用 --release 参数进行发布(release)模式构建时,Rust 不检测会导致 panic 的整型溢出。相反当检测到整型溢出时,Rust 会进行一种被称为二进制补码包裹(two’s complement wrapping)的操作。简而言之,大于该类型最大值的数值会被“包裹”成该类型能够支持的对应数字的最小值。比如在 u8 的情况下,256 变成 0,257 变成 1,依此类推。程序不会 panic,但是该变量的值可能不是你期望的值。依赖整型溢出包裹的行为不是一种正确的做法。
要显式处理溢出的可能性,可以使用标准库针对原始数字类型提供的以下一系列方法:
使用 wrapping_* 方法在所有模式下进行包裹,例如 wrapping_add
如果使用 checked_* 方法时发生溢出,则返回 None 值
使用 overflowing_* 方法返回该值和一个指示是否存在溢出的布尔值
使用 saturating_* 方法使值达到最小值或最大值
总结
Rust 数据类型的介绍,其中介绍数据使用需要特别注意的点
更多内容请参考
https://rustwiki.org/zh-CN/book/ch03-02-data-types.html