Rust Quiz 解讀:Quiz 20
來自於RustFest 2018 大會上Alex Crichton 和 David Tolnay兩位大佬的輕演講主題:Rust Quiz
- rust-quiz源碼 - 在線練習和解答- 視頻
不得不說,兩位大佬出的題非常具有迷惑性,一不留神就落入了陷阱。
Quiz 20:
下面這段代碼輸出什麼?
fn return1() {
if (return { print!("1") }) {
}
}
fn return2() {
if return { print!("2") } {
}
}
fn break1() {
loop {
if (break { print!("1") }) {
}
}
}
fn break2() {
loop {
if break { print!("2") } {
}
}
}
fn main() {
return1();
return2();
break1();
break2();
}
輸出結果: 121
解讀
考察要點:
- return和break的一點區別
其實在Rust 1.19版本之前,上面代碼的輸出結果是1212
。但是在1.19之後,加入了break value in loop
的功能,也就是說,可以從loop循環中使用break返回一個值。
對於break1
函數來說:
loop { if (break { print!("1") }) {}}
,會先計算break {print!("1")}
的值。
而break2
函數,因為沒有使用括弧來表達優先順序,所以會解析為以下等價的代碼:
fn break2() {
loop {
if (break) {
print!("2")
}
{ }
}
}
所以,在列印之前就已經break
出了循環體,所以什麼都沒列印。
而return就不會產生這種解釋歧義,等以後Rust可能會統一break和return的行為。
點此查看 Rust Quiz 20
推薦閱讀: