来自于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

推荐阅读:

相关文章