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
死循环。跳出去可以用 break。continue 也是类似 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