Rust 笔记

发布时间 2023-07-04 15:41:22作者: gznpp

https://github.com/ACMClassCourse-2022/Summer-Ray-Tracer

Rust 这门语言真的是挺难的,主要在于编译器贼事儿逼,什么都要管。这篇文章主要内容是给 C++ 的每一样东西一个 Rust 平替。

I/O

输出

print!(), println!()。其中的感叹号代表宏。用法:

let a = 3;
println!("a = {a}");
println!("a = {}", a);
println!("a = {b}", b = a);

用法跟 scanf 比较像,但是比 scanf 方便多了。转义同样用 \

输入

需要 use std::io。这句话的功能更偏向 include 而不是 using,因为你不 use 根本用不了。

io::stdin()
    .read_line(&mut guess)
    .expect("Failed to read line");

read_line 表示读一行。guess 一般要求是 mut String,后面可以利用屏蔽性,让一个同名数值变量屏蔽它。

expect 可以捕捉错误。read_line 是有返回值的,返回类型是一个内置类型,叫做 Result。它有两种可能值:Ok(_)Err(_)_ 表示通配符)。expect 会处理 Err 下的情况。如果返回 Err,程序会 panic,直接退出。

看一个用 match 结构(类似 switch-case)捕捉错误的例子(后面也会用到):

let guess: u32 = match guess.trim().parse() {
    Ok(num) => num,
    Err(_) => continue,
};

分支结构:

if

if 不止可以控制语句的执行,还可以表达一个有多种可能的表达式。

用法:

if number % 4 == 0 {
    println!("number is divisible by 4");
} else if number % 3 == 0 {
    println!("number is divisible by 3");
} else if number % 2 == 0 {
    println!("number is divisible by 2");
} else {
    println!("number is not divisible by 4, 3, or 2");
} // 没有小括号,其他跟 C++ 一样

let mut a = if b == 0 {1} else {0};

注意 if 里的 condition 一定要是一个 bool 类型。如果 a 是一个 i32,就不能直接 if a {...}。这一点跟 C/C++ 不一样。

match

用法见上。控制语句执行和表达式都可以。每个 case 的值跟控制的语句之间写 =>。每个 case 没有大括号的话后面跟逗号,有大括号可以加逗号可以不加。

if let

看不懂。到时候再说。

循环结构

loop

死循环。跳出去可以用 breakcontinue 也是类似 C++ 的。不一样的地方在于有一个东西叫做循环标签。C++ 想直接退出两层及以上循环必须在外面的循环开 flag 变量,但是 Rust 可以开循环标签,直接在里面退出外层循环。

'outer: loop {
    println!("Entered the outer loop");
    'inner: loop {
        println!("Entered the inner loop");
        // 这只是中断内部的循环
        //break;
        // 这会中断外层循环
        break 'outer;
    }
    println!("This point will never be reached");
}

while

条件不用加括号。

for

左闭右开:for n in 0..10;闭区间:for n in 1..=10