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