[{"data":1,"prerenderedAt":2093},["ShallowReactive",2],{"page-\u002Frust\u002F13-pattern-matching":3},{"id":4,"title":5,"body":6,"description":16,"extension":2086,"meta":2087,"navigation":2088,"path":2089,"seo":2090,"stem":2091,"__hash__":2092},"content\u002Frust\u002F13-pattern-matching.md","13 — Pattern Matching (Deep Dive)",{"type":7,"value":8,"toc":2052},"minimark",[9,13,17,22,66,184,188,193,278,285,288,292,347,354,361,437,440,517,523,592,602,606,726,730,863,867,1020,1024,1124,1133,1137,1289,1293,1385,1395,1401,1473,1478,1482,1547,1559,1569,1572,1620,1623,1629,1634,1680,1688,1692,1699,1703,1782,1788,1795,1855,1861,1865,1977,1983,2018,2022,2036,2048],[10,11,5],"h1",{"id":12},"_13-pattern-matching-deep-dive",[14,15,16],"p",{},"Pattern matching is Rust's most expressive control-flow construct. This chapter covers every pattern form, the binding rules, and the gotchas.",[18,19,21],"h2",{"id":20},"where-patterns-appear","Where Patterns Appear",[23,24,25,33,42,48,53,56],"ul",{},[26,27,28,32],"li",{},[29,30,31],"code",{},"match"," arms",[26,34,35,38,39],{},[29,36,37],{},"if let"," \u002F ",[29,40,41],{},"while let",[26,43,44,47],{},[29,45,46],{},"let"," declarations (destructure)",[26,49,50],{},[29,51,52],{},"let-else",[26,54,55],{},"Function parameters (limited)",[26,57,58,61,62,65],{},[29,59,60],{},"for","\u002F",[29,63,64],{},"while"," loops (destructure each item)",[67,68,70],"code-wrapper",{"language":69},"rust",[71,72,76],"pre",{"className":73,"code":74,"language":69,"meta":75,"style":75},"language-rust shiki shiki-themes github-light github-dark","let (a, b) = (1, 2);\nfn first((a, _): (i32, i32)) -> i32 { a }\nfor (i, v) in vec.iter().enumerate() { \u002F* ... *\u002F }\n","",[29,77,78,109,146],{"__ignoreMap":75},[79,80,83,86,90,93,96,100,103,106],"span",{"class":81,"line":82},"line",1,[79,84,46],{"class":85},"svdQ7",[79,87,89],{"class":88},"ssxIu"," (a, b) ",[79,91,92],{"class":85},"=",[79,94,95],{"class":88}," (",[79,97,99],{"class":98},"snvgF","1",[79,101,102],{"class":88},", ",[79,104,105],{"class":98},"2",[79,107,108],{"class":88},");\n",[79,110,112,115,119,122,125,127,130,132,134,137,140,143],{"class":81,"line":111},2,[79,113,114],{"class":85},"fn",[79,116,118],{"class":117},"sIsaT"," first",[79,120,121],{"class":88},"((a, _)",[79,123,124],{"class":85},":",[79,126,95],{"class":88},[79,128,129],{"class":117},"i32",[79,131,102],{"class":88},[79,133,129],{"class":117},[79,135,136],{"class":88},")) ",[79,138,139],{"class":85},"->",[79,141,142],{"class":117}," i32",[79,144,145],{"class":88}," { a }\n",[79,147,149,151,154,157,160,163,166,169,171,174,177,181],{"class":81,"line":148},3,[79,150,60],{"class":85},[79,152,153],{"class":88}," (i, v) ",[79,155,156],{"class":85},"in",[79,158,159],{"class":88}," vec",[79,161,162],{"class":85},".",[79,164,165],{"class":117},"iter",[79,167,168],{"class":88},"()",[79,170,162],{"class":85},[79,172,173],{"class":117},"enumerate",[79,175,176],{"class":88},"() { ",[79,178,180],{"class":179},"sdCPZ","\u002F* ... *\u002F",[79,182,183],{"class":88}," }\n",[18,185,187],{"id":186},"pattern-forms","Pattern Forms",[189,190,192],"h3",{"id":191},"literals","Literals",[67,194,195],{"language":69},[71,196,198],{"className":73,"code":197,"language":69,"meta":75,"style":75},"match x { 0 => \"zero\", 1 => \"one\", _ => \"many\" }\nmatch c { 'a'..='z' | 'A'..='Z' => \"letter\", _ => \"other\" }\n",[29,199,200,237],{"__ignoreMap":75},[79,201,202,204,207,210,213,217,219,221,223,226,229,232,235],{"class":81,"line":82},[79,203,31],{"class":85},[79,205,206],{"class":88}," x { ",[79,208,209],{"class":98},"0",[79,211,212],{"class":85}," =>",[79,214,216],{"class":215},"sJ6F3"," \"zero\"",[79,218,102],{"class":88},[79,220,99],{"class":98},[79,222,212],{"class":85},[79,224,225],{"class":215}," \"one\"",[79,227,228],{"class":88},", _ ",[79,230,231],{"class":85},"=>",[79,233,234],{"class":215}," \"many\"",[79,236,183],{"class":88},[79,238,239,241,244,247,250,253,256,259,261,264,266,269,271,273,276],{"class":81,"line":111},[79,240,31],{"class":85},[79,242,243],{"class":88}," c { ",[79,245,246],{"class":215},"'a'",[79,248,249],{"class":85},"..=",[79,251,252],{"class":215},"'z'",[79,254,255],{"class":85}," |",[79,257,258],{"class":215}," 'A'",[79,260,249],{"class":85},[79,262,263],{"class":215},"'Z'",[79,265,212],{"class":85},[79,267,268],{"class":215}," \"letter\"",[79,270,228],{"class":88},[79,272,231],{"class":85},[79,274,275],{"class":215}," \"other\"",[79,277,183],{"class":88},[189,279,281,282],{"id":280},"wildcards-_","Wildcards ",[29,283,284],{},"_",[14,286,287],{},"Matches anything, doesn't bind. Use to ignore.",[189,289,291],{"id":290},"variables","Variables",[67,293,294],{"language":69},[71,295,297],{"className":73,"code":296,"language":69,"meta":75,"style":75},"match opt {\n    Some(x) => println!(\"{x}\"),   \u002F\u002F binds x\n    None => {},\n}\n",[29,298,299,306,331,341],{"__ignoreMap":75},[79,300,301,303],{"class":81,"line":82},[79,302,31],{"class":85},[79,304,305],{"class":88}," opt {\n",[79,307,308,311,314,316,319,322,325,328],{"class":81,"line":111},[79,309,310],{"class":117},"    Some",[79,312,313],{"class":88},"(x) ",[79,315,231],{"class":85},[79,317,318],{"class":117}," println!",[79,320,321],{"class":88},"(",[79,323,324],{"class":215},"\"{x}\"",[79,326,327],{"class":88},"),   ",[79,329,330],{"class":179},"\u002F\u002F binds x\n",[79,332,333,336,338],{"class":81,"line":148},[79,334,335],{"class":117},"    None",[79,337,212],{"class":85},[79,339,340],{"class":88}," {},\n",[79,342,344],{"class":81,"line":343},4,[79,345,346],{"class":88},"}\n",[14,348,349,350,353],{},"A bare identifier binds the value. ",[29,351,352],{},"_x"," also binds but signals \"intentionally unused\" (suppresses warnings).",[189,355,357,358],{"id":356},"or-patterns","Or-Patterns ",[29,359,360],{},"|",[67,362,363],{"language":69},[71,364,366],{"className":73,"code":365,"language":69,"meta":75,"style":75},"match x {\n    1 | 2 | 3 => \"small\",\n    4 | 5 | 6 => \"medium\",\n    _ => \"big\",\n}\n",[29,367,368,375,398,420,432],{"__ignoreMap":75},[79,369,370,372],{"class":81,"line":82},[79,371,31],{"class":85},[79,373,374],{"class":88}," x {\n",[79,376,377,380,382,385,387,390,392,395],{"class":81,"line":111},[79,378,379],{"class":98},"    1",[79,381,255],{"class":85},[79,383,384],{"class":98}," 2",[79,386,255],{"class":85},[79,388,389],{"class":98}," 3",[79,391,212],{"class":85},[79,393,394],{"class":215}," \"small\"",[79,396,397],{"class":88},",\n",[79,399,400,403,405,408,410,413,415,418],{"class":81,"line":148},[79,401,402],{"class":98},"    4",[79,404,255],{"class":85},[79,406,407],{"class":98}," 5",[79,409,255],{"class":85},[79,411,412],{"class":98}," 6",[79,414,212],{"class":85},[79,416,417],{"class":215}," \"medium\"",[79,419,397],{"class":88},[79,421,422,425,427,430],{"class":81,"line":343},[79,423,424],{"class":88},"    _ ",[79,426,231],{"class":85},[79,428,429],{"class":215}," \"big\"",[79,431,397],{"class":88},[79,433,435],{"class":81,"line":434},5,[79,436,346],{"class":88},[14,438,439],{},"Can bind in all alternatives with the same name (or-pattern binding, edition 2021+):",[67,441,442],{"language":69},[71,443,445],{"className":73,"code":444,"language":69,"meta":75,"style":75},"let (Ok(n) | Err(n)) = result.map(|n| n + 1).map_err(|e| 0);\n",[29,446,447],{"__ignoreMap":75},[79,448,449,451,453,456,459,461,464,467,469,472,474,477,479,481,484,486,489,492,495,498,500,503,505,507,510,512,515],{"class":81,"line":82},[79,450,46],{"class":85},[79,452,95],{"class":88},[79,454,455],{"class":117},"Ok",[79,457,458],{"class":88},"(n) ",[79,460,360],{"class":85},[79,462,463],{"class":117}," Err",[79,465,466],{"class":88},"(n)) ",[79,468,92],{"class":85},[79,470,471],{"class":88}," result",[79,473,162],{"class":85},[79,475,476],{"class":117},"map",[79,478,321],{"class":88},[79,480,360],{"class":85},[79,482,483],{"class":88},"n",[79,485,360],{"class":85},[79,487,488],{"class":88}," n ",[79,490,491],{"class":85},"+",[79,493,494],{"class":98}," 1",[79,496,497],{"class":88},")",[79,499,162],{"class":85},[79,501,502],{"class":117},"map_err",[79,504,321],{"class":88},[79,506,360],{"class":85},[79,508,509],{"class":88},"e",[79,511,360],{"class":85},[79,513,514],{"class":98}," 0",[79,516,108],{"class":88},[189,518,520,521],{"id":519},"ranges","Ranges ",[29,522,249],{},[67,524,525],{"language":69},[71,526,528],{"className":73,"code":527,"language":69,"meta":75,"style":75},"match x {\n    0..=9 => \"digit\",\n    10..=99 => \"tens\",\n    100.. => \"big\",     \u002F\u002F open-ended (unstable on stable for match arms in some forms)\n}\n",[29,529,530,536,553,570,588],{"__ignoreMap":75},[79,531,532,534],{"class":81,"line":82},[79,533,31],{"class":85},[79,535,374],{"class":88},[79,537,538,541,543,546,548,551],{"class":81,"line":111},[79,539,540],{"class":98},"    0",[79,542,249],{"class":85},[79,544,545],{"class":98},"9",[79,547,212],{"class":85},[79,549,550],{"class":215}," \"digit\"",[79,552,397],{"class":88},[79,554,555,558,560,563,565,568],{"class":81,"line":148},[79,556,557],{"class":98},"    10",[79,559,249],{"class":85},[79,561,562],{"class":98},"99",[79,564,212],{"class":85},[79,566,567],{"class":215}," \"tens\"",[79,569,397],{"class":88},[79,571,572,575,578,580,582,585],{"class":81,"line":343},[79,573,574],{"class":98},"    100",[79,576,577],{"class":85},"..",[79,579,212],{"class":85},[79,581,429],{"class":215},[79,583,584],{"class":88},",     ",[79,586,587],{"class":179},"\u002F\u002F open-ended (unstable on stable for match arms in some forms)\n",[79,589,590],{"class":81,"line":434},[79,591,346],{"class":88},[14,593,594,595,598,599,601],{},"Ranges work for ",[29,596,597],{},"char"," and numeric types. Use ",[29,600,577],{}," for exclusive range in slice patterns.",[189,603,605],{"id":604},"destructuring-structs","Destructuring Structs",[67,607,608],{"language":69},[71,609,611],{"className":73,"code":610,"language":69,"meta":75,"style":75},"struct P { x: i32, y: i32 }\nmatch p {\n    P { x, y } => println!(\"{x},{y}\"),     \u002F\u002F shorthand\n    P { x: a, y: b } => println!(\"{a},{b}\"),\n    P { x, .. } => println!(\"only x\"),     \u002F\u002F ignore rest\n}\n",[29,612,613,637,644,667,695,721],{"__ignoreMap":75},[79,614,615,618,621,624,626,628,631,633,635],{"class":81,"line":82},[79,616,617],{"class":85},"struct",[79,619,620],{"class":117}," P",[79,622,623],{"class":88}," { x",[79,625,124],{"class":85},[79,627,142],{"class":117},[79,629,630],{"class":88},", y",[79,632,124],{"class":85},[79,634,142],{"class":117},[79,636,183],{"class":88},[79,638,639,641],{"class":81,"line":111},[79,640,31],{"class":85},[79,642,643],{"class":88}," p {\n",[79,645,646,649,652,654,656,658,661,664],{"class":81,"line":148},[79,647,648],{"class":117},"    P",[79,650,651],{"class":88}," { x, y } ",[79,653,231],{"class":85},[79,655,318],{"class":117},[79,657,321],{"class":88},[79,659,660],{"class":215},"\"{x},{y}\"",[79,662,663],{"class":88},"),     ",[79,665,666],{"class":179},"\u002F\u002F shorthand\n",[79,668,669,671,673,675,678,680,683,685,687,689,692],{"class":81,"line":343},[79,670,648],{"class":117},[79,672,623],{"class":88},[79,674,124],{"class":85},[79,676,677],{"class":88}," a, y",[79,679,124],{"class":85},[79,681,682],{"class":88}," b } ",[79,684,231],{"class":85},[79,686,318],{"class":117},[79,688,321],{"class":88},[79,690,691],{"class":215},"\"{a},{b}\"",[79,693,694],{"class":88},"),\n",[79,696,697,699,702,704,707,709,711,713,716,718],{"class":81,"line":434},[79,698,648],{"class":117},[79,700,701],{"class":88}," { x, ",[79,703,577],{"class":85},[79,705,706],{"class":88}," } ",[79,708,231],{"class":85},[79,710,318],{"class":117},[79,712,321],{"class":88},[79,714,715],{"class":215},"\"only x\"",[79,717,663],{"class":88},[79,719,720],{"class":179},"\u002F\u002F ignore rest\n",[79,722,724],{"class":81,"line":723},6,[79,725,346],{"class":88},[189,727,729],{"id":728},"destructuring-tuples","Destructuring Tuples",[67,731,732],{"language":69},[71,733,735],{"className":73,"code":734,"language":69,"meta":75,"style":75},"match t {\n    (0, _) => \"first zero\",\n    (a, b) if a \u003C b => \"ascending\",\n    _ => \"other\",\n}\nlet (x, ..) = (1, 2, 3);    \u002F\u002F first element only\nlet (.., z) = (1, 2, 3);    \u002F\u002F last element only\n",[29,736,737,744,761,785,795,799,832],{"__ignoreMap":75},[79,738,739,741],{"class":81,"line":82},[79,740,31],{"class":85},[79,742,743],{"class":88}," t {\n",[79,745,746,749,751,754,756,759],{"class":81,"line":111},[79,747,748],{"class":88},"    (",[79,750,209],{"class":98},[79,752,753],{"class":88},", _) ",[79,755,231],{"class":85},[79,757,758],{"class":215}," \"first zero\"",[79,760,397],{"class":88},[79,762,763,766,769,772,775,778,780,783],{"class":81,"line":148},[79,764,765],{"class":88},"    (a, b) ",[79,767,768],{"class":85},"if",[79,770,771],{"class":88}," a ",[79,773,774],{"class":85},"\u003C",[79,776,777],{"class":88}," b ",[79,779,231],{"class":85},[79,781,782],{"class":215}," \"ascending\"",[79,784,397],{"class":88},[79,786,787,789,791,793],{"class":81,"line":343},[79,788,424],{"class":88},[79,790,231],{"class":85},[79,792,275],{"class":215},[79,794,397],{"class":88},[79,796,797],{"class":81,"line":434},[79,798,346],{"class":88},[79,800,801,803,806,808,811,813,815,817,819,821,823,826,829],{"class":81,"line":723},[79,802,46],{"class":85},[79,804,805],{"class":88}," (x, ",[79,807,577],{"class":85},[79,809,810],{"class":88},") ",[79,812,92],{"class":85},[79,814,95],{"class":88},[79,816,99],{"class":98},[79,818,102],{"class":88},[79,820,105],{"class":98},[79,822,102],{"class":88},[79,824,825],{"class":98},"3",[79,827,828],{"class":88},");    ",[79,830,831],{"class":179},"\u002F\u002F first element only\n",[79,833,835,837,839,841,844,846,848,850,852,854,856,858,860],{"class":81,"line":834},7,[79,836,46],{"class":85},[79,838,95],{"class":88},[79,840,577],{"class":85},[79,842,843],{"class":88},", z) ",[79,845,92],{"class":85},[79,847,95],{"class":88},[79,849,99],{"class":98},[79,851,102],{"class":88},[79,853,105],{"class":98},[79,855,102],{"class":88},[79,857,825],{"class":98},[79,859,828],{"class":88},[79,861,862],{"class":179},"\u002F\u002F last element only\n",[189,864,866],{"id":865},"destructuring-enums","Destructuring Enums",[67,868,869],{"language":69},[71,870,872],{"className":73,"code":871,"language":69,"meta":75,"style":75},"match e {\n    Message::Quit => {},\n    Message::Move { x: 0, y } => println!(\"zero-x, y={y}\"),\n    Message::Move { x, y } => println!(\"{x},{y}\"),\n    Message::Write(s) if s.is_empty() => \"empty\",\n    Message::Write(s) => s,\n    Message::ChangeColor(r, g, b) => println!(\"{r},{g},{b}\"),\n}\n",[29,873,874,881,896,925,945,977,992,1015],{"__ignoreMap":75},[79,875,876,878],{"class":81,"line":82},[79,877,31],{"class":85},[79,879,880],{"class":88}," e {\n",[79,882,883,886,889,892,894],{"class":81,"line":111},[79,884,885],{"class":117},"    Message",[79,887,888],{"class":85},"::",[79,890,891],{"class":117},"Quit",[79,893,212],{"class":85},[79,895,340],{"class":88},[79,897,898,900,902,905,907,909,911,914,916,918,920,923],{"class":81,"line":148},[79,899,885],{"class":117},[79,901,888],{"class":85},[79,903,904],{"class":117},"Move",[79,906,623],{"class":88},[79,908,124],{"class":85},[79,910,514],{"class":98},[79,912,913],{"class":88},", y } ",[79,915,231],{"class":85},[79,917,318],{"class":117},[79,919,321],{"class":88},[79,921,922],{"class":215},"\"zero-x, y={y}\"",[79,924,694],{"class":88},[79,926,927,929,931,933,935,937,939,941,943],{"class":81,"line":343},[79,928,885],{"class":117},[79,930,888],{"class":85},[79,932,904],{"class":117},[79,934,651],{"class":88},[79,936,231],{"class":85},[79,938,318],{"class":117},[79,940,321],{"class":88},[79,942,660],{"class":215},[79,944,694],{"class":88},[79,946,947,949,951,954,957,959,962,964,967,970,972,975],{"class":81,"line":434},[79,948,885],{"class":117},[79,950,888],{"class":85},[79,952,953],{"class":117},"Write",[79,955,956],{"class":88},"(s) ",[79,958,768],{"class":85},[79,960,961],{"class":88}," s",[79,963,162],{"class":85},[79,965,966],{"class":117},"is_empty",[79,968,969],{"class":88},"() ",[79,971,231],{"class":85},[79,973,974],{"class":215}," \"empty\"",[79,976,397],{"class":88},[79,978,979,981,983,985,987,989],{"class":81,"line":723},[79,980,885],{"class":117},[79,982,888],{"class":85},[79,984,953],{"class":117},[79,986,956],{"class":88},[79,988,231],{"class":85},[79,990,991],{"class":88}," s,\n",[79,993,994,996,998,1001,1004,1006,1008,1010,1013],{"class":81,"line":834},[79,995,885],{"class":117},[79,997,888],{"class":85},[79,999,1000],{"class":117},"ChangeColor",[79,1002,1003],{"class":88},"(r, g, b) ",[79,1005,231],{"class":85},[79,1007,318],{"class":117},[79,1009,321],{"class":88},[79,1011,1012],{"class":215},"\"{r},{g},{b}\"",[79,1014,694],{"class":88},[79,1016,1018],{"class":81,"line":1017},8,[79,1019,346],{"class":88},[189,1021,1023],{"id":1022},"slice-patterns","Slice Patterns",[67,1025,1026],{"language":69},[71,1027,1029],{"className":73,"code":1028,"language":69,"meta":75,"style":75},"match slice {\n    [] => \"empty\",\n    [a] => \"one: {a}\",\n    [a, b] => \"two: {a},{b}\",\n    [first, .., last] => \"first={first} last={last}\",   \u002F\u002F subslice pattern\n    [a, b, c @ ..] => println!(\"{a}, {b}, rest={:?}\", c),\n}\n",[29,1030,1031,1038,1049,1061,1073,1094,1120],{"__ignoreMap":75},[79,1032,1033,1035],{"class":81,"line":82},[79,1034,31],{"class":85},[79,1036,1037],{"class":88}," slice {\n",[79,1039,1040,1043,1045,1047],{"class":81,"line":111},[79,1041,1042],{"class":88},"    [] ",[79,1044,231],{"class":85},[79,1046,974],{"class":215},[79,1048,397],{"class":88},[79,1050,1051,1054,1056,1059],{"class":81,"line":148},[79,1052,1053],{"class":88},"    [a] ",[79,1055,231],{"class":85},[79,1057,1058],{"class":215}," \"one: {a}\"",[79,1060,397],{"class":88},[79,1062,1063,1066,1068,1071],{"class":81,"line":343},[79,1064,1065],{"class":88},"    [a, b] ",[79,1067,231],{"class":85},[79,1069,1070],{"class":215}," \"two: {a},{b}\"",[79,1072,397],{"class":88},[79,1074,1075,1078,1080,1083,1085,1088,1091],{"class":81,"line":434},[79,1076,1077],{"class":88},"    [first, ",[79,1079,577],{"class":85},[79,1081,1082],{"class":88},", last] ",[79,1084,231],{"class":85},[79,1086,1087],{"class":215}," \"first={first} last={last}\"",[79,1089,1090],{"class":88},",   ",[79,1092,1093],{"class":179},"\u002F\u002F subslice pattern\n",[79,1095,1096,1099,1102,1105,1108,1110,1112,1114,1117],{"class":81,"line":723},[79,1097,1098],{"class":88},"    [a, b, c ",[79,1100,1101],{"class":85},"@",[79,1103,1104],{"class":85}," ..",[79,1106,1107],{"class":88},"] ",[79,1109,231],{"class":85},[79,1111,318],{"class":117},[79,1113,321],{"class":88},[79,1115,1116],{"class":215},"\"{a}, {b}, rest={:?}\"",[79,1118,1119],{"class":88},", c),\n",[79,1121,1122],{"class":81,"line":834},[79,1123,346],{"class":88},[14,1125,1126,1128,1129,1132],{},[29,1127,577],{}," in slice patterns matches the middle (any length). Limited stable support; ",[29,1130,1131],{},"c @ .."," binds the subslice.",[189,1134,1136],{"id":1135},"reference-patterns","Reference Patterns",[67,1138,1139],{"language":69},[71,1140,1142],{"className":73,"code":1141,"language":69,"meta":75,"style":75},"match &x {\n    &0 => \"ref to zero\",      \u002F\u002F matches &0\n    0 => \"deref zero\",         \u002F\u002F auto-deref (binding mode)\n}\nlet &y = &5;                  \u002F\u002F matches the reference, y is i32 (Copy)\nlet ref r = x;               \u002F\u002F r: &i32 — borrow pattern\nlet mut z = 0;\nmatch z {\n    ref mut r => *r += 1,    \u002F\u002F r: &mut i32\n}\n",[29,1143,1144,1154,1172,1187,1191,1213,1231,1248,1255,1284],{"__ignoreMap":75},[79,1145,1146,1148,1151],{"class":81,"line":82},[79,1147,31],{"class":85},[79,1149,1150],{"class":85}," &",[79,1152,1153],{"class":88},"x {\n",[79,1155,1156,1159,1161,1163,1166,1169],{"class":81,"line":111},[79,1157,1158],{"class":85},"    &",[79,1160,209],{"class":98},[79,1162,212],{"class":85},[79,1164,1165],{"class":215}," \"ref to zero\"",[79,1167,1168],{"class":88},",      ",[79,1170,1171],{"class":179},"\u002F\u002F matches &0\n",[79,1173,1174,1176,1178,1181,1184],{"class":81,"line":148},[79,1175,540],{"class":98},[79,1177,212],{"class":85},[79,1179,1180],{"class":215}," \"deref zero\"",[79,1182,1183],{"class":88},",         ",[79,1185,1186],{"class":179},"\u002F\u002F auto-deref (binding mode)\n",[79,1188,1189],{"class":81,"line":343},[79,1190,346],{"class":88},[79,1192,1193,1195,1197,1200,1202,1204,1207,1210],{"class":81,"line":434},[79,1194,46],{"class":85},[79,1196,1150],{"class":85},[79,1198,1199],{"class":88},"y ",[79,1201,92],{"class":85},[79,1203,1150],{"class":85},[79,1205,1206],{"class":98},"5",[79,1208,1209],{"class":88},";                  ",[79,1211,1212],{"class":179},"\u002F\u002F matches the reference, y is i32 (Copy)\n",[79,1214,1215,1217,1220,1223,1225,1228],{"class":81,"line":723},[79,1216,46],{"class":85},[79,1218,1219],{"class":85}," ref",[79,1221,1222],{"class":88}," r ",[79,1224,92],{"class":85},[79,1226,1227],{"class":88}," x;               ",[79,1229,1230],{"class":179},"\u002F\u002F r: &i32 — borrow pattern\n",[79,1232,1233,1235,1238,1241,1243,1245],{"class":81,"line":834},[79,1234,46],{"class":85},[79,1236,1237],{"class":85}," mut",[79,1239,1240],{"class":88}," z ",[79,1242,92],{"class":85},[79,1244,514],{"class":98},[79,1246,1247],{"class":88},";\n",[79,1249,1250,1252],{"class":81,"line":1017},[79,1251,31],{"class":85},[79,1253,1254],{"class":88}," z {\n",[79,1256,1258,1261,1263,1265,1267,1270,1273,1276,1278,1281],{"class":81,"line":1257},9,[79,1259,1260],{"class":85},"    ref",[79,1262,1237],{"class":85},[79,1264,1222],{"class":88},[79,1266,231],{"class":85},[79,1268,1269],{"class":85}," *",[79,1271,1272],{"class":88},"r ",[79,1274,1275],{"class":85},"+=",[79,1277,494],{"class":98},[79,1279,1280],{"class":88},",    ",[79,1282,1283],{"class":179},"\u002F\u002F r: &mut i32\n",[79,1285,1287],{"class":81,"line":1286},10,[79,1288,346],{"class":88},[189,1290,1292],{"id":1291},"binding-modes-2021","Binding Modes (2021)",[67,1294,1295],{"language":69},[71,1296,1298],{"className":73,"code":1297,"language":69,"meta":75,"style":75},"match &opt {\n    Some(x) => println!(\"{x}\"),   \u002F\u002F x: &i32 — auto-ref\n    None => {}\n}\nmatch &mut opt {\n    Some(x) => *x += 1,           \u002F\u002F x: &mut i32\n    None => {}\n}\n",[29,1299,1300,1309,1328,1337,1341,1350,1373,1381],{"__ignoreMap":75},[79,1301,1302,1304,1306],{"class":81,"line":82},[79,1303,31],{"class":85},[79,1305,1150],{"class":85},[79,1307,1308],{"class":88},"opt {\n",[79,1310,1311,1313,1315,1317,1319,1321,1323,1325],{"class":81,"line":111},[79,1312,310],{"class":117},[79,1314,313],{"class":88},[79,1316,231],{"class":85},[79,1318,318],{"class":117},[79,1320,321],{"class":88},[79,1322,324],{"class":215},[79,1324,327],{"class":88},[79,1326,1327],{"class":179},"\u002F\u002F x: &i32 — auto-ref\n",[79,1329,1330,1332,1334],{"class":81,"line":148},[79,1331,335],{"class":117},[79,1333,212],{"class":85},[79,1335,1336],{"class":88}," {}\n",[79,1338,1339],{"class":81,"line":343},[79,1340,346],{"class":88},[79,1342,1343,1345,1348],{"class":81,"line":434},[79,1344,31],{"class":85},[79,1346,1347],{"class":85}," &mut",[79,1349,305],{"class":88},[79,1351,1352,1354,1356,1358,1360,1363,1365,1367,1370],{"class":81,"line":723},[79,1353,310],{"class":117},[79,1355,313],{"class":88},[79,1357,231],{"class":85},[79,1359,1269],{"class":85},[79,1361,1362],{"class":88},"x ",[79,1364,1275],{"class":85},[79,1366,494],{"class":98},[79,1368,1369],{"class":88},",           ",[79,1371,1372],{"class":179},"\u002F\u002F x: &mut i32\n",[79,1374,1375,1377,1379],{"class":81,"line":834},[79,1376,335],{"class":117},[79,1378,212],{"class":85},[79,1380,1336],{"class":88},[79,1382,1383],{"class":81,"line":1017},[79,1384,346],{"class":88},[14,1386,1387,1388,61,1391,1394],{},"The 2021 edition simplified this — you no longer sprinkle ",[29,1389,1390],{},"&",[29,1392,1393],{},"&mut"," everywhere. The compiler inserts references as needed based on what you match against.",[189,1396,1398,1400],{"id":1397},"bindings",[29,1399,1101],{}," Bindings",[67,1402,1403],{"language":69},[71,1404,1406],{"className":73,"code":1405,"language":69,"meta":75,"style":75},"match n {\n    x @ 0..=9 => \"small: {x}\",\n    x @ (10..=99) => \"medium: {x}\",\n    _ => \"big\",\n}\n",[29,1407,1408,1415,1435,1459,1469],{"__ignoreMap":75},[79,1409,1410,1412],{"class":81,"line":82},[79,1411,31],{"class":85},[79,1413,1414],{"class":88}," n {\n",[79,1416,1417,1420,1422,1424,1426,1428,1430,1433],{"class":81,"line":111},[79,1418,1419],{"class":88},"    x ",[79,1421,1101],{"class":85},[79,1423,514],{"class":98},[79,1425,249],{"class":85},[79,1427,545],{"class":98},[79,1429,212],{"class":85},[79,1431,1432],{"class":215}," \"small: {x}\"",[79,1434,397],{"class":88},[79,1436,1437,1439,1441,1443,1446,1448,1450,1452,1454,1457],{"class":81,"line":148},[79,1438,1419],{"class":88},[79,1440,1101],{"class":85},[79,1442,95],{"class":88},[79,1444,1445],{"class":98},"10",[79,1447,249],{"class":85},[79,1449,562],{"class":98},[79,1451,810],{"class":88},[79,1453,231],{"class":85},[79,1455,1456],{"class":215}," \"medium: {x}\"",[79,1458,397],{"class":88},[79,1460,1461,1463,1465,1467],{"class":81,"line":343},[79,1462,424],{"class":88},[79,1464,231],{"class":85},[79,1466,429],{"class":215},[79,1468,397],{"class":88},[79,1470,1471],{"class":81,"line":434},[79,1472,346],{"class":88},[14,1474,1475,1477],{},[29,1476,1101],{}," binds the value while also constraining it with a pattern.",[189,1479,1481],{"id":1480},"match-guards","Match Guards",[67,1483,1484],{"language":69},[71,1485,1487],{"className":73,"code":1486,"language":69,"meta":75,"style":75},"match opt {\n    Some(x) if x > 0 => \"positive\",\n    Some(_) => \"non-positive\",\n    None => \"none\",\n}\n",[29,1488,1489,1495,1518,1532,1543],{"__ignoreMap":75},[79,1490,1491,1493],{"class":81,"line":82},[79,1492,31],{"class":85},[79,1494,305],{"class":88},[79,1496,1497,1499,1501,1503,1506,1509,1511,1513,1516],{"class":81,"line":111},[79,1498,310],{"class":117},[79,1500,313],{"class":88},[79,1502,768],{"class":85},[79,1504,1505],{"class":88}," x ",[79,1507,1508],{"class":85},">",[79,1510,514],{"class":98},[79,1512,212],{"class":85},[79,1514,1515],{"class":215}," \"positive\"",[79,1517,397],{"class":88},[79,1519,1520,1522,1525,1527,1530],{"class":81,"line":148},[79,1521,310],{"class":117},[79,1523,1524],{"class":88},"(_) ",[79,1526,231],{"class":85},[79,1528,1529],{"class":215}," \"non-positive\"",[79,1531,397],{"class":88},[79,1533,1534,1536,1538,1541],{"class":81,"line":343},[79,1535,335],{"class":117},[79,1537,212],{"class":85},[79,1539,1540],{"class":215}," \"none\"",[79,1542,397],{"class":88},[79,1544,1545],{"class":81,"line":434},[79,1546,346],{"class":88},[14,1548,1549,1550,1554,1555,1558],{},"Guards let you add boolean conditions. They ",[1551,1552,1553],"em",{},"can"," prevent exhaustiveness checking — the compiler considers guards potentially false even for matched patterns, so you often need ",[29,1556,1557],{},"_ =>"," arms.",[18,1560,1562,1565,1566],{"id":1561},"ref-and-ref-mut",[29,1563,1564],{},"ref"," and ",[29,1567,1568],{},"ref mut",[14,1570,1571],{},"Old-school (pre-2021) way to borrow in patterns:",[67,1573,1574],{"language":69},[71,1575,1577],{"className":73,"code":1576,"language":69,"meta":75,"style":75},"match opt {\n    Some(ref x) => ...,    \u002F\u002F x: &i32\n    None => ...,\n}\n",[29,1578,1579,1585,1606,1616],{"__ignoreMap":75},[79,1580,1581,1583],{"class":81,"line":82},[79,1582,31],{"class":85},[79,1584,305],{"class":88},[79,1586,1587,1589,1591,1593,1596,1598,1601,1603],{"class":81,"line":111},[79,1588,310],{"class":117},[79,1590,321],{"class":88},[79,1592,1564],{"class":85},[79,1594,1595],{"class":88}," x) ",[79,1597,231],{"class":85},[79,1599,1600],{"class":85}," ...",[79,1602,1280],{"class":88},[79,1604,1605],{"class":179},"\u002F\u002F x: &i32\n",[79,1607,1608,1610,1612,1614],{"class":81,"line":148},[79,1609,335],{"class":117},[79,1611,212],{"class":85},[79,1613,1600],{"class":85},[79,1615,397],{"class":88},[79,1617,1618],{"class":81,"line":343},[79,1619,346],{"class":88},[14,1621,1622],{},"Still useful when the default binding mode doesn't fit (e.g., matching by value where you want a ref to one field). Modern Rust mostly auto-borrows.",[18,1624,1626,1627],{"id":1625},"destructuring-with","Destructuring with ",[29,1628,577],{},[14,1630,1631,1633],{},[29,1632,577],{}," ignores remaining fields\u002Felements:",[67,1635,1636],{"language":69},[71,1637,1639],{"className":73,"code":1638,"language":69,"meta":75,"style":75},"let P { x, .. } = p;     \u002F\u002F ignore y\nlet (a, .., z) = tuple;  \u002F\u002F ignore middle\n",[29,1640,1641,1661],{"__ignoreMap":75},[79,1642,1643,1645,1647,1649,1651,1653,1655,1658],{"class":81,"line":82},[79,1644,46],{"class":85},[79,1646,620],{"class":117},[79,1648,701],{"class":88},[79,1650,577],{"class":85},[79,1652,706],{"class":88},[79,1654,92],{"class":85},[79,1656,1657],{"class":88}," p;     ",[79,1659,1660],{"class":179},"\u002F\u002F ignore y\n",[79,1662,1663,1665,1668,1670,1672,1674,1677],{"class":81,"line":111},[79,1664,46],{"class":85},[79,1666,1667],{"class":88}," (a, ",[79,1669,577],{"class":85},[79,1671,843],{"class":88},[79,1673,92],{"class":85},[79,1675,1676],{"class":88}," tuple;  ",[79,1678,1679],{"class":179},"\u002F\u002F ignore middle\n",[14,1681,1682,1684,1685,1687],{},[29,1683,577],{}," can appear once in a struct pattern and once in a tuple\u002Fslice pattern. Multiple ",[29,1686,577],{}," is an error.",[18,1689,1691],{"id":1690},"patterns-dont-allow-expressions","Patterns Don't Allow Expressions",[14,1693,1694,1695,1698],{},"You can't write ",[29,1696,1697],{},"Some(x + 1)"," as a pattern. Guards exist for that. Patterns are structural; conditions go in guards.",[18,1700,1702],{"id":1701},"exhaustiveness","Exhaustiveness",[67,1704,1705],{"language":69},[71,1706,1708],{"className":73,"code":1707,"language":69,"meta":75,"style":75},"fn classify(c: Color) -> &'static str {\n    match c {\n        Color::Red => \"red\",\n        \u002F\u002F ERROR if missing Green\u002FBlue\n    }\n}\n",[29,1709,1710,1743,1751,1768,1773,1778],{"__ignoreMap":75},[79,1711,1712,1714,1717,1720,1722,1725,1727,1729,1731,1734,1737,1740],{"class":81,"line":82},[79,1713,114],{"class":85},[79,1715,1716],{"class":117}," classify",[79,1718,1719],{"class":88},"(c",[79,1721,124],{"class":85},[79,1723,1724],{"class":117}," Color",[79,1726,810],{"class":88},[79,1728,139],{"class":85},[79,1730,1150],{"class":85},[79,1732,1733],{"class":88},"'",[79,1735,1736],{"class":117},"static",[79,1738,1739],{"class":117}," str",[79,1741,1742],{"class":88}," {\n",[79,1744,1745,1748],{"class":81,"line":111},[79,1746,1747],{"class":85},"    match",[79,1749,1750],{"class":88}," c {\n",[79,1752,1753,1756,1758,1761,1763,1766],{"class":81,"line":148},[79,1754,1755],{"class":117},"        Color",[79,1757,888],{"class":85},[79,1759,1760],{"class":117},"Red",[79,1762,212],{"class":85},[79,1764,1765],{"class":215}," \"red\"",[79,1767,397],{"class":88},[79,1769,1770],{"class":81,"line":343},[79,1771,1772],{"class":179},"        \u002F\u002F ERROR if missing Green\u002FBlue\n",[79,1774,1775],{"class":81,"line":434},[79,1776,1777],{"class":88},"    }\n",[79,1779,1780],{"class":81,"line":723},[79,1781,346],{"class":88},[14,1783,1784,1785,1787],{},"The compiler lists the missing patterns. Add ",[29,1786,284],{}," if you genuinely don't care, but be explicit when you can — exhaustiveness is a feature.",[18,1789,1791,1794],{"id":1790},"matches-macro",[29,1792,1793],{},"matches!"," Macro",[67,1796,1797],{"language":69},[71,1798,1800],{"className":73,"code":1799,"language":69,"meta":75,"style":75},"let is_some = matches!(opt, Some(_));\nlet in_range = matches!(n, 0..=9 | 100..=199);\n",[29,1801,1802,1823],{"__ignoreMap":75},[79,1803,1804,1806,1809,1811,1814,1817,1820],{"class":81,"line":82},[79,1805,46],{"class":85},[79,1807,1808],{"class":88}," is_some ",[79,1810,92],{"class":85},[79,1812,1813],{"class":117}," matches!",[79,1815,1816],{"class":88},"(opt, ",[79,1818,1819],{"class":117},"Some",[79,1821,1822],{"class":88},"(_));\n",[79,1824,1825,1827,1830,1832,1834,1837,1839,1841,1843,1845,1848,1850,1853],{"class":81,"line":111},[79,1826,46],{"class":85},[79,1828,1829],{"class":88}," in_range ",[79,1831,92],{"class":85},[79,1833,1813],{"class":117},[79,1835,1836],{"class":88},"(n, ",[79,1838,209],{"class":98},[79,1840,249],{"class":85},[79,1842,545],{"class":98},[79,1844,255],{"class":85},[79,1846,1847],{"class":98}," 100",[79,1849,249],{"class":85},[79,1851,1852],{"class":98},"199",[79,1854,108],{"class":88},[14,1856,1857,1858,162],{},"Concise one-arm matcher returning ",[29,1859,1860],{},"bool",[18,1862,1864],{"id":1863},"common-pitfalls","Common Pitfalls",[23,1866,1867,1882,1897,1911,1920,1941,1955,1964],{},[26,1868,1869,1873,1874,1877,1878,1881],{},[1870,1871,1872],"strong",{},"Variable shadowing in pattern",": ",[29,1875,1876],{},"match x { Some(x) => x, None => 0 }"," — the inner ",[29,1879,1880],{},"x"," shadows the outer; usually what you want, but easy to misread.",[26,1883,1884,1873,1891,1893,1894,1896],{},[1870,1885,1886,1888,1889],{},[29,1887,284],{}," vs ",[29,1890,352],{},[29,1892,284],{}," doesn't bind (drops the value), ",[29,1895,352],{}," binds (must be used or it warns).",[26,1898,1899,1902,1903,1906,1907,1910],{},[1870,1900,1901],{},"Binding mode surprises",": when matching ",[29,1904,1905],{},"&Option\u003Ci32>",", the bound variable is ",[29,1908,1909],{},"&i32",". The compiler prints the inferred type — read the error carefully.",[26,1912,1913,1916,1917,1919],{},[1870,1914,1915],{},"Match guard + exhaustiveness",": guards make the compiler treat arms as non-exhaustive. Always have a final ",[29,1918,284],{}," or cover every variant.",[26,1921,1922,1925,1926,1929,1930,1933,1934,1936,1937,1940],{},[1870,1923,1924],{},"Move-out in pattern",": matching ",[29,1927,1928],{},"Some(s)"," on a ",[29,1931,1932],{},"String","-carrying enum by value moves the ",[29,1935,1932],{},"; matching ",[29,1938,1939],{},"&Some(s)"," borrows it.",[26,1942,1943,1873,1946,1948,1949,1951,1952,1954],{},[1870,1944,1945],{},"Range patterns need contiguous types",[29,1947,249],{}," works for ",[29,1950,597],{}," and integers; ",[29,1953,1932],{}," can't be range-matched.",[26,1956,1957,1873,1960,1963],{},[1870,1958,1959],{},"Nested patterns",[29,1961,1962],{},"Some((Ok(x), _))"," is valid; patterns nest arbitrarily.",[26,1965,1966,1873,1969,1972,1973,1976],{},[1870,1967,1968],{},"Tuple struct variants",[29,1970,1971],{},"Message::Move { x, y }"," (struct form) vs ",[29,1974,1975],{},"Message::Write(s)"," (tuple form) — must use the form matching the variant.",[18,1978,1980,1982],{"id":1979},"let-patterns-and-refutability",[29,1981,46],{}," Patterns and Refutability",[23,1984,1985,2003,2010],{},[26,1986,1987,1990,1991,1994,1995,1998,1999,2002],{},[29,1988,1989],{},"let PATTERN = expr"," requires PATTERN to be ",[1870,1992,1993],{},"irrefutable"," (always matches): ",[29,1996,1997],{},"let (a, b) = tuple"," is fine; ",[29,2000,2001],{},"let Some(x) = opt"," is an error (refutable).",[26,2004,2005,1565,2007,2009],{},[29,2006,37],{},[29,2008,41],{}," accept refutable patterns.",[26,2011,2012,2014,2015,162],{},[29,2013,52],{}," bridges: ",[29,2016,2017],{},"let Some(x) = opt else { return; };",[18,2019,2021],{"id":2020},"summary","Summary",[14,2023,2024,2025,2027,2028,61,2030,2032,2033,2035],{},"Patterns are structural, support literals, ranges, or-patterns, destructuring, ",[29,2026,1101],{}," bindings, and guards. The 2021 binding modes reduced noise. Exhaustiveness is enforced. ",[29,2029,1564],{},[29,2031,1568],{}," are escape hatches for older patterns. ",[29,2034,1793],{}," is a tiny match for booleans.",[14,2037,2038,2039,102,2042,102,2044,2047],{},"Next: Collections (",[29,2040,2041],{},"Vec",[29,2043,1932],{},[29,2045,2046],{},"HashMap",", etc.).",[2049,2050,2051],"style",{},"html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html.github-dark .shiki span {color: var(--shiki-github-dark);background: var(--shiki-github-dark-bg);font-style: var(--shiki-github-dark-font-style);font-weight: var(--shiki-github-dark-font-weight);text-decoration: var(--shiki-github-dark-text-decoration);}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}",{"title":75,"searchDepth":111,"depth":111,"links":2053},[2054,2055,2074,2076,2078,2079,2080,2082,2083,2085],{"id":20,"depth":111,"text":21},{"id":186,"depth":111,"text":187,"children":2056},[2057,2058,2060,2061,2063,2065,2066,2067,2068,2069,2070,2071,2073],{"id":191,"depth":148,"text":192},{"id":280,"depth":148,"text":2059},"Wildcards _",{"id":290,"depth":148,"text":291},{"id":356,"depth":148,"text":2062},"Or-Patterns |",{"id":519,"depth":148,"text":2064},"Ranges ..=",{"id":604,"depth":148,"text":605},{"id":728,"depth":148,"text":729},{"id":865,"depth":148,"text":866},{"id":1022,"depth":148,"text":1023},{"id":1135,"depth":148,"text":1136},{"id":1291,"depth":148,"text":1292},{"id":1397,"depth":148,"text":2072},"@ Bindings",{"id":1480,"depth":148,"text":1481},{"id":1561,"depth":111,"text":2075},"ref and ref mut",{"id":1625,"depth":111,"text":2077},"Destructuring with ..",{"id":1690,"depth":111,"text":1691},{"id":1701,"depth":111,"text":1702},{"id":1790,"depth":111,"text":2081},"matches! Macro",{"id":1863,"depth":111,"text":1864},{"id":1979,"depth":111,"text":2084},"let Patterns and Refutability",{"id":2020,"depth":111,"text":2021},"md",{},true,"\u002Frust\u002F13-pattern-matching",{"title":5,"description":16},"rust\u002F13-pattern-matching","RY8G_gtypr2QBkoFlDtFdV6XJ95dC2NvJVpK--t948Y",1785944093230]