数值类型

  • 有符号整数: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";

浮点数精度问题

需要考虑浮点数类型精度问题,一些十进制小数无法精确转为二进制,需要注意以下问题:

  1. 避免测试浮点数的相等性
  2. 当结果在数学上可能存在未定义时,需要格外的小心

以下就会造成程序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);
}