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

题目

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

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