Rust编程(一)基础语法

变量

变量绑定

let a = 10;

let b = "hello";

let c = false;

可变变量

let mut a = 10;

a = 20;

忽略未使用变量

let _a = 10;
let b = 20;
println!("{}", b);

变量解构

let (a, mut b): (bool, i64) = (true, 1234);

解构式赋值

struct Person{
    age: i32
}

fn main() {
    let (a, b, c, d, e);

    (a, b) = (1, 2);
    [c, .., d, _] = [1, 2, 3, 4, 5];
    Person { e, .. } = Struct { e: 5 };

    assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
}

常量

常量不允许使用 mut。常量自始至终不可变,在编译完成后,已经确定它的值。常量使用 const 关键字并且值的类型必须标注。

const MAX_POINTS: u32 = 100_000;

变量遮蔽(shadowing)

fn main() {
    let x = 5;
    let x = x + 1;

    {
        let x = x * 2;
        println!("The value of x in the inner scope is: {}", x);
    }

    println!("The value of x is: {}", x);
}

如果你在某个作用域内无需再使用之前的变量,就可以重复的使用变量名字。

let spaces = "   ";
let spaces = spaces.len();

修改类型也没有问题。

类型

类型推导

let guess = "42".parse().expect("Not a number!");          // ❎
let guess : i32 = "42".parse().expect("Not a number!");    // ✅

整数

长度 有符号类型 无符号类型
8 位 i8 u8
16 位 i16 u16
32 位 i32 u32
64 位 i64 u64
128-位 i128 u128
视架构而定 isize usize

每个有符号类型规定的数字范围是 \(-\left(2^{n-1}\right) \sim 2^{n-1}-1\), 其中 \(n\) 是该定义形式的位长度。因此 \(i 8\) 可存储数 字范围是 \(-(2^{7}) \sim 2^{7}-1\), 即 \(-128 \sim 127\) 。无符号类型可以存储的数字范围是 \(0 \sim 2^{n}-1\), 所以 u8 能够存储 的数字为 \(0 \sim 2^{8}-1\), 即 \(0 \sim 255\)

数字字面量 示例
十进制 98_222
十六进制 0xff
八进制 0o77
二进制 0b1111_0000
字节 (仅限于 u8) b'A'

关于溢出:debug模式下panic,release模式下按照补码循环溢出。

浮点类型

let x = 2.0; // f64
let y: f32 = 3.0; // f32

NaN

let x = (-100.0_f32).sqrt();
if x.is_nan() {
    println!("未定义的数学行为")
}

判断是否发生了数学上未定义的结果。

数字运算

fn main() {
    // 加法
    let sum = 15 + 210;

    // 减法
    let difference = 945.5 - 54.3;

    // 乘法
    let product = 46 * 340;

    // 除法
    let quotient = 562.7 / 132.2;

    // 求余
    let remainder = 843 % 45;
}

位运算

运算符 说明
& 位与 相同位置均为1时则为1,否则为0
| 位或 相同位置只要有1时则为1,否则为0
^ 异或 相同位置不相同则为1,相同则为0
! 位非 把位中的0和1相互取反,即0置为1,1置为0
<< 左移 所有位向左移动指定位数,右位补零
>> 右移 所有位向右移动指定位数,左位补零

序列(Range)

 for i in 1..=5 {
    println!("{}",i);
}
for i in 'a'..='z' {
    println!("{}",i);
}

类型小结

  1. Rust拥有相当多的数值类型。
  2. 类型转换必须是显式的。
  3. Rust 的数值上可以使用方法,如:13.14_f32.round()