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 協議》,轉載必須註明作者和本文連結