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 协议》,转载必须注明作者和本文链接