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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!