[{"data":1,"prerenderedAt":1824},["ShallowReactive",2],{"page-\u002Frust\u002F11-structs":3},{"id":4,"title":5,"body":6,"description":16,"extension":1818,"meta":1819,"navigation":116,"path":1820,"seo":1821,"stem":1822,"__hash__":1823},"content\u002Frust\u002F11-structs.md","11 — Structs",{"type":7,"value":8,"toc":1794},"minimark",[9,13,17,22,210,215,281,288,292,335,374,378,456,477,481,510,513,520,694,700,704,742,746,837,841,1075,1080,1084,1196,1199,1203,1273,1276,1324,1341,1346,1421,1424,1433,1451,1565,1569,1619,1625,1629,1720,1726,1752,1756,1773,1777,1787,1790],[10,11,5],"h1",{"id":12},"_11-structs",[14,15,16],"p",{},"Structs group related data. Rust structs come in three flavors.",[18,19,21],"h2",{"id":20},"named-field-structs","Named-Field Structs",[23,24,26],"code-wrapper",{"language":25},"rust",[27,28,32],"pre",{"className":29,"code":30,"language":25,"meta":31,"style":31},"language-rust shiki shiki-themes github-light github-dark","struct User {\n    username: String,\n    email: String,\n    sign_in_count: u64,\n    active: bool,\n}\n\nlet u = User {\n    username: String::from(\"ada\"),\n    email: String::from(\"ada@example.com\"),\n    sign_in_count: 1,\n    active: true,\n};\n","",[33,34,35,52,67,79,92,105,111,118,134,159,179,192,204],"code",{"__ignoreMap":31},[36,37,40,44,48],"span",{"class":38,"line":39},"line",1,[36,41,43],{"class":42},"svdQ7","struct",[36,45,47],{"class":46},"sIsaT"," User",[36,49,51],{"class":50},"ssxIu"," {\n",[36,53,55,58,61,64],{"class":38,"line":54},2,[36,56,57],{"class":50},"    username",[36,59,60],{"class":42},":",[36,62,63],{"class":46}," String",[36,65,66],{"class":50},",\n",[36,68,70,73,75,77],{"class":38,"line":69},3,[36,71,72],{"class":50},"    email",[36,74,60],{"class":42},[36,76,63],{"class":46},[36,78,66],{"class":50},[36,80,82,85,87,90],{"class":38,"line":81},4,[36,83,84],{"class":50},"    sign_in_count",[36,86,60],{"class":42},[36,88,89],{"class":46}," u64",[36,91,66],{"class":50},[36,93,95,98,100,103],{"class":38,"line":94},5,[36,96,97],{"class":50},"    active",[36,99,60],{"class":42},[36,101,102],{"class":46}," bool",[36,104,66],{"class":50},[36,106,108],{"class":38,"line":107},6,[36,109,110],{"class":50},"}\n",[36,112,114],{"class":38,"line":113},7,[36,115,117],{"emptyLinePlaceholder":116},true,"\n",[36,119,121,124,127,130,132],{"class":38,"line":120},8,[36,122,123],{"class":42},"let",[36,125,126],{"class":50}," u ",[36,128,129],{"class":42},"=",[36,131,47],{"class":46},[36,133,51],{"class":50},[36,135,137,139,141,143,146,149,152,156],{"class":38,"line":136},9,[36,138,57],{"class":50},[36,140,60],{"class":42},[36,142,63],{"class":46},[36,144,145],{"class":42},"::",[36,147,148],{"class":46},"from",[36,150,151],{"class":50},"(",[36,153,155],{"class":154},"sJ6F3","\"ada\"",[36,157,158],{"class":50},"),\n",[36,160,162,164,166,168,170,172,174,177],{"class":38,"line":161},10,[36,163,72],{"class":50},[36,165,60],{"class":42},[36,167,63],{"class":46},[36,169,145],{"class":42},[36,171,148],{"class":46},[36,173,151],{"class":50},[36,175,176],{"class":154},"\"ada@example.com\"",[36,178,158],{"class":50},[36,180,182,184,186,190],{"class":38,"line":181},11,[36,183,84],{"class":50},[36,185,60],{"class":42},[36,187,189],{"class":188},"snvgF"," 1",[36,191,66],{"class":50},[36,193,195,197,199,202],{"class":38,"line":194},12,[36,196,97],{"class":50},[36,198,60],{"class":42},[36,200,201],{"class":188}," true",[36,203,66],{"class":50},[36,205,207],{"class":38,"line":206},13,[36,208,209],{"class":50},"};\n",[211,212,214],"h3",{"id":213},"field-init-shorthand","Field-Init Shorthand",[23,216,217],{"language":25},[27,218,220],{"className":29,"code":219,"language":25,"meta":31,"style":31},"fn new(email: String, username: String) -> User {\n    User { email, username, active: true, sign_in_count: 0 }\n}\n",[33,221,222,254,277],{"__ignoreMap":31},[36,223,224,227,230,233,235,237,240,242,244,247,250,252],{"class":38,"line":39},[36,225,226],{"class":42},"fn",[36,228,229],{"class":46}," new",[36,231,232],{"class":50},"(email",[36,234,60],{"class":42},[36,236,63],{"class":46},[36,238,239],{"class":50},", username",[36,241,60],{"class":42},[36,243,63],{"class":46},[36,245,246],{"class":50},") ",[36,248,249],{"class":42},"->",[36,251,47],{"class":46},[36,253,51],{"class":50},[36,255,256,259,262,264,266,269,271,274],{"class":38,"line":54},[36,257,258],{"class":46},"    User",[36,260,261],{"class":50}," { email, username, active",[36,263,60],{"class":42},[36,265,201],{"class":188},[36,267,268],{"class":50},", sign_in_count",[36,270,60],{"class":42},[36,272,273],{"class":188}," 0",[36,275,276],{"class":50}," }\n",[36,278,279],{"class":38,"line":69},[36,280,110],{"class":50},[14,282,283,284,287],{},"When a variable name matches the field, omit ",[33,285,286],{},": value",".",[211,289,291],{"id":290},"struct-update-syntax","Struct Update Syntax",[23,293,294],{"language":25},[27,295,297],{"className":29,"code":296,"language":25,"meta":31,"style":31},"let u2 = User { email: String::from(\"ada2@x.com\"), ..u };\n",[33,298,299],{"__ignoreMap":31},[36,300,301,303,306,308,310,313,315,317,319,321,323,326,329,332],{"class":38,"line":39},[36,302,123],{"class":42},[36,304,305],{"class":50}," u2 ",[36,307,129],{"class":42},[36,309,47],{"class":46},[36,311,312],{"class":50}," { email",[36,314,60],{"class":42},[36,316,63],{"class":46},[36,318,145],{"class":42},[36,320,148],{"class":46},[36,322,151],{"class":50},[36,324,325],{"class":154},"\"ada2@x.com\"",[36,327,328],{"class":50},"), ",[36,330,331],{"class":42},"..",[36,333,334],{"class":50},"u };\n",[336,337,338,348,363],"ul",{},[339,340,341,344,345,287],"li",{},[33,342,343],{},"..u"," copies\u002Fmoves the remaining fields from ",[33,346,347],{},"u",[339,349,350,351,354,355,358,359,362],{},"Like a partial move — ",[33,352,353],{},"u.username"," is now invalid if ",[33,356,357],{},"String"," was moved (non-",[33,360,361],{},"Copy",").",[339,364,365,366,368,369,371,372,287],{},"For ",[33,367,361],{}," fields, they're copied; for non-",[33,370,361],{},", they're moved out of ",[33,373,347],{},[18,375,377],{"id":376},"tuple-structs","Tuple Structs",[23,379,380],{"language":25},[27,381,383],{"className":29,"code":382,"language":25,"meta":31,"style":31},"struct Color(i32, i32, i32);\nlet c = Color(255, 128, 0);\nlet r = c.0;\n",[33,384,385,409,437],{"__ignoreMap":31},[36,386,387,389,392,394,397,400,402,404,406],{"class":38,"line":39},[36,388,43],{"class":42},[36,390,391],{"class":46}," Color",[36,393,151],{"class":50},[36,395,396],{"class":46},"i32",[36,398,399],{"class":50},", ",[36,401,396],{"class":46},[36,403,399],{"class":50},[36,405,396],{"class":46},[36,407,408],{"class":50},");\n",[36,410,411,413,416,418,420,422,425,427,430,432,435],{"class":38,"line":54},[36,412,123],{"class":42},[36,414,415],{"class":50}," c ",[36,417,129],{"class":42},[36,419,391],{"class":46},[36,421,151],{"class":50},[36,423,424],{"class":188},"255",[36,426,399],{"class":50},[36,428,429],{"class":188},"128",[36,431,399],{"class":50},[36,433,434],{"class":188},"0",[36,436,408],{"class":50},[36,438,439,441,444,446,449,451,453],{"class":38,"line":69},[36,440,123],{"class":42},[36,442,443],{"class":50}," r ",[36,445,129],{"class":42},[36,447,448],{"class":50}," c",[36,450,287],{"class":42},[36,452,434],{"class":188},[36,454,455],{"class":50},";\n",[336,457,458,461,471],{},[339,459,460],{},"Look like tuples but are distinct types.",[339,462,463,464,467,468,287],{},"Useful for newtype pattern: ",[33,465,466],{},"struct Meters(f64);"," prevents mixing with other ",[33,469,470],{},"f64",[339,472,473,474,287],{},"Pattern match: ",[33,475,476],{},"let Color(r, g, b) = c;",[18,478,480],{"id":479},"unit-structs","Unit Structs",[23,482,483],{"language":25},[27,484,486],{"className":29,"code":485,"language":25,"meta":31,"style":31},"struct AlwaysEqual;\nlet _a = AlwaysEqual;\n",[33,487,488,497],{"__ignoreMap":31},[36,489,490,492,495],{"class":38,"line":39},[36,491,43],{"class":42},[36,493,494],{"class":46}," AlwaysEqual",[36,496,455],{"class":50},[36,498,499,501,504,506,508],{"class":38,"line":54},[36,500,123],{"class":42},[36,502,503],{"class":50}," _a ",[36,505,129],{"class":42},[36,507,494],{"class":46},[36,509,455],{"class":50},[14,511,512],{},"Zero-sized; useful for trait implementations with no data (e.g., marker traits, type-state).",[18,514,516,519],{"id":515},"impl-blocks",[33,517,518],{},"impl"," Blocks",[23,521,522],{"language":25},[27,523,525],{"className":29,"code":524,"language":25,"meta":31,"style":31},"impl User {\n    fn new(email: String, username: String) -> Self {\n        User { email, username, active: true, sign_in_count: 0 }\n    }\n    fn is_active(&self) -> bool { self.active }\n    fn sign_in(&mut self) { self.sign_in_count += 1; }\n    fn deactivate(self) -> User { User { active: false, ..self } }\n}\n",[33,526,527,535,563,582,587,618,651,690],{"__ignoreMap":31},[36,528,529,531,533],{"class":38,"line":39},[36,530,518],{"class":42},[36,532,47],{"class":46},[36,534,51],{"class":50},[36,536,537,540,542,544,546,548,550,552,554,556,558,561],{"class":38,"line":54},[36,538,539],{"class":42},"    fn",[36,541,229],{"class":46},[36,543,232],{"class":50},[36,545,60],{"class":42},[36,547,63],{"class":46},[36,549,239],{"class":50},[36,551,60],{"class":42},[36,553,63],{"class":46},[36,555,246],{"class":50},[36,557,249],{"class":42},[36,559,560],{"class":188}," Self",[36,562,51],{"class":50},[36,564,565,568,570,572,574,576,578,580],{"class":38,"line":69},[36,566,567],{"class":46},"        User",[36,569,261],{"class":50},[36,571,60],{"class":42},[36,573,201],{"class":188},[36,575,268],{"class":50},[36,577,60],{"class":42},[36,579,273],{"class":188},[36,581,276],{"class":50},[36,583,584],{"class":38,"line":81},[36,585,586],{"class":50},"    }\n",[36,588,589,591,594,596,599,602,604,606,608,611,613,615],{"class":38,"line":94},[36,590,539],{"class":42},[36,592,593],{"class":46}," is_active",[36,595,151],{"class":50},[36,597,598],{"class":42},"&",[36,600,601],{"class":188},"self",[36,603,246],{"class":50},[36,605,249],{"class":42},[36,607,102],{"class":46},[36,609,610],{"class":50}," { ",[36,612,601],{"class":188},[36,614,287],{"class":42},[36,616,617],{"class":50},"active }\n",[36,619,620,622,625,627,630,633,636,638,640,643,646,648],{"class":38,"line":107},[36,621,539],{"class":42},[36,623,624],{"class":46}," sign_in",[36,626,151],{"class":50},[36,628,629],{"class":42},"&mut",[36,631,632],{"class":188}," self",[36,634,635],{"class":50},") { ",[36,637,601],{"class":188},[36,639,287],{"class":42},[36,641,642],{"class":50},"sign_in_count ",[36,644,645],{"class":42},"+=",[36,647,189],{"class":188},[36,649,650],{"class":50},"; }\n",[36,652,653,655,658,660,662,664,666,668,670,673,676,678,681,683,685,687],{"class":38,"line":113},[36,654,539],{"class":42},[36,656,657],{"class":46}," deactivate",[36,659,151],{"class":50},[36,661,601],{"class":188},[36,663,246],{"class":50},[36,665,249],{"class":42},[36,667,47],{"class":46},[36,669,610],{"class":50},[36,671,672],{"class":46},"User",[36,674,675],{"class":50}," { active",[36,677,60],{"class":42},[36,679,680],{"class":188}," false",[36,682,399],{"class":50},[36,684,331],{"class":42},[36,686,601],{"class":188},[36,688,689],{"class":50}," } }\n",[36,691,692],{"class":38,"line":120},[36,693,110],{"class":50},[14,695,696,697,699],{},"You can split ",[33,698,518],{}," across multiple blocks (common in real codebases: one for methods, one for trait impls).",[18,701,703],{"id":702},"methods-vs-associated-functions","Methods vs Associated Functions",[336,705,706,722,731],{},[339,707,708,709,712,713,712,716,718,719,287],{},"Methods take ",[33,710,711],{},"&self","\u002F",[33,714,715],{},"&mut self",[33,717,601],{}," and are called on instances: ",[33,720,721],{},"u.is_active()",[339,723,724,725,727,728,287],{},"Associated functions (no ",[33,726,601],{},") are constructors: ",[33,729,730],{},"User::new(...)",[339,732,733,734,737,738,741],{},"Convention: ",[33,735,736],{},"new"," for the canonical constructor, ",[33,739,740],{},"with_x"," for variant constructors.",[18,743,745],{"id":744},"lifetime-on-structs-recap","Lifetime on Structs (recap)",[23,747,748],{"language":25},[27,749,751],{"className":29,"code":750,"language":25,"meta":31,"style":31},"struct Excerpt\u003C'a> { part: &'a str }\nimpl\u003C'a> Excerpt\u003C'a> { fn part(&self) -> &'a str { self.part } }\n",[33,752,753,784],{"__ignoreMap":31},[36,754,755,757,760,763,766,769,771,774,777,779,782],{"class":38,"line":39},[36,756,43],{"class":42},[36,758,759],{"class":46}," Excerpt",[36,761,762],{"class":50},"\u003C'",[36,764,765],{"class":46},"a",[36,767,768],{"class":50},"> { part",[36,770,60],{"class":42},[36,772,773],{"class":42}," &",[36,775,776],{"class":50},"'",[36,778,765],{"class":46},[36,780,781],{"class":46}," str",[36,783,276],{"class":50},[36,785,786,788,790,792,795,798,800,802,805,807,810,812,814,816,818,820,822,824,826,828,830,832,834],{"class":38,"line":54},[36,787,518],{"class":42},[36,789,762],{"class":50},[36,791,765],{"class":46},[36,793,794],{"class":50},"> ",[36,796,797],{"class":46},"Excerpt",[36,799,762],{"class":50},[36,801,765],{"class":46},[36,803,804],{"class":50},"> { ",[36,806,226],{"class":42},[36,808,809],{"class":46}," part",[36,811,151],{"class":50},[36,813,598],{"class":42},[36,815,601],{"class":188},[36,817,246],{"class":50},[36,819,249],{"class":42},[36,821,773],{"class":42},[36,823,776],{"class":50},[36,825,765],{"class":46},[36,827,781],{"class":46},[36,829,610],{"class":50},[36,831,601],{"class":188},[36,833,287],{"class":42},[36,835,836],{"class":50},"part } }\n",[18,838,840],{"id":839},"generic-structs","Generic Structs",[23,842,843],{"language":25},[27,844,846],{"className":29,"code":845,"language":25,"meta":31,"style":31},"struct Point\u003CT> { x: T, y: T }\n\nimpl\u003CT> Point\u003CT> {\n    fn x(&self) -> &T { &self.x }\n}\n\nimpl Point\u003Cf64> {            \u002F\u002F specialized impl for f64\n    fn distance(&self, other: &Self) -> f64 {\n        ((self.x - other.x).powi(2) + (self.y - other.y).powi(2)).sqrt()\n    }\n}\n",[33,847,848,878,882,902,934,938,942,959,991,1067,1071],{"__ignoreMap":31},[36,849,850,852,855,858,861,864,866,869,872,874,876],{"class":38,"line":39},[36,851,43],{"class":42},[36,853,854],{"class":46}," Point",[36,856,857],{"class":50},"\u003C",[36,859,860],{"class":46},"T",[36,862,863],{"class":50},"> { x",[36,865,60],{"class":42},[36,867,868],{"class":46}," T",[36,870,871],{"class":50},", y",[36,873,60],{"class":42},[36,875,868],{"class":46},[36,877,276],{"class":50},[36,879,880],{"class":38,"line":54},[36,881,117],{"emptyLinePlaceholder":116},[36,883,884,886,888,890,892,895,897,899],{"class":38,"line":69},[36,885,518],{"class":42},[36,887,857],{"class":50},[36,889,860],{"class":46},[36,891,794],{"class":50},[36,893,894],{"class":46},"Point",[36,896,857],{"class":50},[36,898,860],{"class":46},[36,900,901],{"class":50},"> {\n",[36,903,904,906,909,911,913,915,917,919,921,923,925,927,929,931],{"class":38,"line":81},[36,905,539],{"class":42},[36,907,908],{"class":46}," x",[36,910,151],{"class":50},[36,912,598],{"class":42},[36,914,601],{"class":188},[36,916,246],{"class":50},[36,918,249],{"class":42},[36,920,773],{"class":42},[36,922,860],{"class":46},[36,924,610],{"class":50},[36,926,598],{"class":42},[36,928,601],{"class":188},[36,930,287],{"class":42},[36,932,933],{"class":50},"x }\n",[36,935,936],{"class":38,"line":94},[36,937,110],{"class":50},[36,939,940],{"class":38,"line":107},[36,941,117],{"emptyLinePlaceholder":116},[36,943,944,946,948,950,952,955],{"class":38,"line":113},[36,945,518],{"class":42},[36,947,854],{"class":46},[36,949,857],{"class":50},[36,951,470],{"class":46},[36,953,954],{"class":50},"> {            ",[36,956,958],{"class":957},"sdCPZ","\u002F\u002F specialized impl for f64\n",[36,960,961,963,966,968,970,972,975,977,979,982,984,986,989],{"class":38,"line":120},[36,962,539],{"class":42},[36,964,965],{"class":46}," distance",[36,967,151],{"class":50},[36,969,598],{"class":42},[36,971,601],{"class":188},[36,973,974],{"class":50},", other",[36,976,60],{"class":42},[36,978,773],{"class":42},[36,980,981],{"class":188},"Self",[36,983,246],{"class":50},[36,985,249],{"class":42},[36,987,988],{"class":46}," f64",[36,990,51],{"class":50},[36,992,993,996,998,1000,1003,1006,1009,1011,1014,1016,1019,1021,1024,1026,1029,1032,1034,1036,1039,1041,1043,1045,1048,1050,1052,1054,1056,1059,1061,1064],{"class":38,"line":136},[36,994,995],{"class":50},"        ((",[36,997,601],{"class":188},[36,999,287],{"class":42},[36,1001,1002],{"class":50},"x ",[36,1004,1005],{"class":42},"-",[36,1007,1008],{"class":50}," other",[36,1010,287],{"class":42},[36,1012,1013],{"class":50},"x)",[36,1015,287],{"class":42},[36,1017,1018],{"class":46},"powi",[36,1020,151],{"class":50},[36,1022,1023],{"class":188},"2",[36,1025,246],{"class":50},[36,1027,1028],{"class":42},"+",[36,1030,1031],{"class":50}," (",[36,1033,601],{"class":188},[36,1035,287],{"class":42},[36,1037,1038],{"class":50},"y ",[36,1040,1005],{"class":42},[36,1042,1008],{"class":50},[36,1044,287],{"class":42},[36,1046,1047],{"class":50},"y)",[36,1049,287],{"class":42},[36,1051,1018],{"class":46},[36,1053,151],{"class":50},[36,1055,1023],{"class":188},[36,1057,1058],{"class":50},"))",[36,1060,287],{"class":42},[36,1062,1063],{"class":46},"sqrt",[36,1065,1066],{"class":50},"()\n",[36,1068,1069],{"class":38,"line":161},[36,1070,586],{"class":50},[36,1072,1073],{"class":38,"line":181},[36,1074,110],{"class":50},[14,1076,1077,1078,287],{},"Type params can be specialized: methods exist only for a specific ",[33,1079,860],{},[18,1081,1083],{"id":1082},"constants-in-structs","Constants in Structs",[23,1085,1086],{"language":25},[27,1087,1089],{"className":29,"code":1088,"language":25,"meta":31,"style":31},"struct Grid\u003Cconst W: usize, const H: usize> {\n    cells: [[u8; W]; H],\n}\nlet g: Grid\u003C10, 20> = Grid { cells: [[0; 10]; 20] };\n",[33,1090,1091,1124,1152,1156],{"__ignoreMap":31},[36,1092,1093,1095,1098,1100,1103,1106,1108,1111,1113,1115,1118,1120,1122],{"class":38,"line":39},[36,1094,43],{"class":42},[36,1096,1097],{"class":46}," Grid",[36,1099,857],{"class":50},[36,1101,1102],{"class":42},"const",[36,1104,1105],{"class":188}," W",[36,1107,60],{"class":42},[36,1109,1110],{"class":46}," usize",[36,1112,399],{"class":50},[36,1114,1102],{"class":42},[36,1116,1117],{"class":188}," H",[36,1119,60],{"class":42},[36,1121,1110],{"class":46},[36,1123,901],{"class":50},[36,1125,1126,1129,1131,1134,1137,1140,1143,1146,1149],{"class":38,"line":54},[36,1127,1128],{"class":50},"    cells",[36,1130,60],{"class":42},[36,1132,1133],{"class":50}," [[",[36,1135,1136],{"class":46},"u8",[36,1138,1139],{"class":50},"; ",[36,1141,1142],{"class":46},"W",[36,1144,1145],{"class":50},"]; ",[36,1147,1148],{"class":46},"H",[36,1150,1151],{"class":50},"],\n",[36,1153,1154],{"class":38,"line":69},[36,1155,110],{"class":50},[36,1157,1158,1160,1163,1165,1167,1170,1172,1174,1177,1179,1181,1183,1185,1188,1190,1193],{"class":38,"line":81},[36,1159,123],{"class":42},[36,1161,1162],{"class":50}," g",[36,1164,60],{"class":42},[36,1166,1097],{"class":46},[36,1168,1169],{"class":50},"\u003C10, 20> ",[36,1171,129],{"class":42},[36,1173,1097],{"class":46},[36,1175,1176],{"class":50}," { cells",[36,1178,60],{"class":42},[36,1180,1133],{"class":50},[36,1182,434],{"class":188},[36,1184,1139],{"class":50},[36,1186,1187],{"class":188},"10",[36,1189,1145],{"class":50},[36,1191,1192],{"class":188},"20",[36,1194,1195],{"class":50},"] };\n",[14,1197,1198],{},"Const generics (1.51+) allow parametrizing by compile-time constants. Limited to integers\u002Fbool\u002Fchar for now (full generic constants are unstable).",[18,1200,1202],{"id":1201},"derive-macros","Derive Macros",[23,1204,1205],{"language":25},[27,1206,1208],{"className":29,"code":1207,"language":25,"meta":31,"style":31},"#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]\nstruct Pos { x: i32, y: i32 }\n",[33,1209,1210,1250],{"__ignoreMap":31},[36,1211,1212,1215,1218,1220,1223,1225,1227,1229,1232,1234,1237,1239,1242,1244,1247],{"class":38,"line":39},[36,1213,1214],{"class":50},"#[derive(",[36,1216,1217],{"class":46},"Debug",[36,1219,399],{"class":50},[36,1221,1222],{"class":46},"Clone",[36,1224,399],{"class":50},[36,1226,361],{"class":46},[36,1228,399],{"class":50},[36,1230,1231],{"class":46},"PartialEq",[36,1233,399],{"class":50},[36,1235,1236],{"class":46},"Eq",[36,1238,399],{"class":50},[36,1240,1241],{"class":46},"Hash",[36,1243,399],{"class":50},[36,1245,1246],{"class":46},"Default",[36,1248,1249],{"class":50},")]\n",[36,1251,1252,1254,1257,1260,1262,1265,1267,1269,1271],{"class":38,"line":54},[36,1253,43],{"class":42},[36,1255,1256],{"class":46}," Pos",[36,1258,1259],{"class":50}," { x",[36,1261,60],{"class":42},[36,1263,1264],{"class":46}," i32",[36,1266,871],{"class":50},[36,1268,60],{"class":42},[36,1270,1264],{"class":46},[36,1272,276],{"class":50},[14,1274,1275],{},"Common derives:",[336,1277,1278,1286,1292,1300,1306,1317],{},[339,1279,1280,1282,1283],{},[33,1281,1217],{}," → ",[33,1284,1285],{},"{:?}",[339,1287,1288,1291],{},[33,1289,1290],{},"Clone, Copy"," → value duplication",[339,1293,1294,1282,1297],{},[33,1295,1296],{},"PartialEq, Eq",[33,1298,1299],{},"==",[339,1301,1302,1305],{},[33,1303,1304],{},"PartialOrd, Ord"," → comparison and sorting",[339,1307,1308,1310,1311,712,1314],{},[33,1309,1241],{}," → usable in ",[33,1312,1313],{},"HashSet",[33,1315,1316],{},"HashMap",[339,1318,1319,1282,1321],{},[33,1320,1246],{},[33,1322,1323],{},"Pos::default()",[14,1325,1326,712,1328,1331,1332,1335,1336,712,1338,287],{},[33,1327,1236],{},[33,1329,1330],{},"Ord"," require no ",[33,1333,1334],{},"NaN","-like values — floats only get ",[33,1337,1231],{},[33,1339,1340],{},"PartialOrd",[18,1342,1344],{"id":1343},"default",[33,1345,1246],{},[23,1347,1348],{"language":25},[27,1349,1351],{"className":29,"code":1350,"language":25,"meta":31,"style":31},"#[derive(Default)]\nstruct Config { host: String, port: u16 }\nlet c = Config { host: \"localhost\".into(), ..Default::default() };\n",[33,1352,1353,1361,1385],{"__ignoreMap":31},[36,1354,1355,1357,1359],{"class":38,"line":39},[36,1356,1214],{"class":50},[36,1358,1246],{"class":46},[36,1360,1249],{"class":50},[36,1362,1363,1365,1368,1371,1373,1375,1378,1380,1383],{"class":38,"line":54},[36,1364,43],{"class":42},[36,1366,1367],{"class":46}," Config",[36,1369,1370],{"class":50}," { host",[36,1372,60],{"class":42},[36,1374,63],{"class":46},[36,1376,1377],{"class":50},", port",[36,1379,60],{"class":42},[36,1381,1382],{"class":46}," u16",[36,1384,276],{"class":50},[36,1386,1387,1389,1391,1393,1395,1397,1399,1402,1404,1407,1410,1412,1414,1416,1418],{"class":38,"line":69},[36,1388,123],{"class":42},[36,1390,415],{"class":50},[36,1392,129],{"class":42},[36,1394,1367],{"class":46},[36,1396,1370],{"class":50},[36,1398,60],{"class":42},[36,1400,1401],{"class":154}," \"localhost\"",[36,1403,287],{"class":42},[36,1405,1406],{"class":46},"into",[36,1408,1409],{"class":50},"(), ",[36,1411,331],{"class":42},[36,1413,1246],{"class":46},[36,1415,145],{"class":42},[36,1417,1343],{"class":46},[36,1419,1420],{"class":50},"() };\n",[14,1422,1423],{},"Idiomatic way to provide \"default with overrides\".",[18,1425,1427,1429,1430],{"id":1426},"debug-vs-display",[33,1428,1217],{}," vs ",[33,1431,1432],{},"Display",[336,1434,1435,1446],{},[339,1436,1437,1439,1440,1442,1443,362],{},[33,1438,1217],{}," is derived, machine-readable-ish (",[33,1441,1285],{}," \u002F pretty ",[33,1444,1445],{},"{:#?}",[339,1447,1448,1450],{},[33,1449,1432],{}," is user-facing; you must write it manually.",[23,1452,1453],{"language":25},[27,1454,1456],{"className":29,"code":1455,"language":25,"meta":31,"style":31},"impl std::fmt::Display for User {\n    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {\n        write!(f, \"{} \u003C{}>\", self.username, self.email)\n    }\n}\n",[33,1457,1458,1481,1530,1557,1561],{"__ignoreMap":31},[36,1459,1460,1462,1465,1467,1470,1472,1474,1477,1479],{"class":38,"line":39},[36,1461,518],{"class":42},[36,1463,1464],{"class":46}," std",[36,1466,145],{"class":42},[36,1468,1469],{"class":46},"fmt",[36,1471,145],{"class":42},[36,1473,1432],{"class":46},[36,1475,1476],{"class":42}," for",[36,1478,47],{"class":46},[36,1480,51],{"class":50},[36,1482,1483,1485,1488,1490,1492,1494,1497,1499,1502,1504,1506,1508,1510,1513,1515,1517,1519,1521,1523,1525,1528],{"class":38,"line":54},[36,1484,539],{"class":42},[36,1486,1487],{"class":46}," fmt",[36,1489,151],{"class":50},[36,1491,598],{"class":42},[36,1493,601],{"class":188},[36,1495,1496],{"class":50},", f",[36,1498,60],{"class":42},[36,1500,1501],{"class":42}," &mut",[36,1503,1464],{"class":46},[36,1505,145],{"class":42},[36,1507,1469],{"class":46},[36,1509,145],{"class":42},[36,1511,1512],{"class":46},"Formatter",[36,1514,246],{"class":50},[36,1516,249],{"class":42},[36,1518,1464],{"class":46},[36,1520,145],{"class":42},[36,1522,1469],{"class":46},[36,1524,145],{"class":42},[36,1526,1527],{"class":46},"Result",[36,1529,51],{"class":50},[36,1531,1532,1535,1538,1541,1543,1545,1547,1550,1552,1554],{"class":38,"line":69},[36,1533,1534],{"class":46},"        write!",[36,1536,1537],{"class":50},"(f, ",[36,1539,1540],{"class":154},"\"{} \u003C{}>\"",[36,1542,399],{"class":50},[36,1544,601],{"class":188},[36,1546,287],{"class":42},[36,1548,1549],{"class":50},"username, ",[36,1551,601],{"class":188},[36,1553,287],{"class":42},[36,1555,1556],{"class":50},"email)\n",[36,1558,1559],{"class":38,"line":81},[36,1560,586],{"class":50},[36,1562,1563],{"class":38,"line":94},[36,1564,110],{"class":50},[18,1566,1568],{"id":1567},"struct-updates-and-moves","Struct Updates and Moves",[23,1570,1571],{"language":25},[27,1572,1574],{"className":29,"code":1573,"language":25,"meta":31,"style":31},"let u = User { \u002F* filled *\u002F };\nlet email = u.email;             \u002F\u002F partial move\n\u002F\u002F u is partially moved; can still read other fields, but not u as a whole\n",[33,1575,1576,1594,1614],{"__ignoreMap":31},[36,1577,1578,1580,1582,1584,1586,1588,1591],{"class":38,"line":39},[36,1579,123],{"class":42},[36,1581,126],{"class":50},[36,1583,129],{"class":42},[36,1585,47],{"class":46},[36,1587,610],{"class":50},[36,1589,1590],{"class":957},"\u002F* filled *\u002F",[36,1592,1593],{"class":50}," };\n",[36,1595,1596,1598,1601,1603,1606,1608,1611],{"class":38,"line":54},[36,1597,123],{"class":42},[36,1599,1600],{"class":50}," email ",[36,1602,129],{"class":42},[36,1604,1605],{"class":50}," u",[36,1607,287],{"class":42},[36,1609,1610],{"class":50},"email;             ",[36,1612,1613],{"class":957},"\u002F\u002F partial move\n",[36,1615,1616],{"class":38,"line":69},[36,1617,1618],{"class":957},"\u002F\u002F u is partially moved; can still read other fields, but not u as a whole\n",[14,1620,1621,1622,1624],{},"Reconstruct with ",[33,1623,331],{}," if needed.",[18,1626,1628],{"id":1627},"edge-cases-pitfalls","Edge Cases & Pitfalls",[336,1630,1631,1638,1655,1661,1671,1679,1687,1697,1707],{},[339,1632,1633,1637],{},[1634,1635,1636],"strong",{},"Out-of-order field initialization"," is allowed — order doesn't matter in struct literals.",[339,1639,1640,1643,1644,1647,1648,712,1651,1654],{},[1634,1641,1642],{},"Mutability is per-binding, not per-field",": there's no ",[33,1645,1646],{},"mut"," field modifier. Use ",[33,1649,1650],{},"Cell",[33,1652,1653],{},"RefCell"," for interior mutability of single fields.",[339,1656,1657,1660],{},[1634,1658,1659],{},"No inheritance",": Rust has no class inheritance. Use composition + traits.",[339,1662,1663,1666,1667,1670],{},[1634,1664,1665],{},"Private fields",": by default, fields are private to the module. Use ",[33,1668,1669],{},"pub"," to expose.",[339,1672,1673,1678],{},[1634,1674,1675],{},[33,1676,1677],{},"pub(crate)",": visible within the same crate only.",[339,1680,1681,1686],{},[1634,1682,1683],{},[33,1684,1685],{},"#[non_exhaustive]"," prevents external crates from constructing the struct with literal syntax — forces them to use a constructor (future-proofing).",[339,1688,1689,1692,1693,1696],{},[1634,1690,1691],{},"Self-referential structs",": not expressible directly in safe Rust (the borrow checker can't describe the relationship); use crates like ",[33,1694,1695],{},"ouroboros"," or own the data.",[339,1698,1699,1702,1703,1706],{},[1634,1700,1701],{},"ZST struct",": ",[33,1704,1705],{},"struct Marker;"," has size 0.",[339,1708,1709,1715,1716,1719],{},[1634,1710,1711,1712],{},"Field order and ",[33,1713,1714],{},"Drop",": struct fields drop in ",[1634,1717,1718],{},"declaration order"," (RFC 1857), unlike locals which drop in reverse order. This can matter for field destructors that depend on each other.",[18,1721,1723,1725],{"id":1722},"impl-method-dispatch",[33,1724,518],{}," Method Dispatch",[336,1727,1728,1734,1746],{},[339,1729,1730,1731,1733],{},"Methods taking ",[33,1732,601],{}," by value consume the receiver.",[339,1735,1736,1737,399,1739,399,1742,1745],{},"Method resolution finds methods on ",[33,1738,981],{},[33,1740,1741],{},"&Self",[33,1743,1744],{},"&mut Self"," automatically based on call syntax.",[339,1747,1748,1749,1751],{},"Auto-ref\u002Fderef lets you call ",[33,1750,711],{}," methods on owned values and vice versa.",[18,1753,1755],{"id":1754},"memory-layout","Memory Layout",[336,1757,1758],{},[339,1759,1760,1761,1764,1765,1768,1769,1772],{},"Reorder fields for minimal padding — the compiler does this by default (repr optimization). Use ",[33,1762,1763],{},"#[repr(C)]"," to force C-compatible layout (FFI). Use ",[33,1766,1767],{},"#[repr(transparent)]"," for newtype wrappers (same layout as inner). Use ",[33,1770,1771],{},"#[repr(packed)]"," to disable padding (careful with alignment → unaligned reads are UB).",[18,1774,1776],{"id":1775},"summary","Summary",[14,1778,1779,1780,1782,1783,1786],{},"Structs come in named, tuple, and unit forms. Methods live in ",[33,1781,518],{}," blocks. Derive macros give you common traits for free. Const generics, generics, and lifetimes parametrize them. Memory layout can be controlled with ",[33,1784,1785],{},"repr"," attributes.",[14,1788,1789],{},"Next: Enums — Rust's algebraic data types.",[1791,1792,1793],"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 .sJ6F3, html code.shiki .sJ6F3{--shiki-default:#032F62;--shiki-github-dark:#9ECBFF}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);}html pre.shiki code .sdCPZ, html code.shiki .sdCPZ{--shiki-default:#6A737D;--shiki-github-dark:#6A737D}",{"title":31,"searchDepth":54,"depth":54,"links":1795},[1796,1800,1801,1802,1804,1805,1806,1807,1808,1809,1810,1812,1813,1814,1816,1817],{"id":20,"depth":54,"text":21,"children":1797},[1798,1799],{"id":213,"depth":69,"text":214},{"id":290,"depth":69,"text":291},{"id":376,"depth":54,"text":377},{"id":479,"depth":54,"text":480},{"id":515,"depth":54,"text":1803},"impl Blocks",{"id":702,"depth":54,"text":703},{"id":744,"depth":54,"text":745},{"id":839,"depth":54,"text":840},{"id":1082,"depth":54,"text":1083},{"id":1201,"depth":54,"text":1202},{"id":1343,"depth":54,"text":1246},{"id":1426,"depth":54,"text":1811},"Debug vs Display",{"id":1567,"depth":54,"text":1568},{"id":1627,"depth":54,"text":1628},{"id":1722,"depth":54,"text":1815},"impl Method Dispatch",{"id":1754,"depth":54,"text":1755},{"id":1775,"depth":54,"text":1776},"md",{},"\u002Frust\u002F11-structs",{"title":5,"description":16},"rust\u002F11-structs","E2sjnzoWWv_LoudGFI3erGNa2lfE8Rq9QTjnQRaLOYk",1785944093226]