rust-quiz:004-dotdot-in-tuple.rs

godme發表於2022-07-08
fn main() {
    let (.., x, y) = (0, 1, ..);
    print!("{}", b"066"[y][x]);
}
  • 脫糖
    rust中有很多糖,有些甚至我們也無法判斷它是不是糖。
    但是我們需要知道一些自動化的對稱,比如一些糖的外觀和實際的替換。
    正如實現了Add的結構可以透過+進行運算,實現BitAnd可以&
    還有match中的_其實是WildCard匹配。
    還有本題中的..也可以是RangFull

  • 匹配
    match需要關注兩個點:資料和模式。
    左邊的是匹配的模式,可以提取資料。
    右邊的是資料,根據不同的模式可以取出對應的值。
    不過最為特殊的情況是,有些資料本身就可以作為匹配的模式,比如..

  • string
    rust中的字串的確令人眼花繚亂,讓人深感頭大。
    不過也無需考慮string的編解碼了,因為rust中的string固定就是utf-8編碼。
    都知道string的底層是[u8;N],為了方便操作string,還有一些特殊的string
    這裡都詳細描述了。
    其中比較不同的是b"string",看起來是直白的字串,但實際上只是單純的[u8;N]
    這是簡單的直接的ASCII的字串宣告。

  • ..
    上面也說了RangeFull,這裡說一下slice
    就是對底層陣列的區間範圍索引取值,這就是為什麼總是把slice叫做view

  • [?]:單個索引的情況,就是直接取出對應索引的值。

  • [..]:範圍索引,取出對應部分的值,也是我們建立切片的手段。

  • 匹配
    let (.., x, y) = (0, 1, ..);
    第一個..在模式項中,表達的是任意匹配,因此,其中xy對應的取值就是元組資料中的最後兩個。
  • x: 1
  • y:..

第二個..也就是y的值,就是RangeFull,看起來讓人摸不著頭腦。
不過它就是一個具體的物件,能當做匹配項的一個物件。

  • 字元
    b"066",這裡其實其實是一個ASCII編碼字元,是一個[u8;N]
    查表以後不難得出具體的數值[48, 54, 54]

  • 切片
    至此,我們解讀一下b"066"[y],經過上述的解釋,它可以轉化為[48,54,54][..]
    結果不言而喻,我們的到了一個切片[48,54,54]

  • 取值
    整體計算一下b"066"[y][x],得到[48,54,54][..][1]
    切片之後取值,得到的是54

因此,整體答案就是列印54

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章