rust-quiz:021-closure-or-logical-or.rs

godme發表於2022-07-15
trait Trait {
    fn f(&self);
}

impl<F: FnOnce() -> bool> Trait for F {
    fn f(&self) {
        print!("1");
    }
}

impl Trait for () {
    fn f(&self) {
        print!("2");
    }
}

fn main() {
    let x = || { (return) || true; };
    x().f();

    let x = loop { (break) || true; };
    x.f();

    let x = || { return (|| true); };
    x().f();

    let x = loop { break (|| true); };
    x.f();

    let x = || { return || true; };
    x().f();

    let x = loop { break || true; };
    x.f();
}

緊接上題,關於returnbreak就不多說了。
這道題主要是識別返回值,()列印2Fn列印1

  • 1

      let x = || { (return) || true; };
      x().f();

    外觀看來是閉包,內部的(return) || true之前有分析過,返回的是()
    後續的||是一個or操作,實際(return)是一個never
    因此列印2

  • 2

      let x = loop { (break) || true; };
      x.f();

    迴圈裡面被break了,單獨計算(break)返回()
    且因為()的計算隔離,||實際上是or運算子。
    列印2.

  • 3

      let x = || { return (|| true); };
      x().f();

    整體是閉包,內部根據return的性質,返回的是|| true,是一個閉包。
    列印1

  • 4

      let x = loop { break (|| true); };
      x.f();

    根據上一道題,break後面跟隨的是()的表示式,因此會計算值。
    返回的是|| true,是一個閉包。
    列印1

  • 5

      let x = || { return || true; };
      x().f();

    return後面緊跟的表示式直接返回|| true,列印1

  • 6

      let x = loop { break || true; };
      x.f();

    根據上一道題的論述,這裡會進行計算,返回|| true,列印1
    不過改為下面的方式返回的就是unit

      let x = loop { break {|| true;} };
      x.f();

    因為break{}不敏感。

221111

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章