[{"data":1,"prerenderedAt":1340},["ShallowReactive",2],{"page-\u002Frust\u002F35-exercises-and-projects":3},{"id":4,"title":5,"body":6,"description":16,"extension":1333,"meta":1334,"navigation":1335,"path":1336,"seo":1337,"stem":1338,"__hash__":1339},"content\u002Frust\u002F35-exercises-and-projects.md","35 — Mastery Exercises & Project Ideas",{"type":7,"value":8,"toc":1297},"minimark",[9,13,17,22,25,48,52,57,65,69,296,312,316,342,346,363,367,382,386,390,400,404,415,419,426,434,529,542,546,560,564,568,571,643,649,653,659,663,674,678,685,689,698,702,722,726,730,795,799,871,875,975,979,982,1041,1053,1057,1089,1093,1125,1129,1132,1259,1262,1266,1269,1287,1290,1293],[10,11,5],"h1",{"id":12},"_35-mastery-exercises-project-ideas",[14,15,16],"p",{},"Reading is the first step; building is where you become a pro. This chapter gives you exercises and projects calibrated to internalize everything.",[18,19,21],"h2",{"id":20},"how-to-use-this-chapter","How to Use This Chapter",[14,23,24],{},"Each section has:",[26,27,28,36,42],"ul",{},[29,30,31,35],"li",{},[32,33,34],"strong",{},"Exercises",": small, focused tasks to test specific concepts.",[29,37,38,41],{},[32,39,40],{},"Projects",": end-to-end builds.",[29,43,44,47],{},[32,45,46],{},"Solutions",": don't look until you've tried for 30 minutes.",[18,49,51],{"id":50},"beginner-exercises","Beginner Exercises",[53,54,56],"h3",{"id":55},"_1-fizzbuzz-with-iterators","1. FizzBuzz with Iterators",[14,58,59,60,64],{},"Implement FizzBuzz for 1..=100 using iterators and ",[61,62,63],"code",{},"collect::\u003CVec\u003CString>>()",".",[53,66,68],{"id":67},"_2-stack-with-generics","2. Stack with Generics",[70,71,73],"code-wrapper",{"language":72},"rust",[74,75,79],"pre",{"className":76,"code":77,"language":72,"meta":78,"style":78},"language-rust shiki shiki-themes github-light github-dark","struct Stack\u003CT> { \u002F* ... *\u002F }\nimpl\u003CT> Stack\u003CT> {\n    fn new() -> Self;\n    fn push(&mut self, v: T);\n    fn pop(&mut self) -> Option\u003CT>;\n    fn peek(&self) -> Option\u003C&T>;\n    fn len(&self) -> usize;\n    fn is_empty(&self) -> bool;\n}\n","",[61,80,81,111,134,156,185,214,244,267,290],{"__ignoreMap":78},[82,83,86,90,94,98,101,104,108],"span",{"class":84,"line":85},"line",1,[82,87,89],{"class":88},"svdQ7","struct",[82,91,93],{"class":92},"sIsaT"," Stack",[82,95,97],{"class":96},"ssxIu","\u003C",[82,99,100],{"class":92},"T",[82,102,103],{"class":96},"> { ",[82,105,107],{"class":106},"sdCPZ","\u002F* ... *\u002F",[82,109,110],{"class":96}," }\n",[82,112,114,117,119,121,124,127,129,131],{"class":84,"line":113},2,[82,115,116],{"class":88},"impl",[82,118,97],{"class":96},[82,120,100],{"class":92},[82,122,123],{"class":96},"> ",[82,125,126],{"class":92},"Stack",[82,128,97],{"class":96},[82,130,100],{"class":92},[82,132,133],{"class":96},"> {\n",[82,135,137,140,143,146,149,153],{"class":84,"line":136},3,[82,138,139],{"class":88},"    fn",[82,141,142],{"class":92}," new",[82,144,145],{"class":96},"() ",[82,147,148],{"class":88},"->",[82,150,152],{"class":151},"snvgF"," Self",[82,154,155],{"class":96},";\n",[82,157,159,161,164,167,170,173,176,179,182],{"class":84,"line":158},4,[82,160,139],{"class":88},[82,162,163],{"class":92}," push",[82,165,166],{"class":96},"(",[82,168,169],{"class":88},"&mut",[82,171,172],{"class":151}," self",[82,174,175],{"class":96},", v",[82,177,178],{"class":88},":",[82,180,181],{"class":92}," T",[82,183,184],{"class":96},");\n",[82,186,188,190,193,195,197,199,202,204,207,209,211],{"class":84,"line":187},5,[82,189,139],{"class":88},[82,191,192],{"class":92}," pop",[82,194,166],{"class":96},[82,196,169],{"class":88},[82,198,172],{"class":151},[82,200,201],{"class":96},") ",[82,203,148],{"class":88},[82,205,206],{"class":92}," Option",[82,208,97],{"class":96},[82,210,100],{"class":92},[82,212,213],{"class":96},">;\n",[82,215,217,219,222,224,227,230,232,234,236,238,240,242],{"class":84,"line":216},6,[82,218,139],{"class":88},[82,220,221],{"class":92}," peek",[82,223,166],{"class":96},[82,225,226],{"class":88},"&",[82,228,229],{"class":151},"self",[82,231,201],{"class":96},[82,233,148],{"class":88},[82,235,206],{"class":92},[82,237,97],{"class":96},[82,239,226],{"class":88},[82,241,100],{"class":92},[82,243,213],{"class":96},[82,245,247,249,252,254,256,258,260,262,265],{"class":84,"line":246},7,[82,248,139],{"class":88},[82,250,251],{"class":92}," len",[82,253,166],{"class":96},[82,255,226],{"class":88},[82,257,229],{"class":151},[82,259,201],{"class":96},[82,261,148],{"class":88},[82,263,264],{"class":92}," usize",[82,266,155],{"class":96},[82,268,270,272,275,277,279,281,283,285,288],{"class":84,"line":269},8,[82,271,139],{"class":88},[82,273,274],{"class":92}," is_empty",[82,276,166],{"class":96},[82,278,226],{"class":88},[82,280,229],{"class":151},[82,282,201],{"class":96},[82,284,148],{"class":88},[82,286,287],{"class":92}," bool",[82,289,155],{"class":96},[82,291,293],{"class":84,"line":292},9,[82,294,295],{"class":96},"}\n",[14,297,298,299,302,303,306,307,309,310,64],{},"Use ",[61,300,301],{},"Vec\u003CT>"," internally. Implement ",[61,304,305],{},"IntoIterator"," for owned, ",[61,308,226],{},", and ",[61,311,169],{},[53,313,315],{"id":314},"_3-result-combinators","3. Result Combinators",[14,317,318,319,322,323,326,327,330,331,334,335,338,339,64],{},"Write ",[61,320,321],{},"parse_csv(s: &str) -> Result\u003CVec\u003CVec\u003Ci32>>, AppError>"," using ",[61,324,325],{},"?"," and ",[61,328,329],{},"split","\u002F",[61,332,333],{},"parse",". Define ",[61,336,337],{},"AppError"," with ",[61,340,341],{},"thiserror",[53,343,345],{"id":344},"_4-linked-list-the-hard-way","4. Linked List (the Hard Way)",[14,347,348,349,352,353,356,357,356,360,64],{},"Implement a singly linked list using ",[61,350,351],{},"Box\u003CNode\u003CT>>",". Then implement ",[61,354,355],{},"Iter",", ",[61,358,359],{},"IterMut",[61,361,362],{},"IntoIter",[53,364,366],{"id":365},"_5-cli-calculator","5. CLI Calculator",[14,368,369,370,373,374,377,378,381],{},"Take ",[61,371,372],{},"+ 2 3"," or ",[61,375,376],{},"* 4 5"," from argv, print the result. Use ",[61,379,380],{},"clap"," if you want a challenge.",[18,383,385],{"id":384},"intermediate-exercises","Intermediate Exercises",[53,387,389],{"id":388},"_6-json-parser","6. JSON Parser",[14,391,392,393,373,396,399],{},"Hand-write a JSON parser using ",[61,394,395],{},"nom",[61,397,398],{},"pest",". Cover objects, arrays, strings (with escapes), numbers, booleans, null.",[53,401,403],{"id":402},"_7-async-file-watcher","7. Async File Watcher",[14,405,406,407,410,411,414],{},"Watch a directory for changes using ",[61,408,409],{},"notify"," (crate), print events. Use ",[61,412,413],{},"tokio::select!"," with a Ctrl-C handler for clean shutdown.",[53,416,418],{"id":417},"_8-concurrent-counter-with-channels","8. Concurrent Counter with Channels",[14,420,421,422,425],{},"10 threads, each sending numbers to a single aggregator thread via ",[61,423,424],{},"mpsc",". Print the final sum.",[53,427,429,430,433],{"id":428},"_9-custom-iterator-for-fibonacci","9. Custom ",[61,431,432],{},"Iterator"," for Fibonacci",[70,435,436],{"language":72},[74,437,439],{"className":76,"code":438,"language":72,"meta":78,"style":78},"struct Fib { a: u64, b: u64 }\nimpl Iterator for Fib {\n    type Item = u64;\n    fn next(&mut self) -> Option\u003Cu64> { \u002F* ... *\u002F }\n}\n",[61,440,441,465,480,495,525],{"__ignoreMap":78},[82,442,443,445,448,451,453,456,459,461,463],{"class":84,"line":85},[82,444,89],{"class":88},[82,446,447],{"class":92}," Fib",[82,449,450],{"class":96}," { a",[82,452,178],{"class":88},[82,454,455],{"class":92}," u64",[82,457,458],{"class":96},", b",[82,460,178],{"class":88},[82,462,455],{"class":92},[82,464,110],{"class":96},[82,466,467,469,472,475,477],{"class":84,"line":113},[82,468,116],{"class":88},[82,470,471],{"class":92}," Iterator",[82,473,474],{"class":88}," for",[82,476,447],{"class":92},[82,478,479],{"class":96}," {\n",[82,481,482,485,488,491,493],{"class":84,"line":136},[82,483,484],{"class":88},"    type",[82,486,487],{"class":92}," Item",[82,489,490],{"class":88}," =",[82,492,455],{"class":92},[82,494,155],{"class":96},[82,496,497,499,502,504,506,508,510,512,514,516,519,521,523],{"class":84,"line":158},[82,498,139],{"class":88},[82,500,501],{"class":92}," next",[82,503,166],{"class":96},[82,505,169],{"class":88},[82,507,172],{"class":151},[82,509,201],{"class":96},[82,511,148],{"class":88},[82,513,206],{"class":92},[82,515,97],{"class":96},[82,517,518],{"class":92},"u64",[82,520,103],{"class":96},[82,522,107],{"class":106},[82,524,110],{"class":96},[82,526,527],{"class":84,"line":187},[82,528,295],{"class":96},[14,530,531,532,356,535,356,538,541],{},"Add ",[61,533,534],{},".map",[61,536,537],{},".filter",[61,539,540],{},".take"," chains.",[53,543,545],{"id":544},"_10-type-state-builder","10. Type-State Builder",[14,547,548,549,552,553,356,556,559],{},"A ",[61,550,551],{},"RequestBuilder\u003CMethod, Path, Body>"," with states ",[61,554,555],{},"Unset",[61,557,558],{},"Set",". Methods only available in valid states.",[18,561,563],{"id":562},"advanced-exercises","Advanced Exercises",[53,565,567],{"id":566},"_11-custom-trait-object","11. Custom Trait Object",[14,569,570],{},"Implement your own dispatch table:",[70,572,573],{"language":72},[74,574,576],{"className":76,"code":575,"language":72,"meta":78,"style":78},"struct VTable { size: usize, drop: unsafe fn(*mut u8), display: unsafe fn(*const u8, &mut Formatter) -> Result }\n",[61,577,578],{"__ignoreMap":78},[82,579,580,582,585,588,590,592,595,597,600,603,605,608,611,614,616,618,620,622,625,627,629,631,634,636,638,641],{"class":84,"line":85},[82,581,89],{"class":88},[82,583,584],{"class":92}," VTable",[82,586,587],{"class":96}," { size",[82,589,178],{"class":88},[82,591,264],{"class":92},[82,593,594],{"class":96},", drop",[82,596,178],{"class":88},[82,598,599],{"class":88}," unsafe",[82,601,602],{"class":92}," fn",[82,604,166],{"class":96},[82,606,607],{"class":88},"*mut",[82,609,610],{"class":92}," u8",[82,612,613],{"class":96},"), display",[82,615,178],{"class":88},[82,617,599],{"class":88},[82,619,602],{"class":92},[82,621,166],{"class":96},[82,623,624],{"class":88},"*const",[82,626,610],{"class":92},[82,628,356],{"class":96},[82,630,169],{"class":88},[82,632,633],{"class":92}," Formatter",[82,635,201],{"class":96},[82,637,148],{"class":88},[82,639,640],{"class":92}," Result",[82,642,110],{"class":96},[14,644,645,646,64],{},"Compare with ",[61,647,648],{},"Box\u003Cdyn Display>",[53,650,652],{"id":651},"_12-lock-free-queue","12. Lock-Free Queue",[14,654,655,656,64],{},"Implement a bounded MPSC queue using atomics. Benchmark against ",[61,657,658],{},"crossbeam-channel",[53,660,662],{"id":661},"_13-memory-pool","13. Memory Pool",[14,664,665,666,669,670,673],{},"Implement an arena allocator (bump allocation). Use ",[61,667,668],{},"bumpalo"," as a reference. Add ",[61,671,672],{},"Drop"," to free the arena.",[53,675,677],{"id":676},"_14-async-stream","14. Async Stream",[14,679,680,681,684],{},"Implement a ",[61,682,683],{},"Stream"," that yields lines from a file asynchronously, with backpressure.",[53,686,688],{"id":687},"_15-custom-allocator","15. Custom Allocator",[14,690,680,691,694,695,64],{},[61,692,693],{},"GlobalAlloc"," that tracks allocations and prints them. Use it as ",[61,696,697],{},"#[global_allocator]",[53,699,701],{"id":700},"_16-ffi-wrapper","16. FFI Wrapper",[14,703,704,705,708,709,712,713,330,716,719,720,64],{},"Wrap ",[61,706,707],{},"sqlite3"," via ",[61,710,711],{},"bindgen",". Expose a safe ",[61,714,715],{},"Database",[61,717,718],{},"Statement"," API with ",[61,721,672],{},[18,723,725],{"id":724},"project-ideas","Project Ideas",[53,727,729],{"id":728},"beginner","Beginner",[731,732,733,758,773,783],"ol",{},[29,734,735,738,739,356,742,356,745,356,748,751,752,754,755,64],{},[32,736,737],{},"CLI todo app",": ",[61,740,741],{},"add",[61,743,744],{},"list",[61,746,747],{},"done",[61,749,750],{},"remove",". JSON storage. Use ",[61,753,380],{}," + ",[61,756,757],{},"serde",[29,759,760,763,764,754,767,373,770,64],{},[32,761,762],{},"HTTP file server",": serve a directory; ",[61,765,766],{},"tokio",[61,768,769],{},"hyper",[61,771,772],{},"axum",[29,774,775,778,779,330,781,64],{},[32,776,777],{},"Markdown to HTML",": minimal converter; learn ",[61,780,395],{},[61,782,398],{},[29,784,785,788,789,330,792,64],{},[32,786,787],{},"Word frequency counter",": from a file, print top 10. Use ",[61,790,791],{},"HashMap",[61,793,794],{},"BTreeMap",[53,796,798],{"id":797},"intermediate","Intermediate",[731,800,801,810,824,835,850,862],{"start":187},[29,802,803,806,807,809],{},[32,804,805],{},"Chat server",": TCP + ",[61,808,413],{},". Broadcast to all connected clients.",[29,811,812,738,815,754,817,330,820,823],{},[32,813,814],{},"URL shortener",[61,816,772],{},[61,818,819],{},"redis",[61,821,822],{},"DashMap",". Persistent storage.",[29,825,826,829,830,754,832,64],{},[32,827,828],{},"Mini Redis",": implement a subset of Redis protocol. ",[61,831,766],{},[61,833,834],{},"bytes",[29,836,837,738,840,754,843,330,846,849],{},[32,838,839],{},"Web scraper",[61,841,842],{},"reqwest",[61,844,845],{},"select",[61,847,848],{},"scraper",". Polite rate limiting.",[29,851,852,738,855,858,859,64],{},[32,853,854],{},"Image processor",[61,856,857],{},"image"," crate, batch resize with ",[61,860,861],{},"rayon",[29,863,864,867,868,64],{},[32,865,866],{},"Database migration tool",": schema versioning, SQL execution via ",[61,869,870],{},"sqlx",[53,872,874],{"id":873},"advanced","Advanced",[731,876,878,887,897,906,912,929,935,945,951,964],{"start":877},11,[29,879,880,883,884,886],{},[32,881,882],{},"Async ORM",": derive macro for table mapping; ",[61,885,870],{},"; compile-time queries.",[29,888,889,892,893,896],{},[32,890,891],{},"Game engine",": ECS with ",[61,894,895],{},"bevy","; render sprites; basic physics.",[29,898,899,738,902,905],{},[32,900,901],{},"TLS proxy",[61,903,904],{},"tokio-rustls","; terminate TLS and forward plain TCP.",[29,907,908,911],{},[32,909,910],{},"Bittorrent client",": piece assembly, peer protocol, async I\u002FO.",[29,913,914,738,917,920,921,924,925,928],{},[32,915,916],{},"Operating system kernel",[61,918,919],{},"no_std","; ",[61,922,923],{}," bootloader","; serial driver; minimal shell. (",[61,926,927],{},"blog_os"," tutorial.)",[29,930,931,934],{},[32,932,933],{},"Database engine",": B+tree storage, WAL, MVCC. Hard but illuminating.",[29,936,937,940,941,944],{},[32,938,939],{},"Compiler",": parse a small language; lower to LLVM IR via ",[61,942,943],{},"inkwell"," or to Cranelift.",[29,946,947,950],{},[32,948,949],{},"Static site generator",": markdown → HTML, templates, RSS, syntax highlighting.",[29,952,953,956,957,356,960,963],{},[32,954,955],{},"WASM image editor",": client-side, ",[61,958,959],{},"wasm-bindgen",[61,961,962],{},"Canvas"," API.",[29,965,966,969,970,972,973,64],{},[32,967,968],{},"Realtime multiplayer game server",": WebSocket + ",[61,971,772],{},"; per-room state with ",[61,974,822],{},[18,976,978],{"id":977},"reading-code-to-mastery","Reading Code to Mastery",[14,980,981],{},"Read source of:",[26,983,984,990,995,1004,1012,1019,1024,1030,1035],{},[29,985,986,989],{},[61,987,988],{},"std"," (slice\u002Fiter\u002Fvec modules).",[29,991,992,994],{},[61,993,766],{}," (scheduler, channels).",[29,996,997,999,1000,1003],{},[61,998,757],{}," (derive macros — ",[61,1001,1002],{},"serde_derive",").",[29,1005,1006,1008,1009,1003],{},[61,1007,772],{}," (routing, middleware via ",[61,1010,1011],{},"tower",[29,1013,1014,1016,1017,1003],{},[61,1015,842],{}," (HTTP client on ",[61,1018,769],{},[29,1020,1021,1023],{},[61,1022,870],{}," (compile-time SQL checking via macros).",[29,1025,1026,1029],{},[61,1027,1028],{},"crossbeam"," (epoch-based memory reclamation).",[29,1031,1032,1034],{},[61,1033,895],{}," (ECS, scheduling, renderer).",[29,1036,1037,1040],{},[61,1038,1039],{},"regex"," (DFA construction, Unicode tables).",[14,1042,1043,1044,356,1047,356,1050,64],{},"The standard library is the best Rust code you can read. Start with ",[61,1045,1046],{},"alloc::vec",[61,1048,1049],{},"core::iter",[61,1051,1052],{},"core::slice",[18,1054,1056],{"id":1055},"practice-sites","Practice Sites",[26,1058,1059,1065,1071,1077,1083],{},[29,1060,1061,1064],{},[32,1062,1063],{},"Rustlings",": small exercises for each concept.",[29,1066,1067,1070],{},[32,1068,1069],{},"Exercism Rust track",": mentor-reviewed exercises.",[29,1072,1073,1076],{},[32,1074,1075],{},"Advent of Code",": annual puzzles, perfect for Rust.",[29,1078,1079,1082],{},[32,1080,1081],{},"LeetCode Rust",": algos.",[29,1084,1085,1088],{},[32,1086,1087],{},"Rosetta Code Rust",": idiomatic translations.",[18,1090,1092],{"id":1091},"open-source-contribution","Open Source Contribution",[26,1094,1095,1101,1107,1113,1119],{},[29,1096,1097,1100],{},[61,1098,1099],{},"rust-lang\u002Frust",": good-first-issue labels; tough but rewarding.",[29,1102,1103,1106],{},[61,1104,1105],{},"tokio-rs\u002F*",": tokio ecosystem.",[29,1108,1109,1112],{},[61,1110,1111],{},"serde-rs\u002F*",": serde, serde_json.",[29,1114,1115,1118],{},[61,1116,1117],{},"bevyengine\u002Fbevy",": game engine.",[29,1120,1121,1124],{},[61,1122,1123],{},"rust-cli\u002F*",": CLI tool templates.",[18,1126,1128],{"id":1127},"mastery-self-check","Mastery Self-Check",[14,1130,1131],{},"Can you confidently:",[26,1133,1134,1137,1148,1155,1165,1174,1183,1219,1233,1240,1253],{},[29,1135,1136],{},"Explain ownership without using the word \"borrow\"? (Use \"one owner, moved on assignment, dropped on scope-end\".)",[29,1138,1139,1140,1143,1144,1147],{},"Predict whether ",[61,1141,1142],{},"&'static"," is required for a thread closure? (Yes if it borrows stack data — use ",[61,1145,1146],{},"move",".)",[29,1149,1150,1151,1154],{},"Read ",[61,1152,1153],{},"for\u003C'a> Fn(&'a str) -> &'a str"," and explain it? (HRTB; the closure works for any lifetime.)",[29,1156,1157,1158,326,1161,1164],{},"Implement a trait for both ",[61,1159,1160],{},"&T",[61,1162,1163],{},"&mut T","? (Avoid; usually one suffices.)",[29,1166,1167,1168,1170,1171,1147],{},"Implement ",[61,1169,432],{}," for your own type? (Just ",[61,1172,1173],{},"next()",[29,1175,1176,1177,1179,1180,1182],{},"Explain why ",[61,1178,1163],{}," is invariant in ",[61,1181,100],{},"? (Otherwise you could swap in shorter-lived data.)",[29,1184,1185,1186,356,1189,356,1192,356,1195,356,1198,1201,1202,1204,1205,920,1207,1210,1211,1213,1214,1216,1217,1147],{},"Choose between ",[61,1187,1188],{},"Rc",[61,1190,1191],{},"Arc",[61,1193,1194],{},"Cell",[61,1196,1197],{},"RefCell",[61,1199,1200],{},"Mutex","? (Single-thread shared\u002Fclone: ",[61,1203,1188],{},"; multi-thread: ",[61,1206,1191],{},[61,1208,1209],{},"Copy"," interior: ",[61,1212,1194],{},"; mut interior single-thread: ",[61,1215,1197],{},"; mut interior multi-thread: ",[61,1218,1200],{},[29,1220,1221,1222,1225,1226,1229,1230,1232],{},"Read a ",[61,1223,1224],{},"Pin\u003C&mut T>"," and know what ",[61,1227,1228],{},"!Unpin"," implies? (Can't safely move the ",[61,1231,100],{}," after pinning.)",[29,1234,1235,1236,1239],{},"Reason about variance of your custom smart pointer? (Pick ",[61,1237,1238],{},"PhantomData"," accordingly.)",[29,1241,1242,1243,1246,1247,330,1250,1147],{},"Write a ",[61,1244,1245],{},"proc_macro_derive","? (Use ",[61,1248,1249],{},"syn",[61,1251,1252],{},"quote",[29,1254,1150,1255,1258],{},[61,1256,1257],{},"unsafe { *ptr }"," and verify the safety invariants? (Alignment, initialization, aliasing, lifetime.)",[14,1260,1261],{},"If you can do all of the above without consulting docs, you're a pro Rust developer.",[18,1263,1265],{"id":1264},"final-words","Final Words",[14,1267,1268],{},"Rust has a steep learning curve but pays dividends. The compiler is strict but kind: errors are messages, not crashes. Once you internalize ownership, lifetimes, and the trait system, the rest is vocabulary.",[14,1270,1271,1272,1274,1275,1278,1279,1282,1283,1286],{},"Build things. Break things. Read the stdlib. Read ",[61,1273,766],{},". Run ",[61,1276,1277],{},"cargo expand"," on macros. Run ",[61,1280,1281],{},"Miri"," on unsafe. Profile with ",[61,1284,1285],{},"samply",". Contribute to open source.",[14,1288,1289],{},"Welcome to being a Rust developer.",[14,1291,1292],{},"🦀",[1294,1295,1296],"style",{},"html pre.shiki code .svdQ7, html code.shiki .svdQ7{--shiki-default:#D73A49;--shiki-github-dark:#F97583}html pre.shiki code .sIsaT, html code.shiki .sIsaT{--shiki-default:#6F42C1;--shiki-github-dark:#B392F0}html pre.shiki code .ssxIu, html code.shiki .ssxIu{--shiki-default:#24292E;--shiki-github-dark:#E1E4E8}html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}html pre.shiki code .snvgF, html code.shiki .snvgF{--shiki-default:#005CC5;--shiki-github-dark:#79B8FF}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);}",{"title":78,"searchDepth":113,"depth":113,"links":1298},[1299,1300,1307,1315,1323,1328,1329,1330,1331,1332],{"id":20,"depth":113,"text":21},{"id":50,"depth":113,"text":51,"children":1301},[1302,1303,1304,1305,1306],{"id":55,"depth":136,"text":56},{"id":67,"depth":136,"text":68},{"id":314,"depth":136,"text":315},{"id":344,"depth":136,"text":345},{"id":365,"depth":136,"text":366},{"id":384,"depth":113,"text":385,"children":1308},[1309,1310,1311,1312,1314],{"id":388,"depth":136,"text":389},{"id":402,"depth":136,"text":403},{"id":417,"depth":136,"text":418},{"id":428,"depth":136,"text":1313},"9. Custom Iterator for Fibonacci",{"id":544,"depth":136,"text":545},{"id":562,"depth":113,"text":563,"children":1316},[1317,1318,1319,1320,1321,1322],{"id":566,"depth":136,"text":567},{"id":651,"depth":136,"text":652},{"id":661,"depth":136,"text":662},{"id":676,"depth":136,"text":677},{"id":687,"depth":136,"text":688},{"id":700,"depth":136,"text":701},{"id":724,"depth":113,"text":725,"children":1324},[1325,1326,1327],{"id":728,"depth":136,"text":729},{"id":797,"depth":136,"text":798},{"id":873,"depth":136,"text":874},{"id":977,"depth":113,"text":978},{"id":1055,"depth":113,"text":1056},{"id":1091,"depth":113,"text":1092},{"id":1127,"depth":113,"text":1128},{"id":1264,"depth":113,"text":1265},"md",{},true,"\u002Frust\u002F35-exercises-and-projects",{"title":5,"description":16},"rust\u002F35-exercises-and-projects","8DOV2wq6nKRbH-1T7kmZQKT-f-dPYIrU17tmHlmSR2g",1785944093736]