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)的计算值,打印2let h = || ( {} & S(3) )()作为计算边界,整体应该计算的是{} & S(3)的值。
其中{}作为一个域,没有特殊声明,返回的是()。
因此真实的表达式为() & S(3),打印3。let i = || { {} & S(4) }{}作为计算边界,应该计算{} & S(4)的值。
因为{}只是作为内部语句的域限定,并没有像(...)那样的计算要求。
真实的整体声明应该如下分段let i = || { {} & S(4) }返回的结果应该是最后的表达式计算,也就是
&S(4),不作任何打印。
结果
综上所述,最后打印的结果应该是123。
本作品采用《CC 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: