Rust的数据类型
2022-05-31
Rust数据类型
标量和复合类型
- 
Rust是静态编译语言,在编译时必须知道所有变量的类型 - 
基于使用的值编译器通常能够推断出变量的具体类型 
- 
但如果可能的类型比较多,就必须标注变量的具体类型,否则在编译期就会报错,例: fn main() { let test = "65".parse().expect("Not a number!"); }
 
- 
          
修改为:
fn main() {
    let test: u32 = "65".parse().expect("Not a number!");
    println!("{}", test);
}

指定test变量的类型为u32类型,成功编译运行
标量
- 一个标量类型代表一个单个的值
- Rust有四个主要的标量类型:
- 整数类型
- 浮点类型
- 布尔类型
- 字符类型
 
整数类型
- 
整数类型没有小数部分 
- 
例如u32就是一个无符号的整数类型,占据32位的空间 
- 
无符号整数类型以u开头 
- 
有符号的整数类型以i开头 
- 
Rust的整数类型如下:  - 每种都分i和u,以及固定的位数
 
- 
isize和usize类型 - isize和usize的位数由运行程序的计算机的架构所决定
- 如果是64位计算机,那就是64位的
- 使用这两种类型的场景不多,主要是对某种集合进行索引操作
 
 
- isize和usize的位数由运行程序的计算机的架构所决定
整数字面值

- 除了byte类型外,所有数值字面值都允许使用类型后缀
- 例如57u8
 
- 如果不清楚应该使用哪种类型,可以使用Rust中相应的默认类型:
- 整数的默认类型就是i32
- 即使在64位系统中整体运行速度也很快
 
 
- 整数的默认类型就是i32
整数溢出
例如u8的范围是0~255,如果把一个u8变量的值设为256,那么:
- 
调试模式下编译(debug) Rust会检查整数溢出,如果发生溢出,程序在运行时就会panic 
- 
发布模式下编译(release) Rust不会检查可能导致panic的整数溢出: - 如果溢出发生,Rust会执行环绕操作:
- 256变成0,257变成1
 
- 但程序不会panic
 
- 如果溢出发生,Rust会执行环绕操作:
浮点类型
- Rust有两种基础的浮点类型:
- f32 ,32位,单精度
- f64 ,64位,双精度
 
- Rust的浮点类型使用了IEEE-754标准来表述
- f64是默认类型,因为在现代cpu上f64和f32的速度差不多,而且精度更高,例子:

数值操作
- 
加减乘除余: //加 let sum = 45 + 56; //减 let difference = 78.0 - 45.2; //乘 let product = 45 * 34; //除 let quotient = 89 / 12; //取余 let reminder = 65 % 4;与其他语言无区别 
布尔类型
- 
Rust的布尔类型也有两个值: - true
- false
 
- 
大小为一个字节 
- 
符号为bool //两种声明bool值的方式 let flag_t = true; let flag_f:bool = false;
字符类型
- 
Rust中的char类型用来描述语言中最基础的字符 
- 
字符类型的字面值使用单引号 
- 
占用四个字节 
- 
是Unicode标量值,可以表示比ASCLL多得多的字符内容:拼音,中日韩文,零长度空白字符,emoji表情等: 
- 
但Unicode并没有字符的概念,因此直觉上认为的字符也许和Rust中的概念并不相符: let a:char = 's'; let b = '在'; let c = '😂';
复合类型
- 复合类型可以将多个值放在一个类型里
- Rust提供了两种基本的数据类型:
- 元组(Tuple)
- 数组
 
Tuple(元组)
- 
Tuple可以将多种类型的多个值放在一个类型中 
- 
Tuple的长度是固定的,一旦声明后就不可改变 
- 
创建Tuple: - 
在小括号中,将值用逗号分开 
- 
Tuple 的每个位置都对应一个类型, Tuple中的各元素类型不必相同: fn main() { let tup:(i32,f64,u8) = (78,45.4,1); }
- 
获取Tuple中的值: - 
可以使用模式匹配来解构(destructure)一个Tuple来获取元素的值 fn main() { let tup:(i32,f64,u8) = (78,45.4,1); let (x,y,z) = tup; println!("{},{},{}",x,y,z); } 
 
- 
- 
访问Tuple中的值 - 
对Tuple变量使用点标记法,后接元素的索引号 fn main() { let tup:(i32,f64,u8) = (78,45.4,1); println!("{},{},{}",tup.0,tup.1,tup.2); } 
 
- 
 
- 
数组
- 
数组可以将多个值放在一个类型里 
- 
数组中的每个元素的类型必须相同 
- 
数组的长度也是固定的,声明后不可变 
- 
声明数组 - 
在中括号里,各个值使用逗号分开: let arr = [1,2,3,4,8,9];
 
- 
- 
数组的用处 - 
如果想让你的数组存放在stack(栈)上而不是heap上,或者像保证有固定数量的元素,这时使用数组更有好处 
- 
但是数组没有Vector灵活 - Vector和数组类似,它由便准库提供
- Vector的长度是可变的
- 如果不确定应该使用数组还是Vector时,大概率应该使用Vector
 
- 
数组的类型: let a:[i32;5] = [1,6,8,4,3];- 
另一种声明数组的方式(特殊) - 
如果数组的每个元素都相同,那么在中括号中指定初始值,初始值后是一个分号,最后是数组的长度: let a = [3;5];//那么此语句等价为: let a = [3,3,3,3,3];
 
- 
 
- 
- 
访问数组的元素 - 
数组是Stack上分配的单个块的内存 
- 
可以使用索引来访问数组的元素: let arr = [1,2,3,4,8,9]; let a = arr[0];//1 let y = arr[4];//8
 
- 
- 
Rust中如果访问超出数组索引的元素则会报错,不允许访问,这与C/C++是不同的 
 
-