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,到底是直接中断还是 携带返回值,主要看计算表达式。
尤其是它们出现在一些特殊地方的时候。
return1fn return1() { if (return { print!("1") }) { } }由于
()的作用,return {print!("`")}作为一个完整表达式。
打印1后,中断了函数执行,返回{}计算结果,unit。return2fn return2() { if return { print!("2") } { } }因为
return计算表达式的特性,{}中的打印得以执行.
打印2,返回unit.break1fn break1() { loop { if (break { print!("1") }) { } } }同理,因为
()的作用,会进行打印语句的执行,打印1,返回unit。break2fn break2() { loop { if break { print!("2") } { } } }因为
break对{}不敏感,因此这里并不会进行打印。
答案
121。
验证一下我们的理解
fn break2() {
loop {
if break ({print!("2")}) {
}
}
}
后面跟随()会被识别为计算表达式, 因此也会打印2。
内部的{}在()的作用下被强制计算了。
也再次说明了()的计算属性和break的计算特征。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: