[{"data":1,"prerenderedAt":4238},["ShallowReactive",2],{"page-\u002Frust\u002F34-common-pitfalls":3},{"id":4,"title":5,"body":6,"description":16,"extension":4232,"meta":4233,"navigation":156,"path":4234,"seo":4235,"stem":4236,"__hash__":4237},"content\u002Frust\u002F34-common-pitfalls.md","34 — Common Pitfalls & Idiomatic Fixes",{"type":7,"value":8,"toc":4147},"minimark",[9,13,17,22,27,303,307,355,361,365,461,464,468,471,479,483,564,570,574,672,680,683,815,829,840,988,1009,1017,1195,1204,1208,1367,1374,1382,1554,1562,1716,1723,1796,1806,1810,1911,1920,1924,2023,2034,2042,2047,2205,2212,2225,2237,2357,2364,2587,2594,2681,2692,2704,2715,2731,2741,2774,2781,2789,2876,2881,2891,2897,2947,2955,3032,3041,3048,3153,3162,3173,3293,3296,3304,3345,3355,3362,3410,3419,3432,3449,3457,3558,3565,3630,3637,3728,3738,3746,3754,3768,3778,3785,3795,3813,3821,3829,3858,3866,3877,3965,3976,4000,4009,4013,4016,4034,4044,4048,4055,4062,4069,4073,4140,4143],[10,11,5],"h1",{"id":12},"_34-common-pitfalls-idiomatic-fixes",[14,15,16],"p",{},"A checklist of mistakes every Rust developer makes — and the idiomatic fix for each.",[18,19,21],"h2",{"id":20},"_1-fighting-the-borrow-checker","1. Fighting the Borrow Checker",[23,24,26],"h3",{"id":25},"symptom-cannot-borrow-as-mutable-because-it-is-also-borrowed-as-immutable","Symptom: \"cannot borrow as mutable because it is also borrowed as immutable\"",[28,29,31],"code-wrapper",{"language":30},"rust",[32,33,37],"pre",{"className":34,"code":35,"language":30,"meta":36,"style":36},"language-rust shiki shiki-themes github-light github-dark","\u002F\u002F Bad\nlet mut v = vec![1, 2, 3];\nlet r = &v[0];\nv.push(4);          \u002F\u002F ERROR\nprintln!(\"{r}\");\n\n\u002F\u002F Fix: end the borrow first\nlet r = &v[0];\nprintln!(\"{r}\");\nv.push(4);\n\n\u002F\u002F Fix: copy out\nlet r = v[0];       \u002F\u002F i32 is Copy\nv.push(4);\n\n\u002F\u002F Fix: clone\nlet r = v[0].clone();\nv.push(4);\n","",[38,39,40,49,91,112,136,151,158,164,181,192,207,212,218,238,253,258,264,288],"code",{"__ignoreMap":36},[41,42,45],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sdCPZ","\u002F\u002F Bad\n",[41,50,52,56,59,63,66,70,73,77,80,83,85,88],{"class":43,"line":51},2,[41,53,55],{"class":54},"svdQ7","let",[41,57,58],{"class":54}," mut",[41,60,62],{"class":61},"ssxIu"," v ",[41,64,65],{"class":54},"=",[41,67,69],{"class":68},"sIsaT"," vec!",[41,71,72],{"class":61},"[",[41,74,76],{"class":75},"snvgF","1",[41,78,79],{"class":61},", ",[41,81,82],{"class":75},"2",[41,84,79],{"class":61},[41,86,87],{"class":75},"3",[41,89,90],{"class":61},"];\n",[41,92,94,96,99,101,104,107,110],{"class":43,"line":93},3,[41,95,55],{"class":54},[41,97,98],{"class":61}," r ",[41,100,65],{"class":54},[41,102,103],{"class":54}," &",[41,105,106],{"class":61},"v[",[41,108,109],{"class":75},"0",[41,111,90],{"class":61},[41,113,115,118,121,124,127,130,133],{"class":43,"line":114},4,[41,116,117],{"class":61},"v",[41,119,120],{"class":54},".",[41,122,123],{"class":68},"push",[41,125,126],{"class":61},"(",[41,128,129],{"class":75},"4",[41,131,132],{"class":61},");          ",[41,134,135],{"class":47},"\u002F\u002F ERROR\n",[41,137,139,142,144,148],{"class":43,"line":138},5,[41,140,141],{"class":68},"println!",[41,143,126],{"class":61},[41,145,147],{"class":146},"sJ6F3","\"{r}\"",[41,149,150],{"class":61},");\n",[41,152,154],{"class":43,"line":153},6,[41,155,157],{"emptyLinePlaceholder":156},true,"\n",[41,159,161],{"class":43,"line":160},7,[41,162,163],{"class":47},"\u002F\u002F Fix: end the borrow first\n",[41,165,167,169,171,173,175,177,179],{"class":43,"line":166},8,[41,168,55],{"class":54},[41,170,98],{"class":61},[41,172,65],{"class":54},[41,174,103],{"class":54},[41,176,106],{"class":61},[41,178,109],{"class":75},[41,180,90],{"class":61},[41,182,184,186,188,190],{"class":43,"line":183},9,[41,185,141],{"class":68},[41,187,126],{"class":61},[41,189,147],{"class":146},[41,191,150],{"class":61},[41,193,195,197,199,201,203,205],{"class":43,"line":194},10,[41,196,117],{"class":61},[41,198,120],{"class":54},[41,200,123],{"class":68},[41,202,126],{"class":61},[41,204,129],{"class":75},[41,206,150],{"class":61},[41,208,210],{"class":43,"line":209},11,[41,211,157],{"emptyLinePlaceholder":156},[41,213,215],{"class":43,"line":214},12,[41,216,217],{"class":47},"\u002F\u002F Fix: copy out\n",[41,219,221,223,225,227,230,232,235],{"class":43,"line":220},13,[41,222,55],{"class":54},[41,224,98],{"class":61},[41,226,65],{"class":54},[41,228,229],{"class":61}," v[",[41,231,109],{"class":75},[41,233,234],{"class":61},"];       ",[41,236,237],{"class":47},"\u002F\u002F i32 is Copy\n",[41,239,241,243,245,247,249,251],{"class":43,"line":240},14,[41,242,117],{"class":61},[41,244,120],{"class":54},[41,246,123],{"class":68},[41,248,126],{"class":61},[41,250,129],{"class":75},[41,252,150],{"class":61},[41,254,256],{"class":43,"line":255},15,[41,257,157],{"emptyLinePlaceholder":156},[41,259,261],{"class":43,"line":260},16,[41,262,263],{"class":47},"\u002F\u002F Fix: clone\n",[41,265,267,269,271,273,275,277,280,282,285],{"class":43,"line":266},17,[41,268,55],{"class":54},[41,270,98],{"class":61},[41,272,65],{"class":54},[41,274,229],{"class":61},[41,276,109],{"class":75},[41,278,279],{"class":61},"]",[41,281,120],{"class":54},[41,283,284],{"class":68},"clone",[41,286,287],{"class":61},"();\n",[41,289,291,293,295,297,299,301],{"class":43,"line":290},18,[41,292,117],{"class":61},[41,294,120],{"class":54},[41,296,123],{"class":68},[41,298,126],{"class":61},[41,300,129],{"class":75},[41,302,150],{"class":61},[23,304,306],{"id":305},"symptom-cannot-borrow-as-mutable-as-it-is-not-declared-as-mut","Symptom: \"cannot borrow as mutable, as it is not declared as mut\"",[28,308,309],{"language":30},[32,310,312],{"className":34,"code":311,"language":30,"meta":36,"style":36},"let s = String::from(\"hi\");\nlet r = &mut s;     \u002F\u002F ERROR\n",[38,313,314,339],{"__ignoreMap":36},[41,315,316,318,321,323,326,329,332,334,337],{"class":43,"line":44},[41,317,55],{"class":54},[41,319,320],{"class":61}," s ",[41,322,65],{"class":54},[41,324,325],{"class":68}," String",[41,327,328],{"class":54},"::",[41,330,331],{"class":68},"from",[41,333,126],{"class":61},[41,335,336],{"class":146},"\"hi\"",[41,338,150],{"class":61},[41,340,341,343,345,347,350,353],{"class":43,"line":51},[41,342,55],{"class":54},[41,344,98],{"class":61},[41,346,65],{"class":54},[41,348,349],{"class":54}," &mut",[41,351,352],{"class":61}," s;     ",[41,354,135],{"class":47},[14,356,357,358,120],{},"Fix: ",[38,359,360],{},"let mut s = String::from(\"hi\");",[23,362,364],{"id":363},"symptom-borrowed-value-does-not-live-long-enough","Symptom: \"borrowed value does not live long enough\"",[28,366,367],{"language":30},[32,368,370],{"className":34,"code":369,"language":30,"meta":36,"style":36},"\u002F\u002F Bad\nfn bad() -> &str { let s = String::from(\"hi\"); &s }\n\n\u002F\u002F Fix: return owned\nfn good() -> String { String::from(\"hi\") }\n",[38,371,372,376,423,427,432],{"__ignoreMap":36},[41,373,374],{"class":43,"line":44},[41,375,48],{"class":47},[41,377,378,381,384,387,390,392,395,398,400,402,404,406,408,410,412,414,417,420],{"class":43,"line":51},[41,379,380],{"class":54},"fn",[41,382,383],{"class":68}," bad",[41,385,386],{"class":61},"() ",[41,388,389],{"class":54},"->",[41,391,103],{"class":54},[41,393,394],{"class":68},"str",[41,396,397],{"class":61}," { ",[41,399,55],{"class":54},[41,401,320],{"class":61},[41,403,65],{"class":54},[41,405,325],{"class":68},[41,407,328],{"class":54},[41,409,331],{"class":68},[41,411,126],{"class":61},[41,413,336],{"class":146},[41,415,416],{"class":61},"); ",[41,418,419],{"class":54},"&",[41,421,422],{"class":61},"s }\n",[41,424,425],{"class":43,"line":93},[41,426,157],{"emptyLinePlaceholder":156},[41,428,429],{"class":43,"line":114},[41,430,431],{"class":47},"\u002F\u002F Fix: return owned\n",[41,433,434,436,439,441,443,445,447,450,452,454,456,458],{"class":43,"line":138},[41,435,380],{"class":54},[41,437,438],{"class":68}," good",[41,440,386],{"class":61},[41,442,389],{"class":54},[41,444,325],{"class":68},[41,446,397],{"class":61},[41,448,449],{"class":68},"String",[41,451,328],{"class":54},[41,453,331],{"class":68},[41,455,126],{"class":61},[41,457,336],{"class":146},[41,459,460],{"class":61},") }\n",[14,462,463],{},"Returning a reference to a local is impossible. Return owned, or accept the data as input.",[23,465,467],{"id":466},"symptom-returns-a-value-referencing-data-owned-by-the-current-function","Symptom: \"returns a value referencing data owned by the current function\"",[14,469,470],{},"Same as above. Return owned, or restructure so the data lives outside the function.",[18,472,474,475,478],{"id":473},"_2-move-closure-footguns","2. ",[38,476,477],{},"move"," Closure Footguns",[23,480,482],{"id":481},"symptom-closure-captures-too-much","Symptom: closure captures too much",[28,484,485],{"language":30},[32,486,488],{"className":34,"code":487,"language":30,"meta":36,"style":36},"let v = vec![1, 2, 3];\nlet n = 5;\nlet f = move || { println!(\"{n}\"); };   \u002F\u002F moves n, doesn't need v\n\u002F\u002F v still owned — but if closure captured v, v would be gone\n",[38,489,490,514,529,559],{"__ignoreMap":36},[41,491,492,494,496,498,500,502,504,506,508,510,512],{"class":43,"line":44},[41,493,55],{"class":54},[41,495,62],{"class":61},[41,497,65],{"class":54},[41,499,69],{"class":68},[41,501,72],{"class":61},[41,503,76],{"class":75},[41,505,79],{"class":61},[41,507,82],{"class":75},[41,509,79],{"class":61},[41,511,87],{"class":75},[41,513,90],{"class":61},[41,515,516,518,521,523,526],{"class":43,"line":51},[41,517,55],{"class":54},[41,519,520],{"class":61}," n ",[41,522,65],{"class":54},[41,524,525],{"class":75}," 5",[41,527,528],{"class":61},";\n",[41,530,531,533,536,538,541,544,546,548,550,553,556],{"class":43,"line":93},[41,532,55],{"class":54},[41,534,535],{"class":61}," f ",[41,537,65],{"class":54},[41,539,540],{"class":54}," move",[41,542,543],{"class":54}," ||",[41,545,397],{"class":61},[41,547,141],{"class":68},[41,549,126],{"class":61},[41,551,552],{"class":146},"\"{n}\"",[41,554,555],{"class":61},"); };   ",[41,557,558],{"class":47},"\u002F\u002F moves n, doesn't need v\n",[41,560,561],{"class":43,"line":114},[41,562,563],{"class":47},"\u002F\u002F v still owned — but if closure captured v, v would be gone\n",[14,565,566,567,569],{},"Edition 2021 captures only used variables, but ",[38,568,477],{}," still moves all of them.",[23,571,573],{"id":572},"symptom-lifetime-issues-with-thread-closure","Symptom: lifetime issues with thread closure",[28,575,576],{"language":30},[32,577,579],{"className":34,"code":578,"language":30,"meta":36,"style":36},"let s = String::from(\"hi\");\nstd::thread::spawn(|| println!(\"{s}\"));    \u002F\u002F ERROR: 'static required\n\u002F\u002F Fix\nstd::thread::spawn(move || println!(\"{s}\"));\n\u002F\u002F or clone\n",[38,580,581,601,635,640,667],{"__ignoreMap":36},[41,582,583,585,587,589,591,593,595,597,599],{"class":43,"line":44},[41,584,55],{"class":54},[41,586,320],{"class":61},[41,588,65],{"class":54},[41,590,325],{"class":68},[41,592,328],{"class":54},[41,594,331],{"class":68},[41,596,126],{"class":61},[41,598,336],{"class":146},[41,600,150],{"class":61},[41,602,603,606,608,611,613,616,618,621,624,626,629,632],{"class":43,"line":51},[41,604,605],{"class":68},"std",[41,607,328],{"class":54},[41,609,610],{"class":68},"thread",[41,612,328],{"class":54},[41,614,615],{"class":68},"spawn",[41,617,126],{"class":61},[41,619,620],{"class":54},"||",[41,622,623],{"class":68}," println!",[41,625,126],{"class":61},[41,627,628],{"class":146},"\"{s}\"",[41,630,631],{"class":61},"));    ",[41,633,634],{"class":47},"\u002F\u002F ERROR: 'static required\n",[41,636,637],{"class":43,"line":93},[41,638,639],{"class":47},"\u002F\u002F Fix\n",[41,641,642,644,646,648,650,652,654,656,658,660,662,664],{"class":43,"line":114},[41,643,605],{"class":68},[41,645,328],{"class":54},[41,647,610],{"class":68},[41,649,328],{"class":54},[41,651,615],{"class":68},[41,653,126],{"class":61},[41,655,477],{"class":54},[41,657,543],{"class":54},[41,659,623],{"class":68},[41,661,126],{"class":61},[41,663,628],{"class":146},[41,665,666],{"class":61},"));\n",[41,668,669],{"class":43,"line":138},[41,670,671],{"class":47},"\u002F\u002F or clone\n",[18,673,675,676,679],{"id":674},"_3-clone-everywhere","3. ",[38,677,678],{},"clone()"," Everywhere",[14,681,682],{},"Cloning is fine when necessary but often signals a design issue:",[28,684,685],{"language":30},[32,686,688],{"className":34,"code":687,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nfn process(s: String) { \u002F* ... *\u002F }\nlet s = String::from(\"hi\");\nprocess(s.clone());\nprocess(s.clone());\n\n\u002F\u002F Better: borrow\nfn process(s: &str) { \u002F* ... *\u002F }\nprocess(&s);\nprocess(&s);\n",[38,689,690,695,719,739,753,765,769,774,794,805],{"__ignoreMap":36},[41,691,692],{"class":43,"line":44},[41,693,694],{"class":47},"\u002F\u002F Smelly\n",[41,696,697,699,702,705,708,710,713,716],{"class":43,"line":51},[41,698,380],{"class":54},[41,700,701],{"class":68}," process",[41,703,704],{"class":61},"(s",[41,706,707],{"class":54},":",[41,709,325],{"class":68},[41,711,712],{"class":61},") { ",[41,714,715],{"class":47},"\u002F* ... *\u002F",[41,717,718],{"class":61}," }\n",[41,720,721,723,725,727,729,731,733,735,737],{"class":43,"line":93},[41,722,55],{"class":54},[41,724,320],{"class":61},[41,726,65],{"class":54},[41,728,325],{"class":68},[41,730,328],{"class":54},[41,732,331],{"class":68},[41,734,126],{"class":61},[41,736,336],{"class":146},[41,738,150],{"class":61},[41,740,741,744,746,748,750],{"class":43,"line":114},[41,742,743],{"class":68},"process",[41,745,704],{"class":61},[41,747,120],{"class":54},[41,749,284],{"class":68},[41,751,752],{"class":61},"());\n",[41,754,755,757,759,761,763],{"class":43,"line":138},[41,756,743],{"class":68},[41,758,704],{"class":61},[41,760,120],{"class":54},[41,762,284],{"class":68},[41,764,752],{"class":61},[41,766,767],{"class":43,"line":153},[41,768,157],{"emptyLinePlaceholder":156},[41,770,771],{"class":43,"line":160},[41,772,773],{"class":47},"\u002F\u002F Better: borrow\n",[41,775,776,778,780,782,784,786,788,790,792],{"class":43,"line":166},[41,777,380],{"class":54},[41,779,701],{"class":68},[41,781,704],{"class":61},[41,783,707],{"class":54},[41,785,103],{"class":54},[41,787,394],{"class":68},[41,789,712],{"class":61},[41,791,715],{"class":47},[41,793,718],{"class":61},[41,795,796,798,800,802],{"class":43,"line":183},[41,797,743],{"class":68},[41,799,126],{"class":61},[41,801,419],{"class":54},[41,803,804],{"class":61},"s);\n",[41,806,807,809,811,813],{"class":43,"line":194},[41,808,743],{"class":68},[41,810,126],{"class":61},[41,812,419],{"class":54},[41,814,804],{"class":61},[14,816,817,818,821,822,821,825,828],{},"Borrow by ",[38,819,820],{},"&str","\u002F",[38,823,824],{},"&[T]",[38,826,827],{},"&Path"," when you don't need ownership.",[18,830,832,833,821,836,839],{"id":831},"_4-unwrapexpect-in-production","4. ",[38,834,835],{},"unwrap()",[38,837,838],{},"expect()"," in Production",[28,841,842],{"language":30},[32,843,845],{"className":34,"code":844,"language":30,"meta":36,"style":36},"\u002F\u002F Bad\nfn parse(s: &str) -> i32 { s.parse().unwrap() }\n\n\u002F\u002F Good\nfn parse(s: &str) -> Result\u003Ci32, ParseIntError> { s.parse() }\n\u002F\u002F or\nfn parse_or_default(s: &str) -> i32 { s.parse().unwrap_or(0) }\n",[38,846,847,851,893,897,902,943,948],{"__ignoreMap":36},[41,848,849],{"class":43,"line":44},[41,850,48],{"class":47},[41,852,853,855,858,860,862,864,866,869,871,874,877,879,882,885,887,890],{"class":43,"line":51},[41,854,380],{"class":54},[41,856,857],{"class":68}," parse",[41,859,704],{"class":61},[41,861,707],{"class":54},[41,863,103],{"class":54},[41,865,394],{"class":68},[41,867,868],{"class":61},") ",[41,870,389],{"class":54},[41,872,873],{"class":68}," i32",[41,875,876],{"class":61}," { s",[41,878,120],{"class":54},[41,880,881],{"class":68},"parse",[41,883,884],{"class":61},"()",[41,886,120],{"class":54},[41,888,889],{"class":68},"unwrap",[41,891,892],{"class":61},"() }\n",[41,894,895],{"class":43,"line":93},[41,896,157],{"emptyLinePlaceholder":156},[41,898,899],{"class":43,"line":114},[41,900,901],{"class":47},"\u002F\u002F Good\n",[41,903,904,906,908,910,912,914,916,918,920,923,926,929,931,934,937,939,941],{"class":43,"line":138},[41,905,380],{"class":54},[41,907,857],{"class":68},[41,909,704],{"class":61},[41,911,707],{"class":54},[41,913,103],{"class":54},[41,915,394],{"class":68},[41,917,868],{"class":61},[41,919,389],{"class":54},[41,921,922],{"class":68}," Result",[41,924,925],{"class":61},"\u003C",[41,927,928],{"class":68},"i32",[41,930,79],{"class":61},[41,932,933],{"class":68},"ParseIntError",[41,935,936],{"class":61},"> { s",[41,938,120],{"class":54},[41,940,881],{"class":68},[41,942,892],{"class":61},[41,944,945],{"class":43,"line":153},[41,946,947],{"class":47},"\u002F\u002F or\n",[41,949,950,952,955,957,959,961,963,965,967,969,971,973,975,977,979,982,984,986],{"class":43,"line":160},[41,951,380],{"class":54},[41,953,954],{"class":68}," parse_or_default",[41,956,704],{"class":61},[41,958,707],{"class":54},[41,960,103],{"class":54},[41,962,394],{"class":68},[41,964,868],{"class":61},[41,966,389],{"class":54},[41,968,873],{"class":68},[41,970,876],{"class":61},[41,972,120],{"class":54},[41,974,881],{"class":68},[41,976,884],{"class":61},[41,978,120],{"class":54},[41,980,981],{"class":68},"unwrap_or",[41,983,126],{"class":61},[41,985,109],{"class":75},[41,987,460],{"class":61},[14,989,990,992,993,821,996,999,1000,79,1003,79,1005,1008],{},[38,991,889],{}," panics on ",[38,994,995],{},"None",[38,997,998],{},"Err",". Use ",[38,1001,1002],{},"?",[38,1004,981],{},[38,1006,1007],{},"unwrap_or_default",", or explicit match.",[18,1010,1012,1013,1016],{"id":1011},"_5-treating-result-like-exceptions","5. Treating ",[38,1014,1015],{},"Result"," Like Exceptions",[28,1018,1019],{"language":30},[32,1020,1022],{"className":34,"code":1021,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nfn process() {\n    let a: i32 = \"x\".parse().unwrap();\n    let b: i32 = \"y\".parse().unwrap();\n    \u002F\u002F ...\n}\n\n\u002F\u002F Idiomatic\nfn process() -> Result\u003C(), AppError> {\n    let a: i32 = \"x\".parse()?;\n    let b: i32 = \"y\".parse()?;\n    Ok(())\n}\n",[38,1023,1024,1028,1037,1067,1095,1100,1105,1109,1114,1135,1159,1183,1191],{"__ignoreMap":36},[41,1025,1026],{"class":43,"line":44},[41,1027,694],{"class":47},[41,1029,1030,1032,1034],{"class":43,"line":51},[41,1031,380],{"class":54},[41,1033,701],{"class":68},[41,1035,1036],{"class":61},"() {\n",[41,1038,1039,1042,1045,1047,1049,1052,1055,1057,1059,1061,1063,1065],{"class":43,"line":93},[41,1040,1041],{"class":54},"    let",[41,1043,1044],{"class":61}," a",[41,1046,707],{"class":54},[41,1048,873],{"class":68},[41,1050,1051],{"class":54}," =",[41,1053,1054],{"class":146}," \"x\"",[41,1056,120],{"class":54},[41,1058,881],{"class":68},[41,1060,884],{"class":61},[41,1062,120],{"class":54},[41,1064,889],{"class":68},[41,1066,287],{"class":61},[41,1068,1069,1071,1074,1076,1078,1080,1083,1085,1087,1089,1091,1093],{"class":43,"line":114},[41,1070,1041],{"class":54},[41,1072,1073],{"class":61}," b",[41,1075,707],{"class":54},[41,1077,873],{"class":68},[41,1079,1051],{"class":54},[41,1081,1082],{"class":146}," \"y\"",[41,1084,120],{"class":54},[41,1086,881],{"class":68},[41,1088,884],{"class":61},[41,1090,120],{"class":54},[41,1092,889],{"class":68},[41,1094,287],{"class":61},[41,1096,1097],{"class":43,"line":138},[41,1098,1099],{"class":47},"    \u002F\u002F ...\n",[41,1101,1102],{"class":43,"line":153},[41,1103,1104],{"class":61},"}\n",[41,1106,1107],{"class":43,"line":160},[41,1108,157],{"emptyLinePlaceholder":156},[41,1110,1111],{"class":43,"line":166},[41,1112,1113],{"class":47},"\u002F\u002F Idiomatic\n",[41,1115,1116,1118,1120,1122,1124,1126,1129,1132],{"class":43,"line":183},[41,1117,380],{"class":54},[41,1119,701],{"class":68},[41,1121,386],{"class":61},[41,1123,389],{"class":54},[41,1125,922],{"class":68},[41,1127,1128],{"class":61},"\u003C(), ",[41,1130,1131],{"class":68},"AppError",[41,1133,1134],{"class":61},"> {\n",[41,1136,1137,1139,1141,1143,1145,1147,1149,1151,1153,1155,1157],{"class":43,"line":194},[41,1138,1041],{"class":54},[41,1140,1044],{"class":61},[41,1142,707],{"class":54},[41,1144,873],{"class":68},[41,1146,1051],{"class":54},[41,1148,1054],{"class":146},[41,1150,120],{"class":54},[41,1152,881],{"class":68},[41,1154,884],{"class":61},[41,1156,1002],{"class":54},[41,1158,528],{"class":61},[41,1160,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181],{"class":43,"line":209},[41,1162,1041],{"class":54},[41,1164,1073],{"class":61},[41,1166,707],{"class":54},[41,1168,873],{"class":68},[41,1170,1051],{"class":54},[41,1172,1082],{"class":146},[41,1174,120],{"class":54},[41,1176,881],{"class":68},[41,1178,884],{"class":61},[41,1180,1002],{"class":54},[41,1182,528],{"class":61},[41,1184,1185,1188],{"class":43,"line":214},[41,1186,1187],{"class":68},"    Ok",[41,1189,1190],{"class":61},"(())\n",[41,1192,1193],{"class":43,"line":220},[41,1194,1104],{"class":61},[14,1196,1197,1198,1200,1201,1203],{},"Propagate with ",[38,1199,1002],{},". Don't ",[38,1202,889],{}," in non-test paths.",[18,1205,1207],{"id":1206},"_6-mutable-global-state","6. Mutable Global State",[28,1209,1210],{"language":30},[32,1211,1213],{"className":34,"code":1212,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nstatic mut COUNTER: u32 = 0;\nfn incr() { unsafe { COUNTER += 1; } }\n\n\u002F\u002F Idiomatic\nuse std::sync::atomic::{AtomicUsize, Ordering};\nstatic COUNTER: AtomicUsize = AtomicUsize::new(0);\nfn incr() { COUNTER.fetch_add(1, Ordering::Relaxed); }\n",[38,1214,1215,1219,1241,1268,1272,1276,1310,1336],{"__ignoreMap":36},[41,1216,1217],{"class":43,"line":44},[41,1218,694],{"class":47},[41,1220,1221,1224,1226,1229,1231,1234,1236,1239],{"class":43,"line":51},[41,1222,1223],{"class":54},"static",[41,1225,58],{"class":54},[41,1227,1228],{"class":75}," COUNTER",[41,1230,707],{"class":54},[41,1232,1233],{"class":68}," u32",[41,1235,1051],{"class":54},[41,1237,1238],{"class":75}," 0",[41,1240,528],{"class":61},[41,1242,1243,1245,1248,1251,1254,1256,1259,1262,1265],{"class":43,"line":93},[41,1244,380],{"class":54},[41,1246,1247],{"class":68}," incr",[41,1249,1250],{"class":61},"() { ",[41,1252,1253],{"class":54},"unsafe",[41,1255,397],{"class":61},[41,1257,1258],{"class":75},"COUNTER",[41,1260,1261],{"class":54}," +=",[41,1263,1264],{"class":75}," 1",[41,1266,1267],{"class":61},"; } }\n",[41,1269,1270],{"class":43,"line":114},[41,1271,157],{"emptyLinePlaceholder":156},[41,1273,1274],{"class":43,"line":138},[41,1275,1113],{"class":47},[41,1277,1278,1281,1284,1286,1289,1291,1294,1296,1299,1302,1304,1307],{"class":43,"line":153},[41,1279,1280],{"class":54},"use",[41,1282,1283],{"class":68}," std",[41,1285,328],{"class":54},[41,1287,1288],{"class":68},"sync",[41,1290,328],{"class":54},[41,1292,1293],{"class":68},"atomic",[41,1295,328],{"class":54},[41,1297,1298],{"class":61},"{",[41,1300,1301],{"class":68},"AtomicUsize",[41,1303,79],{"class":61},[41,1305,1306],{"class":68},"Ordering",[41,1308,1309],{"class":61},"};\n",[41,1311,1312,1314,1316,1318,1321,1323,1325,1327,1330,1332,1334],{"class":43,"line":160},[41,1313,1223],{"class":54},[41,1315,1228],{"class":75},[41,1317,707],{"class":54},[41,1319,1320],{"class":68}," AtomicUsize",[41,1322,1051],{"class":54},[41,1324,1320],{"class":68},[41,1326,328],{"class":54},[41,1328,1329],{"class":68},"new",[41,1331,126],{"class":61},[41,1333,109],{"class":75},[41,1335,150],{"class":61},[41,1337,1338,1340,1342,1344,1346,1348,1351,1353,1355,1357,1359,1361,1364],{"class":43,"line":166},[41,1339,380],{"class":54},[41,1341,1247],{"class":68},[41,1343,1250],{"class":61},[41,1345,1258],{"class":75},[41,1347,120],{"class":54},[41,1349,1350],{"class":68},"fetch_add",[41,1352,126],{"class":61},[41,1354,76],{"class":75},[41,1356,79],{"class":61},[41,1358,1306],{"class":68},[41,1360,328],{"class":54},[41,1362,1363],{"class":68},"Relaxed",[41,1365,1366],{"class":61},"); }\n",[14,1368,1369,1370,1373],{},"Atomics or ",[38,1371,1372],{},"Arc\u003CMutex\u003CT>>"," are safe and testable.",[18,1375,1377,1378,1381],{"id":1376},"_7-vecvect-for-matrices","7. ",[38,1379,1380],{},"Vec\u003CVec\u003CT>>"," for Matrices",[28,1383,1384],{"language":30},[32,1385,1387],{"className":34,"code":1386,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly: cache-unfriendly\nlet m: Vec\u003CVec\u003Cf32>> = vec![vec![0.0; 100]; 100];\n\n\u002F\u002F Better: flat layout\nlet m: Vec\u003Cf32> = vec![0.0; 100 * 100];\nfn at(m: &[f32], x: usize, y: usize, w: usize) -> f32 { m[y * w + x] }\n",[38,1388,1389,1394,1446,1450,1455,1492],{"__ignoreMap":36},[41,1390,1391],{"class":43,"line":44},[41,1392,1393],{"class":47},"\u002F\u002F Smelly: cache-unfriendly\n",[41,1395,1396,1398,1401,1403,1406,1408,1411,1413,1416,1419,1421,1423,1425,1428,1430,1433,1436,1439,1442,1444],{"class":43,"line":51},[41,1397,55],{"class":54},[41,1399,1400],{"class":61}," m",[41,1402,707],{"class":54},[41,1404,1405],{"class":68}," Vec",[41,1407,925],{"class":61},[41,1409,1410],{"class":68},"Vec",[41,1412,925],{"class":61},[41,1414,1415],{"class":68},"f32",[41,1417,1418],{"class":61},">> ",[41,1420,65],{"class":54},[41,1422,69],{"class":68},[41,1424,72],{"class":61},[41,1426,1427],{"class":68},"vec!",[41,1429,72],{"class":61},[41,1431,1432],{"class":75},"0.0",[41,1434,1435],{"class":61},"; ",[41,1437,1438],{"class":75},"100",[41,1440,1441],{"class":61},"]; ",[41,1443,1438],{"class":75},[41,1445,90],{"class":61},[41,1447,1448],{"class":43,"line":93},[41,1449,157],{"emptyLinePlaceholder":156},[41,1451,1452],{"class":43,"line":114},[41,1453,1454],{"class":47},"\u002F\u002F Better: flat layout\n",[41,1456,1457,1459,1461,1463,1465,1467,1469,1472,1474,1476,1478,1480,1482,1484,1487,1490],{"class":43,"line":138},[41,1458,55],{"class":54},[41,1460,1400],{"class":61},[41,1462,707],{"class":54},[41,1464,1405],{"class":68},[41,1466,925],{"class":61},[41,1468,1415],{"class":68},[41,1470,1471],{"class":61},"> ",[41,1473,65],{"class":54},[41,1475,69],{"class":68},[41,1477,72],{"class":61},[41,1479,1432],{"class":75},[41,1481,1435],{"class":61},[41,1483,1438],{"class":75},[41,1485,1486],{"class":54}," *",[41,1488,1489],{"class":75}," 100",[41,1491,90],{"class":61},[41,1493,1494,1496,1499,1502,1504,1506,1508,1510,1513,1515,1518,1521,1523,1525,1528,1530,1532,1534,1536,1539,1542,1545,1548,1551],{"class":43,"line":153},[41,1495,380],{"class":54},[41,1497,1498],{"class":68}," at",[41,1500,1501],{"class":61},"(m",[41,1503,707],{"class":54},[41,1505,103],{"class":54},[41,1507,72],{"class":61},[41,1509,1415],{"class":68},[41,1511,1512],{"class":61},"], x",[41,1514,707],{"class":54},[41,1516,1517],{"class":68}," usize",[41,1519,1520],{"class":61},", y",[41,1522,707],{"class":54},[41,1524,1517],{"class":68},[41,1526,1527],{"class":61},", w",[41,1529,707],{"class":54},[41,1531,1517],{"class":68},[41,1533,868],{"class":61},[41,1535,389],{"class":54},[41,1537,1538],{"class":68}," f32",[41,1540,1541],{"class":61}," { m[y ",[41,1543,1544],{"class":54},"*",[41,1546,1547],{"class":61}," w ",[41,1549,1550],{"class":54},"+",[41,1552,1553],{"class":61}," x] }\n",[18,1555,1557,1558,1561],{"id":1556},"_8-vecu8-repeated-reallocations","8. ",[38,1559,1560],{},"Vec\u003Cu8>"," Repeated Reallocations",[28,1563,1564],{"language":30},[32,1565,1567],{"className":34,"code":1566,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nlet mut v = Vec::new();\nfor _ in 0..1000 { v.push(0u8); }    \u002F\u002F regrows ~10 times\n\n\u002F\u002F Better\nlet mut v = Vec::with_capacity(1000);\nfor _ in 0..1000 { v.push(0u8); }\n\u002F\u002F or\nlet v = vec![0u8; 1000];\n",[38,1568,1569,1573,1591,1630,1634,1639,1662,1690,1694],{"__ignoreMap":36},[41,1570,1571],{"class":43,"line":44},[41,1572,694],{"class":47},[41,1574,1575,1577,1579,1581,1583,1585,1587,1589],{"class":43,"line":51},[41,1576,55],{"class":54},[41,1578,58],{"class":54},[41,1580,62],{"class":61},[41,1582,65],{"class":54},[41,1584,1405],{"class":68},[41,1586,328],{"class":54},[41,1588,1329],{"class":68},[41,1590,287],{"class":61},[41,1592,1593,1596,1599,1602,1604,1607,1610,1613,1615,1617,1619,1621,1624,1627],{"class":43,"line":93},[41,1594,1595],{"class":54},"for",[41,1597,1598],{"class":61}," _ ",[41,1600,1601],{"class":54},"in",[41,1603,1238],{"class":75},[41,1605,1606],{"class":54},"..",[41,1608,1609],{"class":75},"1000",[41,1611,1612],{"class":61}," { v",[41,1614,120],{"class":54},[41,1616,123],{"class":68},[41,1618,126],{"class":61},[41,1620,109],{"class":75},[41,1622,1623],{"class":68},"u8",[41,1625,1626],{"class":61},"); }    ",[41,1628,1629],{"class":47},"\u002F\u002F regrows ~10 times\n",[41,1631,1632],{"class":43,"line":114},[41,1633,157],{"emptyLinePlaceholder":156},[41,1635,1636],{"class":43,"line":138},[41,1637,1638],{"class":47},"\u002F\u002F Better\n",[41,1640,1641,1643,1645,1647,1649,1651,1653,1656,1658,1660],{"class":43,"line":153},[41,1642,55],{"class":54},[41,1644,58],{"class":54},[41,1646,62],{"class":61},[41,1648,65],{"class":54},[41,1650,1405],{"class":68},[41,1652,328],{"class":54},[41,1654,1655],{"class":68},"with_capacity",[41,1657,126],{"class":61},[41,1659,1609],{"class":75},[41,1661,150],{"class":61},[41,1663,1664,1666,1668,1670,1672,1674,1676,1678,1680,1682,1684,1686,1688],{"class":43,"line":160},[41,1665,1595],{"class":54},[41,1667,1598],{"class":61},[41,1669,1601],{"class":54},[41,1671,1238],{"class":75},[41,1673,1606],{"class":54},[41,1675,1609],{"class":75},[41,1677,1612],{"class":61},[41,1679,120],{"class":54},[41,1681,123],{"class":68},[41,1683,126],{"class":61},[41,1685,109],{"class":75},[41,1687,1623],{"class":68},[41,1689,1366],{"class":61},[41,1691,1692],{"class":43,"line":166},[41,1693,947],{"class":47},[41,1695,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714],{"class":43,"line":183},[41,1697,55],{"class":54},[41,1699,62],{"class":61},[41,1701,65],{"class":54},[41,1703,69],{"class":68},[41,1705,72],{"class":61},[41,1707,109],{"class":75},[41,1709,1623],{"class":68},[41,1711,1435],{"class":61},[41,1713,1609],{"class":75},[41,1715,90],{"class":61},[18,1717,1719,1720,1722],{"id":1718},"_9-string-for-static-text","9. ",[38,1721,449],{}," for Static Text",[28,1724,1725],{"language":30},[32,1726,1728],{"className":34,"code":1727,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nfn label() -> String { String::from(\"OK\") }\n\n\u002F\u002F Better\nfn label() -> &'static str { \"OK\" }\n",[38,1729,1730,1734,1762,1766,1770],{"__ignoreMap":36},[41,1731,1732],{"class":43,"line":44},[41,1733,694],{"class":47},[41,1735,1736,1738,1741,1743,1745,1747,1749,1751,1753,1755,1757,1760],{"class":43,"line":51},[41,1737,380],{"class":54},[41,1739,1740],{"class":68}," label",[41,1742,386],{"class":61},[41,1744,389],{"class":54},[41,1746,325],{"class":68},[41,1748,397],{"class":61},[41,1750,449],{"class":68},[41,1752,328],{"class":54},[41,1754,331],{"class":68},[41,1756,126],{"class":61},[41,1758,1759],{"class":146},"\"OK\"",[41,1761,460],{"class":61},[41,1763,1764],{"class":43,"line":93},[41,1765,157],{"emptyLinePlaceholder":156},[41,1767,1768],{"class":43,"line":114},[41,1769,1638],{"class":47},[41,1771,1772,1774,1776,1778,1780,1782,1785,1787,1790,1792,1794],{"class":43,"line":138},[41,1773,380],{"class":54},[41,1775,1740],{"class":68},[41,1777,386],{"class":61},[41,1779,389],{"class":54},[41,1781,103],{"class":54},[41,1783,1784],{"class":61},"'",[41,1786,1223],{"class":68},[41,1788,1789],{"class":68}," str",[41,1791,397],{"class":61},[41,1793,1759],{"class":146},[41,1795,718],{"class":61},[14,1797,1798,1799,1802,1803,1805],{},"Return ",[38,1800,1801],{},"&'static str"," for compile-time constants; ",[38,1804,449],{}," only when constructed.",[18,1807,1809],{"id":1808},"_10-indexing-out-of-bounds","10. Indexing Out of Bounds",[28,1811,1812],{"language":30},[32,1813,1815],{"className":34,"code":1814,"language":30,"meta":36,"style":36},"\u002F\u002F Panics\nlet v = vec![1, 2, 3];\nlet x = v[5];\n\n\u002F\u002F Safe\nlet x = v.get(5).copied().unwrap_or(0);\n",[38,1816,1817,1822,1846,1862,1866,1871],{"__ignoreMap":36},[41,1818,1819],{"class":43,"line":44},[41,1820,1821],{"class":47},"\u002F\u002F Panics\n",[41,1823,1824,1826,1828,1830,1832,1834,1836,1838,1840,1842,1844],{"class":43,"line":51},[41,1825,55],{"class":54},[41,1827,62],{"class":61},[41,1829,65],{"class":54},[41,1831,69],{"class":68},[41,1833,72],{"class":61},[41,1835,76],{"class":75},[41,1837,79],{"class":61},[41,1839,82],{"class":75},[41,1841,79],{"class":61},[41,1843,87],{"class":75},[41,1845,90],{"class":61},[41,1847,1848,1850,1853,1855,1857,1860],{"class":43,"line":93},[41,1849,55],{"class":54},[41,1851,1852],{"class":61}," x ",[41,1854,65],{"class":54},[41,1856,229],{"class":61},[41,1858,1859],{"class":75},"5",[41,1861,90],{"class":61},[41,1863,1864],{"class":43,"line":114},[41,1865,157],{"emptyLinePlaceholder":156},[41,1867,1868],{"class":43,"line":138},[41,1869,1870],{"class":47},"\u002F\u002F Safe\n",[41,1872,1873,1875,1877,1879,1882,1884,1887,1889,1891,1894,1896,1899,1901,1903,1905,1907,1909],{"class":43,"line":153},[41,1874,55],{"class":54},[41,1876,1852],{"class":61},[41,1878,65],{"class":54},[41,1880,1881],{"class":61}," v",[41,1883,120],{"class":54},[41,1885,1886],{"class":68},"get",[41,1888,126],{"class":61},[41,1890,1859],{"class":75},[41,1892,1893],{"class":61},")",[41,1895,120],{"class":54},[41,1897,1898],{"class":68},"copied",[41,1900,884],{"class":61},[41,1902,120],{"class":54},[41,1904,981],{"class":68},[41,1906,126],{"class":61},[41,1908,109],{"class":75},[41,1910,150],{"class":61},[14,1912,1913,1914,821,1916,1919],{},"Use ",[38,1915,1886],{},[38,1917,1918],{},"get_mut"," when bounds are uncertain.",[18,1921,1923],{"id":1922},"_11-string-indexing-confusion","11. String Indexing Confusion",[28,1925,1926],{"language":30},[32,1927,1929],{"className":34,"code":1928,"language":30,"meta":36,"style":36},"let s = \"héllo\";\nlet c = s[0];       \u002F\u002F ERROR: String can't be indexed by integer\nlet b = s.as_bytes()[0];    \u002F\u002F u8, byte\nlet c = s.chars().nth(0);   \u002F\u002F Option\u003Cchar>\n",[38,1930,1931,1944,1963,1991],{"__ignoreMap":36},[41,1932,1933,1935,1937,1939,1942],{"class":43,"line":44},[41,1934,55],{"class":54},[41,1936,320],{"class":61},[41,1938,65],{"class":54},[41,1940,1941],{"class":146}," \"héllo\"",[41,1943,528],{"class":61},[41,1945,1946,1948,1951,1953,1956,1958,1960],{"class":43,"line":51},[41,1947,55],{"class":54},[41,1949,1950],{"class":61}," c ",[41,1952,65],{"class":54},[41,1954,1955],{"class":61}," s[",[41,1957,109],{"class":75},[41,1959,234],{"class":61},[41,1961,1962],{"class":47},"\u002F\u002F ERROR: String can't be indexed by integer\n",[41,1964,1965,1967,1970,1972,1975,1977,1980,1983,1985,1988],{"class":43,"line":93},[41,1966,55],{"class":54},[41,1968,1969],{"class":61}," b ",[41,1971,65],{"class":54},[41,1973,1974],{"class":61}," s",[41,1976,120],{"class":54},[41,1978,1979],{"class":68},"as_bytes",[41,1981,1982],{"class":61},"()[",[41,1984,109],{"class":75},[41,1986,1987],{"class":61},"];    ",[41,1989,1990],{"class":47},"\u002F\u002F u8, byte\n",[41,1992,1993,1995,1997,1999,2001,2003,2006,2008,2010,2013,2015,2017,2020],{"class":43,"line":114},[41,1994,55],{"class":54},[41,1996,1950],{"class":61},[41,1998,65],{"class":54},[41,2000,1974],{"class":61},[41,2002,120],{"class":54},[41,2004,2005],{"class":68},"chars",[41,2007,884],{"class":61},[41,2009,120],{"class":54},[41,2011,2012],{"class":68},"nth",[41,2014,126],{"class":61},[41,2016,109],{"class":75},[41,2018,2019],{"class":61},");   ",[41,2021,2022],{"class":47},"\u002F\u002F Option\u003Cchar>\n",[14,2024,2025,2026,2029,2030,2033],{},"UTF-8 strings don't support byte indexing semantically. Iterate ",[38,2027,2028],{},"chars()"," for code points, ",[38,2031,2032],{},"bytes()"," for bytes.",[18,2035,2037,2038,2041],{"id":2036},"_12-using-deref-for-inheritance","12. Using ",[38,2039,2040],{},"Deref"," for Inheritance",[14,2043,2044,2046],{},[38,2045,2040],{}," is for smart pointers, not modeling. Misuse leads to confusing method resolution:",[28,2048,2049],{"language":30},[32,2050,2052],{"className":34,"code":2051,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nstruct A { \u002F* ... *\u002F }\nstruct B(A);   \u002F\u002F hope to \"inherit\" A's methods\nimpl Deref for B { type Target = A; fn deref(&self) -> &A { &self.0 } }\n\u002F\u002F B.method_of_a() works, but it's misleading\n\n\u002F\u002F Better: explicit delegation\nimpl B {\n    fn method_of_a(&self) { self.0.method_of_a(); }\n}\n",[38,2053,2054,2058,2072,2089,2149,2154,2158,2163,2172,2201],{"__ignoreMap":36},[41,2055,2056],{"class":43,"line":44},[41,2057,694],{"class":47},[41,2059,2060,2063,2066,2068,2070],{"class":43,"line":51},[41,2061,2062],{"class":54},"struct",[41,2064,2065],{"class":68}," A",[41,2067,397],{"class":61},[41,2069,715],{"class":47},[41,2071,718],{"class":61},[41,2073,2074,2076,2079,2081,2084,2086],{"class":43,"line":93},[41,2075,2062],{"class":54},[41,2077,2078],{"class":68}," B",[41,2080,126],{"class":61},[41,2082,2083],{"class":68},"A",[41,2085,2019],{"class":61},[41,2087,2088],{"class":47},"\u002F\u002F hope to \"inherit\" A's methods\n",[41,2090,2091,2094,2097,2100,2102,2104,2107,2110,2112,2114,2116,2118,2121,2123,2125,2128,2130,2132,2134,2136,2138,2140,2142,2144,2146],{"class":43,"line":114},[41,2092,2093],{"class":54},"impl",[41,2095,2096],{"class":68}," Deref",[41,2098,2099],{"class":54}," for",[41,2101,2078],{"class":68},[41,2103,397],{"class":61},[41,2105,2106],{"class":54},"type",[41,2108,2109],{"class":68}," Target",[41,2111,1051],{"class":54},[41,2113,2065],{"class":68},[41,2115,1435],{"class":61},[41,2117,380],{"class":54},[41,2119,2120],{"class":68}," deref",[41,2122,126],{"class":61},[41,2124,419],{"class":54},[41,2126,2127],{"class":75},"self",[41,2129,868],{"class":61},[41,2131,389],{"class":54},[41,2133,103],{"class":54},[41,2135,2083],{"class":68},[41,2137,397],{"class":61},[41,2139,419],{"class":54},[41,2141,2127],{"class":75},[41,2143,120],{"class":54},[41,2145,109],{"class":75},[41,2147,2148],{"class":61}," } }\n",[41,2150,2151],{"class":43,"line":138},[41,2152,2153],{"class":47},"\u002F\u002F B.method_of_a() works, but it's misleading\n",[41,2155,2156],{"class":43,"line":153},[41,2157,157],{"emptyLinePlaceholder":156},[41,2159,2160],{"class":43,"line":160},[41,2161,2162],{"class":47},"\u002F\u002F Better: explicit delegation\n",[41,2164,2165,2167,2169],{"class":43,"line":166},[41,2166,2093],{"class":54},[41,2168,2078],{"class":68},[41,2170,2171],{"class":61}," {\n",[41,2173,2174,2177,2180,2182,2184,2186,2188,2190,2192,2195,2198],{"class":43,"line":183},[41,2175,2176],{"class":54},"    fn",[41,2178,2179],{"class":68}," method_of_a",[41,2181,126],{"class":61},[41,2183,419],{"class":54},[41,2185,2127],{"class":75},[41,2187,712],{"class":61},[41,2189,2127],{"class":75},[41,2191,120],{"class":54},[41,2193,2194],{"class":75},"0.",[41,2196,2197],{"class":68},"method_of_a",[41,2199,2200],{"class":61},"(); }\n",[41,2202,2203],{"class":43,"line":194},[41,2204,1104],{"class":61},[18,2206,2208,2209],{"id":2207},"_13-unsafe-impl-send-for-rct","13. ",[38,2210,2211],{},"unsafe impl Send for Rc\u003CT>",[14,2213,2214,2217,2218,2221,2222,120],{},[38,2215,2216],{},"Rc","'s refcount is non-atomic; making it ",[38,2219,2220],{},"Send"," causes data races. Use ",[38,2223,2224],{},"Arc",[18,2226,2228,2229,2232,2233,2236],{"id":2227},"_14-vecclone-where-rcclone-would-do","14. ",[38,2230,2231],{},"Vec::clone()"," Where ",[38,2234,2235],{},"Rc::clone"," Would Do",[28,2238,2239],{"language":30},[32,2240,2242],{"className":34,"code":2241,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly: deep clones the whole vec\nlet v = vec![1, 2, 3];\nlet v2 = v.clone();\n\n\u002F\u002F If sharing read-only data\nlet v = Rc::new(vec![1, 2, 3]);\nlet v2 = Rc::clone(&v);    \u002F\u002F just bumps refcount\n",[38,2243,2244,2249,2273,2290,2294,2299,2333],{"__ignoreMap":36},[41,2245,2246],{"class":43,"line":44},[41,2247,2248],{"class":47},"\u002F\u002F Smelly: deep clones the whole vec\n",[41,2250,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271],{"class":43,"line":51},[41,2252,55],{"class":54},[41,2254,62],{"class":61},[41,2256,65],{"class":54},[41,2258,69],{"class":68},[41,2260,72],{"class":61},[41,2262,76],{"class":75},[41,2264,79],{"class":61},[41,2266,82],{"class":75},[41,2268,79],{"class":61},[41,2270,87],{"class":75},[41,2272,90],{"class":61},[41,2274,2275,2277,2280,2282,2284,2286,2288],{"class":43,"line":93},[41,2276,55],{"class":54},[41,2278,2279],{"class":61}," v2 ",[41,2281,65],{"class":54},[41,2283,1881],{"class":61},[41,2285,120],{"class":54},[41,2287,284],{"class":68},[41,2289,287],{"class":61},[41,2291,2292],{"class":43,"line":114},[41,2293,157],{"emptyLinePlaceholder":156},[41,2295,2296],{"class":43,"line":138},[41,2297,2298],{"class":47},"\u002F\u002F If sharing read-only data\n",[41,2300,2301,2303,2305,2307,2310,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330],{"class":43,"line":153},[41,2302,55],{"class":54},[41,2304,62],{"class":61},[41,2306,65],{"class":54},[41,2308,2309],{"class":68}," Rc",[41,2311,328],{"class":54},[41,2313,1329],{"class":68},[41,2315,126],{"class":61},[41,2317,1427],{"class":68},[41,2319,72],{"class":61},[41,2321,76],{"class":75},[41,2323,79],{"class":61},[41,2325,82],{"class":75},[41,2327,79],{"class":61},[41,2329,87],{"class":75},[41,2331,2332],{"class":61},"]);\n",[41,2334,2335,2337,2339,2341,2343,2345,2347,2349,2351,2354],{"class":43,"line":160},[41,2336,55],{"class":54},[41,2338,2279],{"class":61},[41,2340,65],{"class":54},[41,2342,2309],{"class":68},[41,2344,328],{"class":54},[41,2346,284],{"class":68},[41,2348,126],{"class":61},[41,2350,419],{"class":54},[41,2352,2353],{"class":61},"v);    ",[41,2355,2356],{"class":47},"\u002F\u002F just bumps refcount\n",[18,2358,2360,2361],{"id":2359},"_15-locking-across-await","15. Locking Across ",[38,2362,2363],{},".await",[28,2365,2366],{"language":30},[32,2367,2369],{"className":34,"code":2368,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly: holding std::sync::Mutex across await\nlet m = std::sync::Mutex::new(0);\nlet g = m.lock().unwrap();\nsome_async().await;     \u002F\u002F ⚠️ held during await\ndrop(g);\n\n\u002F\u002F Better: drop before await\nlet v = { let g = m.lock().unwrap(); *g };\nsome_async(v).await;\n\n\u002F\u002F Or use tokio's async Mutex\nlet m = tokio::sync::Mutex::new(0);\nlet mut g = m.lock().await;\nsome_async(&mut *g).await;\n",[38,2370,2371,2376,2406,2430,2445,2453,2457,2462,2498,2509,2513,2518,2547,2569],{"__ignoreMap":36},[41,2372,2373],{"class":43,"line":44},[41,2374,2375],{"class":47},"\u002F\u002F Smelly: holding std::sync::Mutex across await\n",[41,2377,2378,2380,2383,2385,2387,2389,2391,2393,2396,2398,2400,2402,2404],{"class":43,"line":51},[41,2379,55],{"class":54},[41,2381,2382],{"class":61}," m ",[41,2384,65],{"class":54},[41,2386,1283],{"class":68},[41,2388,328],{"class":54},[41,2390,1288],{"class":68},[41,2392,328],{"class":54},[41,2394,2395],{"class":68},"Mutex",[41,2397,328],{"class":54},[41,2399,1329],{"class":68},[41,2401,126],{"class":61},[41,2403,109],{"class":75},[41,2405,150],{"class":61},[41,2407,2408,2410,2413,2415,2417,2419,2422,2424,2426,2428],{"class":43,"line":93},[41,2409,55],{"class":54},[41,2411,2412],{"class":61}," g ",[41,2414,65],{"class":54},[41,2416,1400],{"class":61},[41,2418,120],{"class":54},[41,2420,2421],{"class":68},"lock",[41,2423,884],{"class":61},[41,2425,120],{"class":54},[41,2427,889],{"class":68},[41,2429,287],{"class":61},[41,2431,2432,2435,2437,2439,2442],{"class":43,"line":114},[41,2433,2434],{"class":68},"some_async",[41,2436,884],{"class":61},[41,2438,2363],{"class":54},[41,2440,2441],{"class":61},";     ",[41,2443,2444],{"class":47},"\u002F\u002F ⚠️ held during await\n",[41,2446,2447,2450],{"class":43,"line":138},[41,2448,2449],{"class":68},"drop",[41,2451,2452],{"class":61},"(g);\n",[41,2454,2455],{"class":43,"line":153},[41,2456,157],{"emptyLinePlaceholder":156},[41,2458,2459],{"class":43,"line":160},[41,2460,2461],{"class":47},"\u002F\u002F Better: drop before await\n",[41,2463,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2493,2495],{"class":43,"line":166},[41,2465,55],{"class":54},[41,2467,62],{"class":61},[41,2469,65],{"class":54},[41,2471,397],{"class":61},[41,2473,55],{"class":54},[41,2475,2412],{"class":61},[41,2477,65],{"class":54},[41,2479,1400],{"class":61},[41,2481,120],{"class":54},[41,2483,2421],{"class":68},[41,2485,884],{"class":61},[41,2487,120],{"class":54},[41,2489,889],{"class":68},[41,2491,2492],{"class":61},"(); ",[41,2494,1544],{"class":54},[41,2496,2497],{"class":61},"g };\n",[41,2499,2500,2502,2505,2507],{"class":43,"line":183},[41,2501,2434],{"class":68},[41,2503,2504],{"class":61},"(v)",[41,2506,2363],{"class":54},[41,2508,528],{"class":61},[41,2510,2511],{"class":43,"line":194},[41,2512,157],{"emptyLinePlaceholder":156},[41,2514,2515],{"class":43,"line":209},[41,2516,2517],{"class":47},"\u002F\u002F Or use tokio's async Mutex\n",[41,2519,2520,2522,2524,2526,2529,2531,2533,2535,2537,2539,2541,2543,2545],{"class":43,"line":214},[41,2521,55],{"class":54},[41,2523,2382],{"class":61},[41,2525,65],{"class":54},[41,2527,2528],{"class":68}," tokio",[41,2530,328],{"class":54},[41,2532,1288],{"class":68},[41,2534,328],{"class":54},[41,2536,2395],{"class":68},[41,2538,328],{"class":54},[41,2540,1329],{"class":68},[41,2542,126],{"class":61},[41,2544,109],{"class":75},[41,2546,150],{"class":61},[41,2548,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567],{"class":43,"line":220},[41,2550,55],{"class":54},[41,2552,58],{"class":54},[41,2554,2412],{"class":61},[41,2556,65],{"class":54},[41,2558,1400],{"class":61},[41,2560,120],{"class":54},[41,2562,2421],{"class":68},[41,2564,884],{"class":61},[41,2566,2363],{"class":54},[41,2568,528],{"class":61},[41,2570,2571,2573,2575,2578,2580,2583,2585],{"class":43,"line":240},[41,2572,2434],{"class":68},[41,2574,126],{"class":61},[41,2576,2577],{"class":54},"&mut",[41,2579,1486],{"class":54},[41,2581,2582],{"class":61},"g)",[41,2584,2363],{"class":54},[41,2586,528],{"class":61},[18,2588,2590,2591,2593],{"id":2589},"_16-forgetting-move-in-async-blocks","16. Forgetting ",[38,2592,477],{}," in Async Blocks",[28,2595,2596],{"language":30},[32,2597,2599],{"className":34,"code":2598,"language":30,"meta":36,"style":36},"let v = vec![1, 2, 3];\nlet f = async { println!(\"{:?}\", v); };   \u002F\u002F borrows v\n\u002F\u002F f must outlive v — if returned\u002Fspawned, error\nlet f = async move { println!(\"{:?}\", v); };   \u002F\u002F moves v\n",[38,2600,2601,2625,2651,2656],{"__ignoreMap":36},[41,2602,2603,2605,2607,2609,2611,2613,2615,2617,2619,2621,2623],{"class":43,"line":44},[41,2604,55],{"class":54},[41,2606,62],{"class":61},[41,2608,65],{"class":54},[41,2610,69],{"class":68},[41,2612,72],{"class":61},[41,2614,76],{"class":75},[41,2616,79],{"class":61},[41,2618,82],{"class":75},[41,2620,79],{"class":61},[41,2622,87],{"class":75},[41,2624,90],{"class":61},[41,2626,2627,2629,2631,2633,2636,2638,2640,2642,2645,2648],{"class":43,"line":51},[41,2628,55],{"class":54},[41,2630,535],{"class":61},[41,2632,65],{"class":54},[41,2634,2635],{"class":54}," async",[41,2637,397],{"class":61},[41,2639,141],{"class":68},[41,2641,126],{"class":61},[41,2643,2644],{"class":146},"\"{:?}\"",[41,2646,2647],{"class":61},", v); };   ",[41,2649,2650],{"class":47},"\u002F\u002F borrows v\n",[41,2652,2653],{"class":43,"line":93},[41,2654,2655],{"class":47},"\u002F\u002F f must outlive v — if returned\u002Fspawned, error\n",[41,2657,2658,2660,2662,2664,2666,2668,2670,2672,2674,2676,2678],{"class":43,"line":114},[41,2659,55],{"class":54},[41,2661,535],{"class":61},[41,2663,65],{"class":54},[41,2665,2635],{"class":54},[41,2667,540],{"class":54},[41,2669,397],{"class":61},[41,2671,141],{"class":68},[41,2673,126],{"class":61},[41,2675,2644],{"class":146},[41,2677,2647],{"class":61},[41,2679,2680],{"class":47},"\u002F\u002F moves v\n",[18,2682,2684,2685,2688,2689],{"id":2683},"_17-arcclone-vs-cloneclone","17. ",[38,2686,2687],{},"Arc::clone"," vs ",[38,2690,2691],{},"Clone::clone",[14,2693,2694,2697,2698,2701,2702,120],{},[38,2695,2696],{},"Arc::clone(&arc)"," is identical to ",[38,2699,2700],{},"arc.clone()"," but signals \"this is cheap, just refcount\". Use ",[38,2703,2687],{},[18,2705,2707,2708,2688,2711,2714],{"id":2706},"_18-if-vs-match-for-two-path","18. ",[38,2709,2710],{},"if",[38,2712,2713],{},"match"," for Two-Path",[14,2716,2717,2720,2721,2723,2724,2727,2728,2730],{},[38,2718,2719],{},"if cond { } else { }"," is fine for booleans; ",[38,2722,2713],{}," is better for enum dispatch. Don't ",[38,2725,2726],{},"if let"," when a full ",[38,2729,2713],{}," is clearer.",[18,2732,2734,2735,2737,2738],{"id":2733},"_19-unwrap-on-lock","19. ",[38,2736,835],{}," on ",[38,2739,2740],{},"lock()",[28,2742,2743],{"language":30},[32,2744,2746],{"className":34,"code":2745,"language":30,"meta":36,"style":36},"let g = m.lock().unwrap();    \u002F\u002F panics on poison\n",[38,2747,2748],{"__ignoreMap":36},[41,2749,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768,2771],{"class":43,"line":44},[41,2751,55],{"class":54},[41,2753,2412],{"class":61},[41,2755,65],{"class":54},[41,2757,1400],{"class":61},[41,2759,120],{"class":54},[41,2761,2421],{"class":68},[41,2763,884],{"class":61},[41,2765,120],{"class":54},[41,2767,889],{"class":68},[41,2769,2770],{"class":61},"();    ",[41,2772,2773],{"class":47},"\u002F\u002F panics on poison\n",[14,2775,2776,2777,2780],{},"In production, decide a poison policy: ",[38,2778,2779],{},".lock().unwrap_or_else(|e| e.into_inner())"," to recover the data despite a panic.",[18,2782,2784,2785,2788],{"id":2783},"_20-boxdyn-trait-where-generic-works","20. ",[38,2786,2787],{},"Box\u003Cdyn Trait>"," Where Generic Works",[28,2790,2791],{"language":30},[32,2792,2794],{"className":34,"code":2793,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly: dyn for a single type\nfn process(items: Vec\u003CBox\u003Cdyn Process>>) { \u002F* ... *\u002F }\n\n\u002F\u002F Better: generic, monomorphizes\nfn process\u003CT: Process>(items: Vec\u003CT>) { \u002F* ... *\u002F }\n",[38,2795,2796,2801,2834,2838,2843],{"__ignoreMap":36},[41,2797,2798],{"class":43,"line":44},[41,2799,2800],{"class":47},"\u002F\u002F Smelly: dyn for a single type\n",[41,2802,2803,2805,2807,2810,2812,2814,2816,2819,2821,2824,2827,2830,2832],{"class":43,"line":51},[41,2804,380],{"class":54},[41,2806,701],{"class":68},[41,2808,2809],{"class":61},"(items",[41,2811,707],{"class":54},[41,2813,1405],{"class":68},[41,2815,925],{"class":61},[41,2817,2818],{"class":68},"Box",[41,2820,925],{"class":61},[41,2822,2823],{"class":54},"dyn",[41,2825,2826],{"class":68}," Process",[41,2828,2829],{"class":61},">>) { ",[41,2831,715],{"class":47},[41,2833,718],{"class":61},[41,2835,2836],{"class":43,"line":93},[41,2837,157],{"emptyLinePlaceholder":156},[41,2839,2840],{"class":43,"line":114},[41,2841,2842],{"class":47},"\u002F\u002F Better: generic, monomorphizes\n",[41,2844,2845,2847,2849,2851,2854,2856,2858,2861,2863,2865,2867,2869,2872,2874],{"class":43,"line":138},[41,2846,380],{"class":54},[41,2848,701],{"class":68},[41,2850,925],{"class":61},[41,2852,2853],{"class":68},"T",[41,2855,707],{"class":54},[41,2857,2826],{"class":68},[41,2859,2860],{"class":61},">(items",[41,2862,707],{"class":54},[41,2864,1405],{"class":68},[41,2866,925],{"class":61},[41,2868,2853],{"class":68},[41,2870,2871],{"class":61},">) { ",[41,2873,715],{"class":47},[41,2875,718],{"class":61},[14,2877,2878,2880],{},[38,2879,2823],{}," is for heterogeneous collections or when binary size matters.",[18,2882,2884,2885,2887,2888],{"id":2883},"_21-vecu8-from-read_to_end","21. ",[38,2886,1560],{}," from ",[38,2889,2890],{},"read_to_end",[14,2892,2893,2894,707],{},"If you know the size, ",[38,2895,2896],{},"Vec::with_capacity",[28,2898,2899],{"language":30},[32,2900,2902],{"className":34,"code":2901,"language":30,"meta":36,"style":36},"let mut v = Vec::with_capacity(1024);\nfile.read_to_end(&mut v)?;\n",[38,2903,2904,2927],{"__ignoreMap":36},[41,2905,2906,2908,2910,2912,2914,2916,2918,2920,2922,2925],{"class":43,"line":44},[41,2907,55],{"class":54},[41,2909,58],{"class":54},[41,2911,62],{"class":61},[41,2913,65],{"class":54},[41,2915,1405],{"class":68},[41,2917,328],{"class":54},[41,2919,1655],{"class":68},[41,2921,126],{"class":61},[41,2923,2924],{"class":75},"1024",[41,2926,150],{"class":61},[41,2928,2929,2932,2934,2936,2938,2940,2943,2945],{"class":43,"line":51},[41,2930,2931],{"class":61},"file",[41,2933,120],{"class":54},[41,2935,2890],{"class":68},[41,2937,126],{"class":61},[41,2939,2577],{"class":54},[41,2941,2942],{"class":61}," v)",[41,2944,1002],{"class":54},[41,2946,528],{"class":61},[18,2948,2950,2951,2954],{"id":2949},"_22-format-in-hot-loops","22. ",[38,2952,2953],{},"format!"," in Hot Loops",[28,2956,2957],{"language":30},[32,2958,2960],{"className":34,"code":2959,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nfor x in items { log::info!(\"{}\", format!(\"{:?}\", x)); }\n\n\u002F\u002F Better\nfor x in items { log::info!(\"{:?}\", x); }\n",[38,2961,2962,2966,3001,3005,3009],{"__ignoreMap":36},[41,2963,2964],{"class":43,"line":44},[41,2965,694],{"class":47},[41,2967,2968,2970,2972,2974,2977,2980,2982,2985,2987,2990,2992,2994,2996,2998],{"class":43,"line":51},[41,2969,1595],{"class":54},[41,2971,1852],{"class":61},[41,2973,1601],{"class":54},[41,2975,2976],{"class":61}," items { ",[41,2978,2979],{"class":68},"log",[41,2981,328],{"class":54},[41,2983,2984],{"class":68},"info!",[41,2986,126],{"class":61},[41,2988,2989],{"class":146},"\"{}\"",[41,2991,79],{"class":61},[41,2993,2953],{"class":68},[41,2995,126],{"class":61},[41,2997,2644],{"class":146},[41,2999,3000],{"class":61},", x)); }\n",[41,3002,3003],{"class":43,"line":93},[41,3004,157],{"emptyLinePlaceholder":156},[41,3006,3007],{"class":43,"line":114},[41,3008,1638],{"class":47},[41,3010,3011,3013,3015,3017,3019,3021,3023,3025,3027,3029],{"class":43,"line":138},[41,3012,1595],{"class":54},[41,3014,1852],{"class":61},[41,3016,1601],{"class":54},[41,3018,2976],{"class":61},[41,3020,2979],{"class":68},[41,3022,328],{"class":54},[41,3024,2984],{"class":68},[41,3026,126],{"class":61},[41,3028,2644],{"class":146},[41,3030,3031],{"class":61},", x); }\n",[14,3033,3034,3036,3037,3040],{},[38,3035,2953],{}," allocates. Use ",[38,3038,3039],{},"write!"," into a reused buffer if you must build a string in a loop.",[18,3042,3044,3045,3047],{"id":3043},"_23-returning-from-blocks-by-accident","23. Returning ",[38,3046,884],{}," From Blocks by Accident",[28,3049,3050],{"language":30},[32,3051,3053],{"className":34,"code":3052,"language":30,"meta":36,"style":36},"\u002F\u002F Bad\nfn foo() -> i32 {\n    let x = 5;\n    x + 1;     \u002F\u002F ; — block returns ()!\n}\n\n\u002F\u002F Good\nfn foo() -> i32 {\n    let x = 5;\n    x + 1       \u002F\u002F no semicolon — returns 6\n}\n",[38,3054,3055,3059,3074,3086,3100,3104,3108,3112,3126,3138,3149],{"__ignoreMap":36},[41,3056,3057],{"class":43,"line":44},[41,3058,48],{"class":47},[41,3060,3061,3063,3066,3068,3070,3072],{"class":43,"line":51},[41,3062,380],{"class":54},[41,3064,3065],{"class":68}," foo",[41,3067,386],{"class":61},[41,3069,389],{"class":54},[41,3071,873],{"class":68},[41,3073,2171],{"class":61},[41,3075,3076,3078,3080,3082,3084],{"class":43,"line":93},[41,3077,1041],{"class":54},[41,3079,1852],{"class":61},[41,3081,65],{"class":54},[41,3083,525],{"class":75},[41,3085,528],{"class":61},[41,3087,3088,3091,3093,3095,3097],{"class":43,"line":114},[41,3089,3090],{"class":61},"    x ",[41,3092,1550],{"class":54},[41,3094,1264],{"class":75},[41,3096,2441],{"class":61},[41,3098,3099],{"class":47},"\u002F\u002F ; — block returns ()!\n",[41,3101,3102],{"class":43,"line":138},[41,3103,1104],{"class":61},[41,3105,3106],{"class":43,"line":153},[41,3107,157],{"emptyLinePlaceholder":156},[41,3109,3110],{"class":43,"line":160},[41,3111,901],{"class":47},[41,3113,3114,3116,3118,3120,3122,3124],{"class":43,"line":166},[41,3115,380],{"class":54},[41,3117,3065],{"class":68},[41,3119,386],{"class":61},[41,3121,389],{"class":54},[41,3123,873],{"class":68},[41,3125,2171],{"class":61},[41,3127,3128,3130,3132,3134,3136],{"class":43,"line":183},[41,3129,1041],{"class":54},[41,3131,1852],{"class":61},[41,3133,65],{"class":54},[41,3135,525],{"class":75},[41,3137,528],{"class":61},[41,3139,3140,3142,3144,3146],{"class":43,"line":194},[41,3141,3090],{"class":61},[41,3143,1550],{"class":54},[41,3145,1264],{"class":75},[41,3147,3148],{"class":47},"       \u002F\u002F no semicolon — returns 6\n",[41,3150,3151],{"class":43,"line":209},[41,3152,1104],{"class":61},[14,3154,3155,3156,3159,3160,120],{},"A trailing ",[38,3157,3158],{},";"," turns an expression into a statement returning ",[38,3161,884],{},[18,3163,3165,3166,3168,3169,3172],{"id":3164},"_24-match-without-_-when-all-cases-matter","24. ",[38,3167,2713],{}," Without ",[38,3170,3171],{},"_"," When All Cases Matter",[28,3174,3175],{"language":30},[32,3176,3178],{"className":34,"code":3177,"language":30,"meta":36,"style":36},"\u002F\u002F Bad: silently breaks when a new variant is added\nmatch color {\n    Color::Red => 1,\n    _ => 0,    \u002F\u002F catches future variants\n}\n\n\u002F\u002F Better (until you've thought about it)\nmatch color {\n    Color::Red => 1,\n    Color::Green => 0,\n    Color::Blue => 0,\n}\n",[38,3179,3180,3185,3192,3210,3226,3230,3234,3239,3245,3259,3274,3289],{"__ignoreMap":36},[41,3181,3182],{"class":43,"line":44},[41,3183,3184],{"class":47},"\u002F\u002F Bad: silently breaks when a new variant is added\n",[41,3186,3187,3189],{"class":43,"line":51},[41,3188,2713],{"class":54},[41,3190,3191],{"class":61}," color {\n",[41,3193,3194,3197,3199,3202,3205,3207],{"class":43,"line":93},[41,3195,3196],{"class":68},"    Color",[41,3198,328],{"class":54},[41,3200,3201],{"class":68},"Red",[41,3203,3204],{"class":54}," =>",[41,3206,1264],{"class":75},[41,3208,3209],{"class":61},",\n",[41,3211,3212,3215,3218,3220,3223],{"class":43,"line":114},[41,3213,3214],{"class":61},"    _ ",[41,3216,3217],{"class":54},"=>",[41,3219,1238],{"class":75},[41,3221,3222],{"class":61},",    ",[41,3224,3225],{"class":47},"\u002F\u002F catches future variants\n",[41,3227,3228],{"class":43,"line":138},[41,3229,1104],{"class":61},[41,3231,3232],{"class":43,"line":153},[41,3233,157],{"emptyLinePlaceholder":156},[41,3235,3236],{"class":43,"line":160},[41,3237,3238],{"class":47},"\u002F\u002F Better (until you've thought about it)\n",[41,3240,3241,3243],{"class":43,"line":166},[41,3242,2713],{"class":54},[41,3244,3191],{"class":61},[41,3246,3247,3249,3251,3253,3255,3257],{"class":43,"line":183},[41,3248,3196],{"class":68},[41,3250,328],{"class":54},[41,3252,3201],{"class":68},[41,3254,3204],{"class":54},[41,3256,1264],{"class":75},[41,3258,3209],{"class":61},[41,3260,3261,3263,3265,3268,3270,3272],{"class":43,"line":194},[41,3262,3196],{"class":68},[41,3264,328],{"class":54},[41,3266,3267],{"class":68},"Green",[41,3269,3204],{"class":54},[41,3271,1238],{"class":75},[41,3273,3209],{"class":61},[41,3275,3276,3278,3280,3283,3285,3287],{"class":43,"line":209},[41,3277,3196],{"class":68},[41,3279,328],{"class":54},[41,3281,3282],{"class":68},"Blue",[41,3284,3204],{"class":54},[41,3286,1238],{"class":75},[41,3288,3209],{"class":61},[41,3290,3291],{"class":43,"line":214},[41,3292,1104],{"class":61},[14,3294,3295],{},"Let exhaustiveness drive you to handle new variants.",[18,3297,3299,3300,3303],{"id":3298},"_25-mut-you-dont-need","25. ",[38,3301,3302],{},"mut"," You Don't Need",[28,3305,3306],{"language":30},[32,3307,3309],{"className":34,"code":3308,"language":30,"meta":36,"style":36},"let mut x = 5;\nlet y = x + 1;     \u002F\u002F x never mutates — warning: unused mut\n",[38,3310,3311,3325],{"__ignoreMap":36},[41,3312,3313,3315,3317,3319,3321,3323],{"class":43,"line":44},[41,3314,55],{"class":54},[41,3316,58],{"class":54},[41,3318,1852],{"class":61},[41,3320,65],{"class":54},[41,3322,525],{"class":75},[41,3324,528],{"class":61},[41,3326,3327,3329,3332,3334,3336,3338,3340,3342],{"class":43,"line":51},[41,3328,55],{"class":54},[41,3330,3331],{"class":61}," y ",[41,3333,65],{"class":54},[41,3335,1852],{"class":61},[41,3337,1550],{"class":54},[41,3339,1264],{"class":75},[41,3341,2441],{"class":61},[41,3343,3344],{"class":47},"\u002F\u002F x never mutates — warning: unused mut\n",[14,3346,3347,3348,3350,3351,3354],{},"Remove ",[38,3349,3302],{}," or prefix ",[38,3352,3353],{},"_x"," if intentional.",[18,3356,3358,3359],{"id":3357},"_26-unreachable-unreachable","26. Unreachable ",[38,3360,3361],{},"unreachable!",[28,3363,3364],{"language":30},[32,3365,3367],{"className":34,"code":3366,"language":30,"meta":36,"style":36},"match opt {\n    Some(_) => 1,\n    None => unreachable!(),   \u002F\u002F will panic if someone passes None\n}\n",[38,3368,3369,3376,3390,3406],{"__ignoreMap":36},[41,3370,3371,3373],{"class":43,"line":44},[41,3372,2713],{"class":54},[41,3374,3375],{"class":61}," opt {\n",[41,3377,3378,3381,3384,3386,3388],{"class":43,"line":51},[41,3379,3380],{"class":68},"    Some",[41,3382,3383],{"class":61},"(_) ",[41,3385,3217],{"class":54},[41,3387,1264],{"class":75},[41,3389,3209],{"class":61},[41,3391,3392,3395,3397,3400,3403],{"class":43,"line":93},[41,3393,3394],{"class":68},"    None",[41,3396,3204],{"class":54},[41,3398,3399],{"class":68}," unreachable!",[41,3401,3402],{"class":61},"(),   ",[41,3404,3405],{"class":47},"\u002F\u002F will panic if someone passes None\n",[41,3407,3408],{"class":43,"line":114},[41,3409,1104],{"class":61},[14,3411,3412,3413,3415,3416,3418],{},"If the API allows ",[38,3414,995],{},", handle it. Reserve ",[38,3417,3361],{}," for truly impossible states.",[18,3420,3422,3423,2688,3426,2688,3429],{"id":3421},"_27-stringfrom-vs-to_string-vs-into","27. ",[38,3424,3425],{},"String::from",[38,3427,3428],{},".to_string()",[38,3430,3431],{},".into()",[14,3433,3434,3435,3437,3438,3441,3442,3445,3446,3448],{},"All three work for ",[38,3436,449],{},". ",[38,3439,3440],{},"into()"," is shortest, ",[38,3443,3444],{},"to_string()"," reads clearly, ",[38,3447,3425],{}," is explicit. Pick one and be consistent.",[18,3450,3452,3453,3456],{"id":3451},"_28-vect-parameters","28. ",[38,3454,3455],{},"&Vec\u003CT>"," Parameters",[28,3458,3459],{"language":30},[32,3460,3462],{"className":34,"code":3461,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly: forces caller to have a Vec\nfn sum(v: &Vec\u003Ci32>) -> i32 { v.iter().sum() }\n\n\u002F\u002F Better: accepts slices, arrays, Vec\nfn sum(v: &[i32]) -> i32 { v.iter().sum() }\n",[38,3463,3464,3469,3512,3516,3521],{"__ignoreMap":36},[41,3465,3466],{"class":43,"line":44},[41,3467,3468],{"class":47},"\u002F\u002F Smelly: forces caller to have a Vec\n",[41,3470,3471,3473,3476,3479,3481,3483,3485,3487,3489,3492,3494,3496,3498,3500,3503,3505,3507,3510],{"class":43,"line":51},[41,3472,380],{"class":54},[41,3474,3475],{"class":68}," sum",[41,3477,3478],{"class":61},"(v",[41,3480,707],{"class":54},[41,3482,103],{"class":54},[41,3484,1410],{"class":68},[41,3486,925],{"class":61},[41,3488,928],{"class":68},[41,3490,3491],{"class":61},">) ",[41,3493,389],{"class":54},[41,3495,873],{"class":68},[41,3497,1612],{"class":61},[41,3499,120],{"class":54},[41,3501,3502],{"class":68},"iter",[41,3504,884],{"class":61},[41,3506,120],{"class":54},[41,3508,3509],{"class":68},"sum",[41,3511,892],{"class":61},[41,3513,3514],{"class":43,"line":93},[41,3515,157],{"emptyLinePlaceholder":156},[41,3517,3518],{"class":43,"line":114},[41,3519,3520],{"class":47},"\u002F\u002F Better: accepts slices, arrays, Vec\n",[41,3522,3523,3525,3527,3529,3531,3533,3535,3537,3540,3542,3544,3546,3548,3550,3552,3554,3556],{"class":43,"line":138},[41,3524,380],{"class":54},[41,3526,3475],{"class":68},[41,3528,3478],{"class":61},[41,3530,707],{"class":54},[41,3532,103],{"class":54},[41,3534,72],{"class":61},[41,3536,928],{"class":68},[41,3538,3539],{"class":61},"]) ",[41,3541,389],{"class":54},[41,3543,873],{"class":68},[41,3545,1612],{"class":61},[41,3547,120],{"class":54},[41,3549,3502],{"class":68},[41,3551,884],{"class":61},[41,3553,120],{"class":54},[41,3555,3509],{"class":68},[41,3557,892],{"class":61},[18,3559,3561,3562,3456],{"id":3560},"_29-string-parameters","29. ",[38,3563,3564],{},"&String",[28,3566,3567],{"language":30},[32,3568,3570],{"className":34,"code":3569,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nfn greet(s: &String) { \u002F* ... *\u002F }\n\n\u002F\u002F Better\nfn greet(s: &str) { \u002F* ... *\u002F }\n\u002F\u002F accepts String, &str, literals\n",[38,3571,3572,3576,3597,3601,3605,3625],{"__ignoreMap":36},[41,3573,3574],{"class":43,"line":44},[41,3575,694],{"class":47},[41,3577,3578,3580,3583,3585,3587,3589,3591,3593,3595],{"class":43,"line":51},[41,3579,380],{"class":54},[41,3581,3582],{"class":68}," greet",[41,3584,704],{"class":61},[41,3586,707],{"class":54},[41,3588,103],{"class":54},[41,3590,449],{"class":68},[41,3592,712],{"class":61},[41,3594,715],{"class":47},[41,3596,718],{"class":61},[41,3598,3599],{"class":43,"line":93},[41,3600,157],{"emptyLinePlaceholder":156},[41,3602,3603],{"class":43,"line":114},[41,3604,1638],{"class":47},[41,3606,3607,3609,3611,3613,3615,3617,3619,3621,3623],{"class":43,"line":138},[41,3608,380],{"class":54},[41,3610,3582],{"class":68},[41,3612,704],{"class":61},[41,3614,707],{"class":54},[41,3616,103],{"class":54},[41,3618,394],{"class":68},[41,3620,712],{"class":61},[41,3622,715],{"class":47},[41,3624,718],{"class":61},[41,3626,3627],{"class":43,"line":153},[41,3628,3629],{"class":47},"\u002F\u002F accepts String, &str, literals\n",[18,3631,3633,3634],{"id":3632},"_30-if-xis_ok-xunwrap","30. ",[38,3635,3636],{},"if x.is_ok() { x.unwrap() }",[28,3638,3639],{"language":30},[32,3640,3642],{"className":34,"code":3641,"language":30,"meta":36,"style":36},"\u002F\u002F Smelly\nif let Ok(v) = result { \u002F* use v *\u002F }\n\n\u002F\u002F Idiomatic\nlet v = result?;\n\u002F\u002F or\nmatch result { Ok(v) => \u002F* use v *\u002F, Err(e) => \u002F* handle *\u002F }\n",[38,3643,3644,3648,3671,3675,3679,3694,3698],{"__ignoreMap":36},[41,3645,3646],{"class":43,"line":44},[41,3647,694],{"class":47},[41,3649,3650,3652,3655,3658,3661,3663,3666,3669],{"class":43,"line":51},[41,3651,2710],{"class":54},[41,3653,3654],{"class":54}," let",[41,3656,3657],{"class":68}," Ok",[41,3659,3660],{"class":61},"(v) ",[41,3662,65],{"class":54},[41,3664,3665],{"class":61}," result { ",[41,3667,3668],{"class":47},"\u002F* use v *\u002F",[41,3670,718],{"class":61},[41,3672,3673],{"class":43,"line":93},[41,3674,157],{"emptyLinePlaceholder":156},[41,3676,3677],{"class":43,"line":114},[41,3678,1113],{"class":47},[41,3680,3681,3683,3685,3687,3690,3692],{"class":43,"line":138},[41,3682,55],{"class":54},[41,3684,62],{"class":61},[41,3686,65],{"class":54},[41,3688,3689],{"class":61}," result",[41,3691,1002],{"class":54},[41,3693,528],{"class":61},[41,3695,3696],{"class":43,"line":153},[41,3697,947],{"class":47},[41,3699,3700,3702,3704,3707,3709,3711,3714,3716,3718,3721,3723,3726],{"class":43,"line":160},[41,3701,2713],{"class":54},[41,3703,3665],{"class":61},[41,3705,3706],{"class":68},"Ok",[41,3708,3660],{"class":61},[41,3710,3217],{"class":54},[41,3712,3713],{"class":47}," \u002F* use v *\u002F",[41,3715,79],{"class":61},[41,3717,998],{"class":68},[41,3719,3720],{"class":61},"(e) ",[41,3722,3217],{"class":54},[41,3724,3725],{"class":47}," \u002F* handle *\u002F",[41,3727,718],{"class":61},[18,3729,3731,3732,2688,3735],{"id":3730},"_31-vecnone-n-vs-vec0-n","31. ",[38,3733,3734],{},"vec![None; n]",[38,3736,3737],{},"vec![0; n]",[14,3739,3740,3742,3743,3745],{},[38,3741,3734],{}," works but takes 8 bytes\u002Felement on 64-bit. If you have a \"default\" sentinel, use ",[38,3744,3737],{}," for cache efficiency.",[18,3747,3749,3750,3753],{"id":3748},"_32-hashmap-iteration-order","32. ",[38,3751,3752],{},"HashMap"," Iteration Order",[14,3755,3756,3757,3759,3760,3763,3764,3767],{},"Don't depend on iteration order of ",[38,3758,3752],{}," — it's randomized per run. Use ",[38,3761,3762],{},"BTreeMap"," for ordered, or ",[38,3765,3766],{},"IndexMap"," for insertion order.",[18,3769,3771,3772,2688,3775],{"id":3770},"_33-stringnew-vs-stringwith_capacity","33. ",[38,3773,3774],{},"String::new()",[38,3776,3777],{},"String::with_capacity",[14,3779,3780,3781,3784],{},"If you'll push N chars, ",[38,3782,3783],{},"with_capacity(N)"," avoids regrow.",[18,3786,3788,3789,2688,3792],{"id":3787},"_34-stringfrom_utf8_lossy-vs-from_utf8","34. ",[38,3790,3791],{},"String::from_utf8_lossy",[38,3793,3794],{},"from_utf8",[14,3796,3797,3799,3800,1435,3802,3805,3806,3809,3810,3812],{},[38,3798,3794],{}," returns ",[38,3801,1015],{},[38,3803,3804],{},"from_utf8_lossy"," always returns a ",[38,3807,3808],{},"Cow"," with replacement chars. Use ",[38,3811,3794],{}," if invalid UTF-8 is an error.",[18,3814,3816,3817,3820],{"id":3815},"_35-forgetting-must_use-types","35. Forgetting ",[38,3818,3819],{},"#[must_use]"," Types",[14,3822,3823,79,3825,3828],{},[38,3824,1015],{},[38,3826,3827],{},"Option"," warn by default. For your types:",[28,3830,3831],{"language":30},[32,3832,3834],{"className":34,"code":3833,"language":30,"meta":36,"style":36},"#[must_use]\npub struct Handle { \u002F* ... *\u002F }\n",[38,3835,3836,3841],{"__ignoreMap":36},[41,3837,3838],{"class":43,"line":44},[41,3839,3840],{"class":61},"#[must_use]\n",[41,3842,3843,3846,3849,3852,3854,3856],{"class":43,"line":51},[41,3844,3845],{"class":54},"pub",[41,3847,3848],{"class":54}," struct",[41,3850,3851],{"class":68}," Handle",[41,3853,397],{"class":61},[41,3855,715],{"class":47},[41,3857,718],{"class":61},[18,3859,3861,3862,3865],{"id":3860},"_36-as-casts","36. ",[38,3863,3864],{},"as"," Casts",[14,3867,3868,3870,3871,821,3874,707],{},[38,3869,3864],{}," is unchecked and may truncate. Use ",[38,3872,3873],{},"TryFrom",[38,3875,3876],{},"TryInto",[28,3878,3879],{"language":30},[32,3880,3882],{"className":34,"code":3881,"language":30,"meta":36,"style":36},"\u002F\u002F Risky\nlet n: u8 = 1000u32 as u8;     \u002F\u002F 232, silently\n\n\u002F\u002F Safe\nlet n: u8 = 1000u32.try_into().unwrap_or(u8::MAX);\n",[38,3883,3884,3889,3919,3923,3927],{"__ignoreMap":36},[41,3885,3886],{"class":43,"line":44},[41,3887,3888],{"class":47},"\u002F\u002F Risky\n",[41,3890,3891,3893,3896,3898,3901,3903,3906,3909,3912,3914,3916],{"class":43,"line":51},[41,3892,55],{"class":54},[41,3894,3895],{"class":61}," n",[41,3897,707],{"class":54},[41,3899,3900],{"class":68}," u8",[41,3902,1051],{"class":54},[41,3904,3905],{"class":75}," 1000",[41,3907,3908],{"class":68},"u32",[41,3910,3911],{"class":54}," as",[41,3913,3900],{"class":68},[41,3915,2441],{"class":61},[41,3917,3918],{"class":47},"\u002F\u002F 232, silently\n",[41,3920,3921],{"class":43,"line":93},[41,3922,157],{"emptyLinePlaceholder":156},[41,3924,3925],{"class":43,"line":114},[41,3926,1870],{"class":47},[41,3928,3929,3931,3933,3935,3937,3939,3941,3943,3945,3948,3950,3952,3954,3956,3958,3960,3963],{"class":43,"line":138},[41,3930,55],{"class":54},[41,3932,3895],{"class":61},[41,3934,707],{"class":54},[41,3936,3900],{"class":68},[41,3938,1051],{"class":54},[41,3940,3905],{"class":75},[41,3942,3908],{"class":68},[41,3944,120],{"class":54},[41,3946,3947],{"class":68},"try_into",[41,3949,884],{"class":61},[41,3951,120],{"class":54},[41,3953,981],{"class":68},[41,3955,126],{"class":61},[41,3957,1623],{"class":68},[41,3959,328],{"class":54},[41,3961,3962],{"class":75},"MAX",[41,3964,150],{"class":61},[18,3966,3968,3969,3972,3973],{"id":3967},"_37-cargo-build-in-ci-without-locked","37. ",[38,3970,3971],{},"cargo build"," in CI Without ",[38,3974,3975],{},"--locked",[28,3977,3979],{"language":3978},"yaml",[32,3980,3983],{"className":3981,"code":3982,"language":3978,"meta":36,"style":36},"language-yaml shiki shiki-themes github-light github-dark","- run: cargo build --locked --release\n",[38,3984,3985],{"__ignoreMap":36},[41,3986,3987,3990,3994,3997],{"class":43,"line":44},[41,3988,3989],{"class":61},"- ",[41,3991,3993],{"class":3992},"sk71V","run",[41,3995,3996],{"class":61},": ",[41,3998,3999],{"class":146},"cargo build --locked --release\n",[14,4001,4002,4004,4005,4008],{},[38,4003,3975],{}," ensures ",[38,4006,4007],{},"Cargo.lock"," is honored (reproducible builds).",[18,4010,4012],{"id":4011},"_38-ignoring-clippy","38. Ignoring Clippy",[14,4014,4015],{},"Treat Clippy warnings as errors in CI:",[28,4017,4018],{"language":3978},[32,4019,4021],{"className":3981,"code":4020,"language":3978,"meta":36,"style":36},"- run: cargo clippy --all-targets -- -D warnings\n",[38,4022,4023],{"__ignoreMap":36},[41,4024,4025,4027,4029,4031],{"class":43,"line":44},[41,4026,3989],{"class":61},[41,4028,3993],{"class":3992},[41,4030,3996],{"class":61},[41,4032,4033],{"class":146},"cargo clippy --all-targets -- -D warnings\n",[14,4035,4036,4037,79,4040,4043],{},"Many lints catch real bugs (e.g., ",[38,4038,4039],{},"clippy::needless_collect",[38,4041,4042],{},"clippy::mem_forget",").",[18,4045,4047],{"id":4046},"_39-doc-tests-breaking-on-rust-version","39. Doc Tests Breaking on Rust Version",[14,4049,4050,4051,4054],{},"Pin a MSRV; CI runs ",[38,4052,4053],{},"cargo +1.75 test"," to catch regressions.",[18,4056,4058,4059,4061],{"id":4057},"_40-arcmutext-for-single-threaded-code","40. ",[38,4060,1372],{}," for Single-Threaded Code",[14,4063,4064,4065,4068],{},"If you're not actually going multi-threaded, plain ",[38,4066,4067],{},"Rc\u003CRefCell\u003CT>>"," is cheaper. Match the abstraction to the actual concurrency.",[18,4070,4072],{"id":4071},"summary","Summary",[4074,4075,4076,4080,4087,4097,4102,4108,4114,4122,4130],"ul",{},[4077,4078,4079],"li",{},"Borrow, don't clone, when you don't need ownership.",[4077,4081,4082,4084,4085,120],{},[38,4083,1002],{}," over ",[38,4086,889],{},[4077,4088,4089,821,4091,4084,4093,821,4095,120],{},[38,4090,820],{},[38,4092,824],{},[38,4094,3564],{},[38,4096,3455],{},[4077,4098,4099,4100,120],{},"Don't lock across ",[38,4101,2363],{},[4077,4103,4104,4105,4107],{},"Don't ",[38,4106,2040],{}," for inheritance.",[4077,4109,4110,4111,4113],{},"Generic over ",[38,4112,2823],{}," for hot paths.",[4077,4115,4116,4118,4119,4121],{},[38,4117,2713],{}," exhaustively; ",[38,4120,3171],{}," only when you've considered every variant.",[4077,4123,4124,4126,4127,120],{},[38,4125,3975],{}," in CI; clippy with ",[38,4128,4129],{},"-D warnings",[4077,4131,4132,4133,4136,4137,120],{},"Document ",[38,4134,4135],{},"\u002F\u002F SAFETY:"," in unsafe code; use ",[38,4138,4139],{},"Miri",[14,4141,4142],{},"Next: Final exam-style questions and project ideas.",[4144,4145,4146],"style",{},"html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}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 .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}html pre.shiki code .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}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 .sk71V, html code.shiki .sk71V{--shiki-default:#22863A;--shiki-github-dark:#85E89D}",{"title":36,"searchDepth":51,"depth":51,"links":4148},[4149,4155,4160,4162,4164,4166,4167,4169,4171,4173,4174,4175,4177,4179,4181,4183,4185,4187,4189,4191,4193,4195,4197,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219,4221,4223,4225,4227,4228,4229,4231],{"id":20,"depth":51,"text":21,"children":4150},[4151,4152,4153,4154],{"id":25,"depth":93,"text":26},{"id":305,"depth":93,"text":306},{"id":363,"depth":93,"text":364},{"id":466,"depth":93,"text":467},{"id":473,"depth":51,"text":4156,"children":4157},"2. move Closure Footguns",[4158,4159],{"id":481,"depth":93,"text":482},{"id":572,"depth":93,"text":573},{"id":674,"depth":51,"text":4161},"3. clone() Everywhere",{"id":831,"depth":51,"text":4163},"4. unwrap()\u002Fexpect() in Production",{"id":1011,"depth":51,"text":4165},"5. Treating Result Like Exceptions",{"id":1206,"depth":51,"text":1207},{"id":1376,"depth":51,"text":4168},"7. Vec\u003CVec\u003CT>> for Matrices",{"id":1556,"depth":51,"text":4170},"8. Vec\u003Cu8> Repeated Reallocations",{"id":1718,"depth":51,"text":4172},"9. String for Static Text",{"id":1808,"depth":51,"text":1809},{"id":1922,"depth":51,"text":1923},{"id":2036,"depth":51,"text":4176},"12. Using Deref for Inheritance",{"id":2207,"depth":51,"text":4178},"13. unsafe impl Send for Rc\u003CT>",{"id":2227,"depth":51,"text":4180},"14. Vec::clone() Where Rc::clone Would Do",{"id":2359,"depth":51,"text":4182},"15. Locking Across .await",{"id":2589,"depth":51,"text":4184},"16. Forgetting move in Async Blocks",{"id":2683,"depth":51,"text":4186},"17. Arc::clone vs Clone::clone",{"id":2706,"depth":51,"text":4188},"18. if vs match for Two-Path",{"id":2733,"depth":51,"text":4190},"19. unwrap() on lock()",{"id":2783,"depth":51,"text":4192},"20. Box\u003Cdyn Trait> Where Generic Works",{"id":2883,"depth":51,"text":4194},"21. Vec\u003Cu8> from read_to_end",{"id":2949,"depth":51,"text":4196},"22. format! in Hot Loops",{"id":3043,"depth":51,"text":4198},"23. Returning () From Blocks by Accident",{"id":3164,"depth":51,"text":4200},"24. match Without _ When All Cases Matter",{"id":3298,"depth":51,"text":4202},"25. mut You Don't Need",{"id":3357,"depth":51,"text":4204},"26. Unreachable unreachable!",{"id":3421,"depth":51,"text":4206},"27. String::from vs .to_string() vs .into()",{"id":3451,"depth":51,"text":4208},"28. &Vec\u003CT> Parameters",{"id":3560,"depth":51,"text":4210},"29. &String Parameters",{"id":3632,"depth":51,"text":4212},"30. if x.is_ok() { x.unwrap() }",{"id":3730,"depth":51,"text":4214},"31. vec![None; n] vs vec![0; n]",{"id":3748,"depth":51,"text":4216},"32. HashMap Iteration Order",{"id":3770,"depth":51,"text":4218},"33. String::new() vs String::with_capacity",{"id":3787,"depth":51,"text":4220},"34. String::from_utf8_lossy vs from_utf8",{"id":3815,"depth":51,"text":4222},"35. Forgetting #[must_use] Types",{"id":3860,"depth":51,"text":4224},"36. as Casts",{"id":3967,"depth":51,"text":4226},"37. cargo build in CI Without --locked",{"id":4011,"depth":51,"text":4012},{"id":4046,"depth":51,"text":4047},{"id":4057,"depth":51,"text":4230},"40. Arc\u003CMutex\u003CT>> for Single-Threaded Code",{"id":4071,"depth":51,"text":4072},"md",{},"\u002Frust\u002F34-common-pitfalls",{"title":5,"description":16},"rust\u002F34-common-pitfalls","YW78gS5Gv42IYK0N3C0Pr8KX5wACNVet26rzK7TLu3s",1785944093731]