Rust 数据类型
Rust 是一种静态类型语言,这意味着所有变量的类型必须在编译时已知。这有助于 Rust 避免许多类型相关的错误,提高代码的安全性和性能。 Rust 中的两个数据类型子集:标量和复合。
如果不知道类型就会报错, 如果不像下面的代码这样添加类型注解 : u32,Rust 会显示错误 例
let number:u32="42".parse().expect("not a number!");
println!("number of is :{number}");
1.标量类型
rust有四种标量类型:整型,浮点型,布尔型
标量类型是指单个值的类型,它们没有内部结构或组件。Rust 有四种标量类型:整型,浮点型,布尔型和字符型。
整型
| 长度 | 有符号 | 无符号 |
|---|---|---|
| 8-bit | i8 | u8 |
| 16-bit | i16 | u16 |
| 32-bit | i32 | u32 |
| 64-bit | i64 | u64 |
| 128-bit | i128 | u128 |
| arch | isize | usize |
- 每一个变体都可以是有符号或者无符号的,并有一个明确的大小,有符号和无符号代表数字能否为负值,有负数(有符号数),永远为正(无符)
- 存储计算:每一个有符号的变体可以储存包含从 -(2n - 1) 到 2n - 1 - 1 在内的数字,这里 n 是变体使用的位数。所以 i8 可以储存从 -(27) 到 27 - 1 在内的数字,也就是从 -128 到 127。无符号的变体可以储存从 0 到 2n - 1 的数字,所以 u8 可以储存从 0 到 28 - 1 的数字,也就是从 0 到 255。
- isize 和 usize 类型依赖运行程序的计算机架构:64 位架构上它们是 64 位的,32 位架构上它们是 32 位的,可以使用如下表格中的任何一种形式编写数字字面值。
| 数字字面值 | 例子 |
|---|---|
| Decimal (十进制) | 98_222 |
| Hex (十六进制) | 0xff |
| Octal (八进制) | 0o77 |
| Binary (二进制) | 0b1111_0000 |
| Byte (单字节字符)(仅限于u8) | b'A' |
浮点型
浮点型是表示小数的类型,它们可以用来表示近似值或科学计算。Rust 有两种原生浮点数类型:f32 和 f64。默认值为 f64,因为它在现代 CPU 上几乎与 f32 一样快,但精度更好。所有的浮点数都是有符号的 浮点数采用 IEEE-754 标准表示。f32 是单精度浮点数,f64 是双精度浮点数。
let x=2.0;//f64
let y:f32=3.0;//f32
布尔型
布尔型是表示逻辑值的类型,它们只有两个可能的值:true 和 false。布尔型通常用于条件判断或控制流程。
let f:bool=false;
字符型
字符型是表示单个 Unicode 字符的类型,它们可以用来表示文本或符号。Rust 中的 char 类型是最原始的字母类型。它的大小为四个字节,并表示一个 Unicode 标量值。
let c='z';
let z:char='Z';
let heart_eyed_cat='h';
Rust 的 char 类型的大小为四个字节 (four bytes),并代表了一个 Unicode 标量值(Unicode Scalar Value),这意味着它可以比 ASCII 表示更多内容。在 Rust 中,带变音符号的字母(Accented letters),中文、日文、韩文等字符,emoji(绘文字)以及零长度的空白字符都是有效的 char 值,不过,“字符” 并不是一个 Unicode 中的概念
2.复合类型
复合类型是指将多个值组合成一个类型的类型,它们可以用来表示更复杂的数据结构。Rust 有两种原生复合类型:元组(tuple)和数组(array)
元组
元组是一种将多种不同类型的值组合成一个复合类型的方式。元组可以用圆括号和逗号来创建,并可以用索引或模式匹配来访问其中的元素。元组的长度一旦声明就固定了。元组长度固定:一旦声明,其长度不会增大或缩小。
2.1.1 元组定义
let tup:(i32,f64,u8)=(500,6.4,1);
2.1.2 元组元素访问
tup变量绑定到整个元组上,因为元组是一个单独的复合元素,为了从元组汇总获取单个值,用匹配来解构元组值,例
let (x,y,z)=tup;//解构
println!("of z is:{z}");//1
元组使用(.)后跟值的索引来直接访问它们,例
let x:(i32,f64,u8)=(-500,6.4,100);
let x1=x.0;
let x2=x.1;
let x3=x.2;
println!("x元组使用.赋值分别为:x1={x1},:x2={x2},:x3={x3}");//x元组使用.赋值分别 为:x1=-500,:x2=6.4,:x3=100
数组
数组是一种将多个相同类型的值组合成一个复合类型的方式。数组可以用方括号和分号来创建,并可以用索引或迭代器来访问其中的元素。数组在内存中是连续存储的,并且长度一旦声明就固定了。
2.2.1 数组定义
与元组不同,数组中包含的值必须相同,rust中数组与一些其他语言数组不同,rust中数组长度是固定的。如果不需要长度固定需要使用vector
let a=[1,2,3,4,5,6];//数组,长度固定,类型统一
也可以像这样编写数组类型,在方括号中包含每一个元素的类型,后跟分号,在跟数组元素的数量
let b:[i32;5]=[1,2,3,4,5];//i32 是每个元素的类型。分号之后,数字 5 表明该数组包含五个元素。
2.2.2 访问数组元素
数组可以在栈上分配已知固定大小的单个内存块,可以使用索引来访问数组的元素
let first=a[0];
let second=a[1];
2.2.3 无效的数组访问
程序在索引操作中使用一个无效的值时导致 运行时 错误。程序会带着错误信息退出,例
let mark=a[10];//let mark=a[10]; index out of bounds: the length is 6 but the index is 10