模式匹配

模式

模式由如下內(nèi)容組成:
(1)字面值
(2)解構(gòu)的數(shù)組榜晦、枚舉圣勒、結(jié)構(gòu)體或者元組
(3)變量
(4)通配符
(5)占位符

可能用到模式的位置:

  • match
  • if let
  • while let
  • for
  • let
  • 函數(shù)參數(shù)

反駁

模式有兩種:refutable(可反駁的)和 irrefutable(不可反駁的)。能匹配任何傳遞的可能值的模式被稱為是不可反駁的污抬。對值進(jìn)行匹配可能會失敗的模式被稱為可反駁的怖亭。

不可反駁的:函數(shù)肝箱、let語句、for循環(huán)绵载。原因:因為通過不匹配的值程序無法進(jìn)行有意義的工作埂陆。

if let和while let表達(dá)式被限制為只能接受可反駁的模式,因為它們的定義就是為了處理有可能失敗的條件娃豹。

語法

匹配

  • 匹配字面值

    match x {
        1 => println!("one"),
        _ => println!("anything"),
    }
    
  • 匹配命名變量

    let y = 10;  //1處
    match x {
        Some(50) => println!("Got 50"),
        Some(y) => println!("Matched, y = {:?}", y), //此處的y和上面1處的y不一樣焚虱,此處是引入的變量y覆蓋之前的y
        _ => println!("Default case, x = {:?}", x),
    }
    
  • 多個模式

    match x {
        1 | 2 => println!("one or two"),
        _ => println!("anything"),
    }
    
  • 范圍

    match x {
        'a'..='j' => println!("early ASCII letter"),
        'k'..='z' => println!("late ASCII letter"),
        _ => println!("something else"),
    }
    

解構(gòu)

  • 結(jié)構(gòu)體

    let p = Point { x: 0, y: 7 };
        let Point { x: a, y: b } = p;
        assert_eq!(0, a);
        assert_eq!(7, b);
       //let Point { x, y } = p;   //創(chuàng)建了同名的變量,可以簡寫
    
  • 枚舉

  • 元組

忽略

  • 使用_忽略整個值或部分值懂版;
  • ..忽略剩余值鹃栽,必須是無歧義的(一般只用一個)。

其他

  • 匹配守衛(wèi):匹配守衛(wèi)是一個指定于match分支模式之后的額外的if條件躯畴,它必須滿足才能選擇此分支谍咆。

  • 綁定:@運算符允許我們在創(chuàng)建一個存放值的變量禾锤,并且測試這個變量的值是否匹配模式。

    match msg {
        Message::Hello { id: id_variable @ 3..=7 } => {  //創(chuàng)建id_variable 存放id的值摹察,同時測試值是否在3到7的范圍
            println!("Found an id in range: {}", id_variable)
        },
      _ => {}
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恩掷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子供嚎,更是在濱河造成了極大的恐慌黄娘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件克滴,死亡現(xiàn)場離奇詭異逼争,居然都是意外死亡,警方通過查閱死者的電腦和手機劝赔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門誓焦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人着帽,你說我怎么就攤上這事杂伟。” “怎么了仍翰?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵赫粥,是天一觀的道長。 經(jīng)常有香客問我予借,道長越平,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任灵迫,我火速辦了婚禮秦叛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瀑粥。我一直安慰自己书闸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布利凑。 她就那樣靜靜地躺著浆劲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哀澈。 梳的紋絲不亂的頭發(fā)上牌借,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天,我揣著相機與錄音割按,去河邊找鬼膨报。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的现柠。 我是一名探鬼主播院领,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼够吩!你這毒婦竟也來了比然?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤周循,失蹤者是張志新(化名)和其女友劉穎强法,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湾笛,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡饮怯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嚎研。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖墅。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖临扮,靈堂內(nèi)的尸體忽然破棺而出论矾,到底是詐尸還是另有隱情,我是刑警寧澤公条,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站迂曲,受9級特大地震影響靶橱,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜路捧,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一关霸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杰扫,春花似錦队寇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凡伊,卻和暖如春零渐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背系忙。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工诵盼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓风宁,卻偏偏與公主長得像洁墙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子戒财,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345