基本类型
数值类型
- 有符号整数:i8, i16, i32, i64, i128, isize
- 无符号整数:u8, u16, u32, u64, u128, usize
- 浮点数:f32(单精度), f64(双精度,默认)
- 字符串切片:&str
- 布尔类型:true, false
- 字符类型:char表示单个Unicode字符,大小为四字节
- 单元类型:(), 其唯一可能的值也是()
类型推导与显式标注
Rust是静态编译语言,编译器可以自动推导类型,也可以给出显式标注:
let s: &str = "hello world";
浮点数精度问题
需要考虑浮点数类型精度问题,一些十进制小数无法精确转为二进制,需要注意以下问题:
- 避免测试浮点数的相等性
- 当结果在数学上可能存在未定义时,需要格外的小心
以下就会造成程序panic:
fn main() {
// 断言0.1 + 0.2与0.3相等
assert!(0.1 + 0.2 == 0.3);
}
如果一定要比较,可以考虑 (0.1_f64 + 0.2 - 0.3).abs() < 0.00001
数学运算
Rust支持常见数学运算:加法、减法、乘法、除法以及取模运算
fn main() {
// 加法
let sum = 5 + 10;
// 减法
let difference = 95.5 - 4.3;
// 乘法
let product = 4 * 30;
// 除法
let quotient = 56.7 / 32.2;
// 求余
let remainder = 43 % 5;
}
位运算
Rust的位运算: & 位与, | 位或, ^ 异或, ! 位非, << 左移(所有位向左移动指定位数,右位补0), >> 右移(所有位向右移动指定位数,带符号移动,正数补0,负数补1). 对于移位运算,编译器会检查该整数的位数范围,如果超出会报overflow
序列(Range)
Rust给出一种生成序列的方式,例如 1..5 表示左开右闭1到4的连续数字,若要两边都取到,可以使用以下方式:
for i in 1..=5 {
println!("{}",i);
}
也可以使用连续字符类型序列:
for i in 'a'..='z' {
println!("{}",i);
}