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