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

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

相關文章