学习笔记,仅此而已
Rust是静态编译语言,在编译时必须知道所有变量的类型,其中Rust内部有2套机制
- 基于定义的变量值,编译器自己推断其类型,类似Typescript.
- 但是如果可能的类型比较多(例如把String转为整数的parse方法),就必须提添加类型标注,否则编译报错。
fn main() {
let value = "110"; 默认是&str类型,不需要声明类型
let new_se: u32 = value.parse().expect("error"); 存在多种可能,必须声明类型
println!("count value is {}", new_se);
}
Rust数据类型-标量类型
标量类型代表一个单一的值。Rust标量类型分为
- 整数类型
- 浮点类型
- 布尔类型
- 字符类型
一、整数类型
整数类型分为无符号整数(以 i 开头)和有符号整数(以 u 开头),例如 u32表示一个无符号整数类型,占据32位空间。
1.1整数类型细分
有符号整数类型:即带正负单位的数据类型,其中细分类型有i8、i6、i32、i64、i128
无符号整数类型:即不带正负号的数据,即只会大于0,细分类型有u8、u16、u32、u64、u128
其中符号后面跟的数字表示其占多少位空间,也标识其取值的范围,例如
u8类型,其范围为:0到2的8次方-1,即0~255
i8类型,其范围为:-255~255
注意点:整数类型默认为i32类型
整数类型的值,可以使用下划线增加可读性,比如:let count = 100_0000 表示100万的数值
1.2整数溢出
假如:定义u8类型是整数,但是值给了266,超过u8类型的最大范围255,那么
- 在开发模式下,Rust会检查出整数溢出,程序会报错
- 生产版本下,Rust不会检查整数溢出,如果发生溢出,其会指向
环绕
操作- 256回变成0,257变成1,以此类推。
- 程序不会报错
二、浮点类型
Rust有2种基础的浮点类型
- f32,32位,单精度
- f64,64位,双精度
Rust默认使用f64类型.
Rust数值操作
Rust针对数值类型的数据,支持:
- 加减乘除余
fn main() {
let sum = 1+1;
let sum = 1.1-1.1;
let sum = 2.1*1.1;
let sum = 2/1;
let sum = 2%1;
println!("count value is {}", sum);
}
三、布尔类型
Rust布尔类型有2个值:true和false,占一个字节大小,类型符号是bool、
fn main() {
let f = true;
let p: bool = false;
}
四、字符类型
Rust的的标量类型的字符类型为char类型,
- 字符类型的值使用单引号
- 占用4个字节大小
- 支持拼音、中日韩文、emoji表情
fn main() {
let f =‘s’;
let p:char ='a';
let p:char ='😄';
}
这里指的是单一值,即char类型的值只有一个,比如‘s’,多个字符不能使用char类型。
Rust数据类型-复合类型
复合类型即可以将多个值放到一个值里面。Rust复合类型分为2种:
Tuple 元组
- 可以存放多种数据类型
- 长度是固定的,一旦声明就无法改变
Tuple的创建,可以显示的声明类型,也可以省略。
let tup = (1,2,3,4.1)
Tuple值的获取,可以使用解构,也可以使用点访问下标的方式
let tup = (1,2,3,4.1)
let (x,y,z) = tup; 使用解构方式
let s = tup.0; 使用访问下标的方式
数组
- 只能存放单一数据类型
- 长度是固定的,一旦声明就无法改变
- 数组是存在栈内存中的
数组的创建,可以显示的声明类型,也可以省略。
let a = [1,2,3]; rust推断为[i32;3]
数组类型的声明使用:[类型;长度]
let a: [u8; 3] = [1, 2, 3];
针对数组内容一样的情况,可以简写
let a = [3;5]; 相当于 let a = [3,3,3,3,3]
数组值的获取,可以使用访问下标的方式
let a = [0,1,2,3];
let x = a[0]; 0
let y = a[1]; 1
注意的是:对于数组索引取值超过最大值时,Rust编译会通过,但是会在运行时报错。
数组值的获取,也可以使用解构,如果数组内容多,你只想取前几个元素,后面可以写..语法
let a = [0,1,2,3];
let [x, y, ..] = a; 只解构出第一个元素和第二个元素