rust-quiz:020-break-return-in-condition.rs

godme發表於2022-07-15
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 協議》,轉載必須註明作者和本文連結

相關文章