來自於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

解讀

考察要點:

  1. 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

推薦閱讀:

相關文章