rust-quiz:002-bitand-or-reference.rs

题目

struct S(i32);

impl std::ops::BitAnd<S> for () {
    type Output = ();

    fn bitand(self, rhs: S) {
        print!("{}", rhs.0);
    }
}

fn main() {
    let f = || ( () & S(1) );
    let g = || { () & S(2) };
    let h = || ( {} & S(3) );
    let i = || { {} & S(4) };
    f();
    g();
    h();
    i();
}

关键

边界

这一关主要还是边界的判断,这里隐含有两个边界

  • 闭包
    闭包通常是|| {}的结构,但是如果可以一行写出,也可以直接写作|| xxx
  • (){}
    ()只是作为整体的部分,主要表示部分运算作为集体
    {}可以自成一体,完全的脱离紧密排列的表达式的计算

返回

还是讨论一下返回值的情况

  • return:可以指定返回值,终止方法运行,没有指定则返回()
  • 没有特殊声明,返回最后一个表达式计算值,没有特殊声明返回()

&

  • 位运算
  • 引用符号

审题

题目中主要是为单元结构()实现了&的位运算操作,操作对象为S
&操作之后的结果返回(),但是会打印S中的值。
因此打印的关键在于判断是否进行了()S&操作。

解题

这里需要进行闭包和闭包内容的双重判断,下面会优先判断闭包边界,再分析内容。

  • let f = || ( () & S(1) )
    因为()表达的是作为计算整体,因此返回的是() & S(1)的计算结果。
    根据上述分析,应该打印1

  • let g = || { () & S(2) }
    {}作为域的边界,其中返回的结果应该是() & S(2)的计算值,打印2

  • let h = || ( {} & S(3) )
    ()作为计算边界,整体应该计算的是{} & S(3)的值。
    其中{}作为一个域,没有特殊声明,返回的是()
    因此真实的表达式为() & S(3),打印3

  • let i = || { {} & S(4) }
    {}作为计算边界,应该计算{} & S(4)的值。
    因为{}只是作为内部语句的域限定,并没有像(...)那样的计算要求。
    真实的整体声明应该如下分段

    let i = || {
      {}
      & S(4)
    }

    返回的结果应该是最后的表达式计算,也就是&S(4),不作任何打印。

结果

综上所述,最后打印的结果应该是123

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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