rust-quiz:020-break-return-in-condition.rs
题目
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();
}
关键
return
可以直接中断函数执行。可以携带返回值。
一般情况下,如果后续有相连的值表达式,会一起计算。break
可以中断循环执行,可以携带返回值。
除非有明确的计算表达式,否则一般不会直接计算,尤其是{}
。()
规定计算域。
题解
这里的主要问题,其实还是和()
规定的计算域相关。
不管是return
还是break
,到底是直接中断还是 携带返回值,主要看计算表达式。
尤其是它们出现在一些特殊地方的时候。
return1
fn return1() { if (return { print!("1") }) { } }
由于
()
的作用,return {print!("`")}
作为一个完整表达式。
打印1
后,中断了函数执行,返回{}
计算结果,unit
。return2
fn return2() { if return { print!("2") } { } }
因为
return
计算表达式的特性,{}
中的打印得以执行.
打印2
,返回unit
.break1
fn break1() { loop { if (break { print!("1") }) { } } }
同理,因为
()
的作用,会进行打印语句的执行,打印1
,返回unit
。break2
fn break2() { loop { if break { print!("2") } { } } }
因为
break
对{}
不敏感,因此这里并不会进行打印。
答案
121
。
验证一下我们的理解
fn break2() {
loop {
if break ({print!("2")}) {
}
}
}
后面跟随()
会被识别为计算表达式, 因此也会打印2
。
内部的{}
在()
的作用下被强制计算了。
也再次说明了()
的计算属性和break
的计算特征。
本作品采用《CC 协议》,转载必须注明作者和本文链接