diff --git a/po/da.po b/po/da.po
index c124fa17..f3c8e89f 100644
--- a/po/da.po
+++ b/po/da.po
@@ -5,133 +5,133 @@ msgstr ""
"PO-Revision-Date: \n"
"Last-Translator: \n"
"Language-Team: \n"
+"Language: da\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: src/SUMMARY.md:3 src/welcome.md:1
+#: src/SUMMARY.md:4 src/index.md:1
msgid "Welcome to Comprehensive Rust 🦀"
msgstr "Velkommen til Comprehensive Rust 🦀"
-#: src/SUMMARY.md:4 src/running-the-course.md:1
+#: src/SUMMARY.md:5 src/running-the-course.md:1
msgid "Running the Course"
msgstr "Afvikling af kurset"
-#: src/SUMMARY.md:5 src/running-the-course/course-structure.md:1
+#: src/SUMMARY.md:6 src/running-the-course/course-structure.md:1
msgid "Course Structure"
msgstr "Kursets struktur"
-#: src/SUMMARY.md:6 src/running-the-course/keyboard-shortcuts.md:1
+#: src/SUMMARY.md:7 src/running-the-course/keyboard-shortcuts.md:1
msgid "Keyboard Shortcuts"
msgstr "Genvejstaster"
-#: src/SUMMARY.md:7 src/running-the-course/translations.md:1
+#: src/SUMMARY.md:8 src/running-the-course/translations.md:1
msgid "Translations"
msgstr "Oversættelser"
-#: src/SUMMARY.md:8 src/cargo.md:1
+#: src/SUMMARY.md:9 src/cargo.md:1
msgid "Using Cargo"
msgstr "Brug af Cargo"
-#: src/SUMMARY.md:9
+#: src/SUMMARY.md:10
msgid "Rust Ecosystem"
msgstr "Rust's økosystem"
-#: src/SUMMARY.md:10
+#: src/SUMMARY.md:11
msgid "Code Samples"
msgstr "Kodeeksempler"
-#: src/SUMMARY.md:11
+#: src/SUMMARY.md:12
msgid "Running Cargo Locally"
msgstr ""
-#: src/SUMMARY.md:14
+#: src/SUMMARY.md:15
msgid "Day 1: Morning"
msgstr "Dag 1: Formiddag"
-#: src/SUMMARY.md:18 src/SUMMARY.md:75 src/SUMMARY.md:128 src/SUMMARY.md:185
-#: src/SUMMARY.md:211 src/SUMMARY.md:259
+#: src/SUMMARY.md:19 src/SUMMARY.md:76 src/SUMMARY.md:130 src/SUMMARY.md:187
+#: src/SUMMARY.md:213 src/SUMMARY.md:263
msgid "Welcome"
msgstr "Velkommen"
-#: src/SUMMARY.md:19 src/welcome-day-1/what-is-rust.md:1
+#: src/SUMMARY.md:20 src/welcome-day-1/what-is-rust.md:1
msgid "What is Rust?"
msgstr "Hvad er Rust?"
-#: src/SUMMARY.md:20 src/hello-world.md:1
+#: src/SUMMARY.md:21 src/hello-world.md:1
msgid "Hello World!"
msgstr "Hej verden!"
-#: src/SUMMARY.md:21 src/hello-world/small-example.md:1
+#: src/SUMMARY.md:22 src/hello-world/small-example.md:1
msgid "Small Example"
msgstr "Et little eksempel"
-#: src/SUMMARY.md:22 src/why-rust.md:1
+#: src/SUMMARY.md:23 src/why-rust.md:1
msgid "Why Rust?"
msgstr "Hvorfor bruge Rust?"
-#: src/SUMMARY.md:23 src/why-rust/compile-time.md:1
+#: src/SUMMARY.md:24 src/why-rust/compile-time.md:1
msgid "Compile Time Guarantees"
msgstr "Garantier før programudføring"
-#: src/SUMMARY.md:24 src/why-rust/runtime.md:1
+#: src/SUMMARY.md:25 src/why-rust/runtime.md:1
msgid "Runtime Guarantees"
msgstr "Garantier under programudføring"
-#: src/SUMMARY.md:25 src/why-rust/modern.md:1
+#: src/SUMMARY.md:26 src/why-rust/modern.md:1
msgid "Modern Features"
msgstr "Moderne faciliteter"
-#: src/SUMMARY.md:26 src/basic-syntax.md:1
+#: src/SUMMARY.md:27 src/basic-syntax.md:1
msgid "Basic Syntax"
msgstr "Grundlæggende syntaks"
-#: src/SUMMARY.md:27 src/basic-syntax/scalar-types.md:1
+#: src/SUMMARY.md:28 src/basic-syntax/scalar-types.md:1
msgid "Scalar Types"
msgstr "Skalartyper"
-#: src/SUMMARY.md:28 src/basic-syntax/compound-types.md:1
+#: src/SUMMARY.md:29 src/basic-syntax/compound-types.md:1
msgid "Compound Types"
msgstr "Sammensatte typer"
-#: src/SUMMARY.md:29 src/basic-syntax/references.md:1
+#: src/SUMMARY.md:30 src/basic-syntax/references.md:1
msgid "References"
msgstr "Referencer"
-#: src/SUMMARY.md:30 src/basic-syntax/references-dangling.md:1
+#: src/SUMMARY.md:31 src/basic-syntax/references-dangling.md:1
msgid "Dangling References"
msgstr "Hængende referencer"
-#: src/SUMMARY.md:31 src/basic-syntax/slices.md:1
+#: src/SUMMARY.md:32 src/basic-syntax/slices.md:1
msgid "Slices"
msgstr "Arraysegmenter"
-#: src/SUMMARY.md:32
+#: src/SUMMARY.md:33
msgid "String vs str"
msgstr "String og str"
-#: src/SUMMARY.md:33 src/basic-syntax/functions.md:1
+#: src/SUMMARY.md:34 src/basic-syntax/functions.md:1
msgid "Functions"
msgstr "Funktioner"
-#: src/SUMMARY.md:34 src/basic-syntax/rustdoc.md:1
+#: src/SUMMARY.md:35 src/basic-syntax/rustdoc.md:1
msgid "Rustdoc"
msgstr ""
-#: src/SUMMARY.md:35 src/SUMMARY.md:82 src/basic-syntax/methods.md:1
+#: src/SUMMARY.md:36 src/SUMMARY.md:83 src/basic-syntax/methods.md:1
#: src/methods.md:1
msgid "Methods"
msgstr "Metoder"
-#: src/SUMMARY.md:36
+#: src/SUMMARY.md:37
msgid "Overloading"
msgstr "Funktionsoverlæsning"
-#: src/SUMMARY.md:37 src/SUMMARY.md:66 src/SUMMARY.md:90 src/SUMMARY.md:119
-#: src/SUMMARY.md:148 src/SUMMARY.md:177 src/SUMMARY.md:204 src/SUMMARY.md:225
-#: src/SUMMARY.md:251 src/SUMMARY.md:273 src/SUMMARY.md:293
+#: src/SUMMARY.md:38 src/SUMMARY.md:67 src/SUMMARY.md:91 src/SUMMARY.md:121
+#: src/SUMMARY.md:150 src/SUMMARY.md:179 src/SUMMARY.md:206 src/SUMMARY.md:227
+#: src/SUMMARY.md:255 src/SUMMARY.md:277 src/SUMMARY.md:298
#: src/exercises/android/morning.md:1 src/exercises/bare-metal/morning.md:1
#: src/exercises/bare-metal/afternoon.md:1
#: src/exercises/concurrency/morning.md:1
@@ -139,939 +139,921 @@ msgstr "Funktionsoverlæsning"
msgid "Exercises"
msgstr "Øvelser"
-#: src/SUMMARY.md:38 src/exercises/day-1/implicit-conversions.md:1
+#: src/SUMMARY.md:39 src/exercises/day-1/implicit-conversions.md:1
msgid "Implicit Conversions"
msgstr "Implicitte konverteringer"
-#: src/SUMMARY.md:39
+#: src/SUMMARY.md:40
msgid "Arrays and for Loops"
msgstr "Arrays og for-løkker"
-#: src/SUMMARY.md:41
+#: src/SUMMARY.md:42
msgid "Day 1: Afternoon"
msgstr "Dag 1: Eftermiddag"
-#: src/SUMMARY.md:43 src/basic-syntax/variables.md:1
+#: src/SUMMARY.md:44 src/basic-syntax/variables.md:1
msgid "Variables"
msgstr "Variabler"
-#: src/SUMMARY.md:44 src/basic-syntax/type-inference.md:1
+#: src/SUMMARY.md:45 src/basic-syntax/type-inference.md:1
msgid "Type Inference"
msgstr "Typeudledning"
-#: src/SUMMARY.md:45
+#: src/SUMMARY.md:46
msgid "static & const"
msgstr "static & const"
-#: src/SUMMARY.md:46 src/basic-syntax/scopes-shadowing.md:1
+#: src/SUMMARY.md:47 src/basic-syntax/scopes-shadowing.md:1
msgid "Scopes and Shadowing"
msgstr "Virkefelt og overskyggede variabler"
-#: src/SUMMARY.md:47 src/memory-management.md:1
+#: src/SUMMARY.md:48 src/memory-management.md:1
msgid "Memory Management"
msgstr "Håndtering af hukommelse"
-#: src/SUMMARY.md:48
+#: src/SUMMARY.md:49
msgid "Stack vs Heap"
msgstr "Stak og heap"
-#: src/SUMMARY.md:49 src/memory-management/stack.md:1
+#: src/SUMMARY.md:50
msgid "Stack Memory"
msgstr "Stakhukommelse"
-#: src/SUMMARY.md:50 src/memory-management/manual.md:1
+#: src/SUMMARY.md:51 src/memory-management/manual.md:1
msgid "Manual Memory Management"
msgstr "Manuel hukommelseshåndtering"
-#: src/SUMMARY.md:51 src/memory-management/scope-based.md:1
+#: src/SUMMARY.md:52 src/memory-management/scope-based.md:1
msgid "Scope-Based Memory Management"
msgstr "Hukommelseshåndtering baseret på virkefelt"
-#: src/SUMMARY.md:52
+#: src/SUMMARY.md:53
msgid "Garbage Collection"
msgstr "Automatisk hukommelseshåndtering"
-#: src/SUMMARY.md:53
+#: src/SUMMARY.md:54
msgid "Rust Memory Management"
msgstr "Hukommelseshåndtering i Rust"
-#: src/SUMMARY.md:54 src/memory-management/comparison.md:1
+#: src/SUMMARY.md:55 src/memory-management/comparison.md:1
msgid "Comparison"
msgstr "Sammenligning"
-#: src/SUMMARY.md:55 src/ownership.md:1
+#: src/SUMMARY.md:56 src/ownership.md:1
msgid "Ownership"
msgstr "Ejerskab"
-#: src/SUMMARY.md:56 src/ownership/move-semantics.md:1
+#: src/SUMMARY.md:57 src/ownership/move-semantics.md:1
msgid "Move Semantics"
msgstr "Overførselssemantik"
-#: src/SUMMARY.md:57 src/ownership/moved-strings-rust.md:1
+#: src/SUMMARY.md:58 src/ownership/moved-strings-rust.md:1
msgid "Moved Strings in Rust"
msgstr "Overførte strenge i Rust"
-#: src/SUMMARY.md:58 src/ownership/double-free-modern-cpp.md:1
+#: src/SUMMARY.md:59
msgid "Double Frees in Modern C++"
msgstr "Dobbeltfrigivelser i moderne C++"
-#: src/SUMMARY.md:59 src/ownership/moves-function-calls.md:1
+#: src/SUMMARY.md:60 src/ownership/moves-function-calls.md:1
msgid "Moves in Function Calls"
msgstr "Overførsel af ejerskab i funktionskald"
-#: src/SUMMARY.md:60 src/ownership/copy-clone.md:1
+#: src/SUMMARY.md:61 src/ownership/copy-clone.md:1
msgid "Copying and Cloning"
msgstr "Kopiering og kloning"
-#: src/SUMMARY.md:61 src/ownership/borrowing.md:1
+#: src/SUMMARY.md:62 src/ownership/borrowing.md:1
msgid "Borrowing"
msgstr "Lån af variabler"
-#: src/SUMMARY.md:62 src/ownership/shared-unique-borrows.md:1
+#: src/SUMMARY.md:63 src/ownership/shared-unique-borrows.md:1
msgid "Shared and Unique Borrows"
msgstr "Delte og unikke lån"
-#: src/SUMMARY.md:63 src/ownership/lifetimes.md:1
+#: src/SUMMARY.md:64 src/ownership/lifetimes.md:1
msgid "Lifetimes"
msgstr "Livstider"
-#: src/SUMMARY.md:64 src/ownership/lifetimes-function-calls.md:1
+#: src/SUMMARY.md:65 src/ownership/lifetimes-function-calls.md:1
msgid "Lifetimes in Function Calls"
msgstr "Livstider i funktionskald"
-#: src/SUMMARY.md:65 src/ownership/lifetimes-data-structures.md:1
+#: src/SUMMARY.md:66 src/ownership/lifetimes-data-structures.md:1
msgid "Lifetimes in Data Structures"
msgstr "Livstider i datastrukturer"
-#: src/SUMMARY.md:67 src/exercises/day-1/book-library.md:1
-#: src/exercises/day-1/solutions-afternoon.md:3
-msgid "Designing a Library"
-msgstr "Design af et bibliotek"
+#: src/SUMMARY.md:68 src/exercises/day-1/book-library.md:1
+#, fuzzy
+msgid "Storing Books"
+msgstr "String og str"
-#: src/SUMMARY.md:68 src/exercises/day-1/iterators-and-ownership.md:1
+#: src/SUMMARY.md:69 src/exercises/day-1/iterators-and-ownership.md:1
msgid "Iterators and Ownership"
msgstr "Iteratorer og ejerskab"
-#: src/SUMMARY.md:71
+#: src/SUMMARY.md:72
msgid "Day 2: Morning"
msgstr "Dag 2: Formiddag"
-#: src/SUMMARY.md:76 src/structs.md:1
+#: src/SUMMARY.md:77 src/structs.md:1
msgid "Structs"
msgstr "Strukturer"
-#: src/SUMMARY.md:77 src/structs/tuple-structs.md:1
+#: src/SUMMARY.md:78 src/structs/tuple-structs.md:1
msgid "Tuple Structs"
msgstr "Tuple-strukturer"
-#: src/SUMMARY.md:78 src/structs/field-shorthand.md:1
+#: src/SUMMARY.md:79 src/structs/field-shorthand.md:1
msgid "Field Shorthand Syntax"
msgstr "Forenklet strukturinitialisering"
-#: src/SUMMARY.md:79 src/enums.md:1
+#: src/SUMMARY.md:80 src/enums.md:1
msgid "Enums"
msgstr "Enumerationer"
-#: src/SUMMARY.md:80 src/enums/variant-payloads.md:1
+#: src/SUMMARY.md:81 src/enums/variant-payloads.md:1
msgid "Variant Payloads"
msgstr "Nyttelast i varianter"
-#: src/SUMMARY.md:81 src/enums/sizes.md:1
+#: src/SUMMARY.md:82 src/enums/sizes.md:1
msgid "Enum Sizes"
msgstr "Størrelse af enumerationer"
-#: src/SUMMARY.md:83 src/methods/receiver.md:1
+#: src/SUMMARY.md:84 src/methods/receiver.md:1
msgid "Method Receiver"
msgstr "Modtager af funktionskald"
-#: src/SUMMARY.md:84 src/SUMMARY.md:159 src/SUMMARY.md:272
+#: src/SUMMARY.md:85 src/SUMMARY.md:161 src/SUMMARY.md:276
#: src/methods/example.md:1 src/concurrency/shared_state/example.md:1
msgid "Example"
msgstr "Eksempel"
-#: src/SUMMARY.md:85 src/pattern-matching.md:1
+#: src/SUMMARY.md:86 src/pattern-matching.md:1
msgid "Pattern Matching"
msgstr "Mønstergenkendelse"
-#: src/SUMMARY.md:86 src/pattern-matching/destructuring-enums.md:1
+#: src/SUMMARY.md:87 src/pattern-matching/destructuring-enums.md:1
msgid "Destructuring Enums"
msgstr "Dekonstruktion af enumerationer"
-#: src/SUMMARY.md:87 src/pattern-matching/destructuring-structs.md:1
+#: src/SUMMARY.md:88 src/pattern-matching/destructuring-structs.md:1
msgid "Destructuring Structs"
msgstr "Dekonstruktion af strukturer"
-#: src/SUMMARY.md:88 src/pattern-matching/destructuring-arrays.md:1
+#: src/SUMMARY.md:89 src/pattern-matching/destructuring-arrays.md:1
msgid "Destructuring Arrays"
msgstr "Dekonstruktion af arrays"
-#: src/SUMMARY.md:89 src/pattern-matching/match-guards.md:1
+#: src/SUMMARY.md:90 src/pattern-matching/match-guards.md:1
msgid "Match Guards"
msgstr ""
-#: src/SUMMARY.md:91 src/exercises/day-2/health-statistics.md:1
+#: src/SUMMARY.md:92 src/exercises/day-2/health-statistics.md:1
msgid "Health Statistics"
msgstr ""
-#: src/SUMMARY.md:92 src/exercises/day-2/solutions-morning.md:3
+#: src/SUMMARY.md:93 src/exercises/day-2/solutions-morning.md:3
msgid "Points and Polygons"
msgstr "Punkter og polygoner"
-#: src/SUMMARY.md:94
+#: src/SUMMARY.md:95
msgid "Day 2: Afternoon"
msgstr "Dag 2: Eftermiddag"
-#: src/SUMMARY.md:96 src/SUMMARY.md:286 src/control-flow.md:1
+#: src/SUMMARY.md:97 src/SUMMARY.md:290 src/control-flow.md:1
msgid "Control Flow"
msgstr "Forgreninger"
-#: src/SUMMARY.md:97 src/control-flow/blocks.md:1
+#: src/SUMMARY.md:98 src/control-flow/blocks.md:1
msgid "Blocks"
msgstr "Blokke"
-#: src/SUMMARY.md:98
+#: src/SUMMARY.md:99
msgid "if expressions"
msgstr "if udtryk"
-#: src/SUMMARY.md:99
+#: src/SUMMARY.md:100
msgid "if let expressions"
msgstr "if let udtryk"
-#: src/SUMMARY.md:100
+#: src/SUMMARY.md:101
msgid "while expressions"
msgstr "while udtryk"
-#: src/SUMMARY.md:101
+#: src/SUMMARY.md:102
msgid "while let expressions"
msgstr "while let udtryk"
-#: src/SUMMARY.md:102
+#: src/SUMMARY.md:103
msgid "for expressions"
msgstr "for udtryk"
-#: src/SUMMARY.md:103
+#: src/SUMMARY.md:104
msgid "loop expressions"
msgstr "loop udtryk"
-#: src/SUMMARY.md:104
+#: src/SUMMARY.md:105
msgid "match expressions"
msgstr "match udtryk"
-#: src/SUMMARY.md:105
+#: src/SUMMARY.md:106
msgid "break & continue"
msgstr "break og continue"
-#: src/SUMMARY.md:106 src/std.md:1
+#: src/SUMMARY.md:107 src/std.md:1
msgid "Standard Library"
msgstr ""
-#: src/SUMMARY.md:107
+#: src/SUMMARY.md:108
msgid "Option and Result"
msgstr ""
-#: src/SUMMARY.md:108 src/std/string.md:1
+#: src/SUMMARY.md:109 src/std/string.md:1
msgid "String"
msgstr ""
-#: src/SUMMARY.md:109
+#: src/SUMMARY.md:110
msgid "Vec"
msgstr ""
-#: src/SUMMARY.md:110
+#: src/SUMMARY.md:111
msgid "HashMap"
msgstr ""
-#: src/SUMMARY.md:111
+#: src/SUMMARY.md:112
msgid "Box"
msgstr ""
-#: src/SUMMARY.md:112
+#: src/SUMMARY.md:113
msgid "Recursive Data Types"
msgstr ""
-#: src/SUMMARY.md:113 src/std/box-niche.md:1
+#: src/SUMMARY.md:114 src/std/box-niche.md:1
msgid "Niche Optimization"
msgstr ""
-#: src/SUMMARY.md:114
+#: src/SUMMARY.md:115
msgid "Rc"
msgstr ""
-#: src/SUMMARY.md:115 src/modules.md:1
+#: src/SUMMARY.md:116
+msgid "Cell/RefCell"
+msgstr ""
+
+#: src/SUMMARY.md:117 src/modules.md:1
msgid "Modules"
msgstr ""
-#: src/SUMMARY.md:116 src/modules/visibility.md:1
+#: src/SUMMARY.md:118 src/modules/visibility.md:1
msgid "Visibility"
msgstr ""
-#: src/SUMMARY.md:117 src/modules/paths.md:1
+#: src/SUMMARY.md:119 src/modules/paths.md:1
msgid "Paths"
msgstr ""
-#: src/SUMMARY.md:118 src/modules/filesystem.md:1
+#: src/SUMMARY.md:120 src/modules/filesystem.md:1
msgid "Filesystem Hierarchy"
msgstr ""
-#: src/SUMMARY.md:120 src/exercises/day-2/luhn.md:1
+#: src/SUMMARY.md:122 src/exercises/day-2/luhn.md:1
#: src/exercises/day-2/solutions-afternoon.md:3
msgid "Luhn Algorithm"
msgstr "Luhn-algorithmen"
-#: src/SUMMARY.md:121 src/exercises/day-2/strings-iterators.md:1
+#: src/SUMMARY.md:123 src/exercises/day-2/strings-iterators.md:1
#: src/exercises/day-2/solutions-afternoon.md:97
msgid "Strings and Iterators"
msgstr "Strenge og iteratorer"
-#: src/SUMMARY.md:124
+#: src/SUMMARY.md:126
msgid "Day 3: Morning"
msgstr ""
-#: src/SUMMARY.md:129 src/generics.md:1
+#: src/SUMMARY.md:131 src/generics.md:1
msgid "Generics"
msgstr ""
-#: src/SUMMARY.md:130 src/generics/data-types.md:1
+#: src/SUMMARY.md:132 src/generics/data-types.md:1
msgid "Generic Data Types"
msgstr ""
-#: src/SUMMARY.md:131 src/generics/methods.md:1
+#: src/SUMMARY.md:133 src/generics/methods.md:1
msgid "Generic Methods"
msgstr ""
-#: src/SUMMARY.md:132 src/generics/monomorphization.md:1
+#: src/SUMMARY.md:134 src/generics/monomorphization.md:1
msgid "Monomorphization"
msgstr ""
-#: src/SUMMARY.md:133 src/traits.md:1
+#: src/SUMMARY.md:135 src/traits.md:1
msgid "Traits"
msgstr ""
-#: src/SUMMARY.md:134 src/traits/trait-objects.md:1
+#: src/SUMMARY.md:136 src/traits/trait-objects.md:1
msgid "Trait Objects"
msgstr ""
-#: src/SUMMARY.md:135 src/traits/deriving-traits.md:1
+#: src/SUMMARY.md:137 src/traits/deriving-traits.md:1
msgid "Deriving Traits"
msgstr ""
-#: src/SUMMARY.md:136 src/traits/default-methods.md:1
+#: src/SUMMARY.md:138 src/traits/default-methods.md:1
msgid "Default Methods"
msgstr ""
-#: src/SUMMARY.md:137 src/traits/trait-bounds.md:1
+#: src/SUMMARY.md:139 src/traits/trait-bounds.md:1
msgid "Trait Bounds"
msgstr ""
-#: src/SUMMARY.md:138
+#: src/SUMMARY.md:140
msgid "impl Trait"
msgstr ""
-#: src/SUMMARY.md:139 src/traits/important-traits.md:1
+#: src/SUMMARY.md:141 src/traits/important-traits.md:1
msgid "Important Traits"
msgstr ""
-#: src/SUMMARY.md:140
+#: src/SUMMARY.md:142
msgid "Iterator"
msgstr ""
-#: src/SUMMARY.md:141 src/traits/from-iterator.md:1
+#: src/SUMMARY.md:143 src/traits/from-iterator.md:1
msgid "FromIterator"
msgstr ""
-#: src/SUMMARY.md:142
+#: src/SUMMARY.md:144
msgid "From and Into"
msgstr ""
-#: src/SUMMARY.md:143
+#: src/SUMMARY.md:145
msgid "Read and Write"
msgstr ""
-#: src/SUMMARY.md:144
+#: src/SUMMARY.md:146
msgid "Drop"
msgstr ""
-#: src/SUMMARY.md:145
+#: src/SUMMARY.md:147
msgid "Default"
msgstr ""
-#: src/SUMMARY.md:146
+#: src/SUMMARY.md:148
msgid "Operators: Add, Mul, ..."
msgstr ""
-#: src/SUMMARY.md:147
+#: src/SUMMARY.md:149
msgid "Closures: Fn, FnMut, FnOnce"
msgstr ""
-#: src/SUMMARY.md:149 src/exercises/day-3/simple-gui.md:1
+#: src/SUMMARY.md:151 src/exercises/day-3/simple-gui.md:1
#: src/exercises/day-3/solutions-morning.md:3
msgid "A Simple GUI Library"
msgstr ""
-#: src/SUMMARY.md:151
+#: src/SUMMARY.md:153
msgid "Day 3: Afternoon"
msgstr ""
-#: src/SUMMARY.md:153 src/error-handling.md:1
+#: src/SUMMARY.md:155 src/error-handling.md:1
msgid "Error Handling"
msgstr ""
-#: src/SUMMARY.md:154 src/error-handling/panics.md:1
+#: src/SUMMARY.md:156 src/error-handling/panics.md:1
msgid "Panics"
msgstr ""
-#: src/SUMMARY.md:155
+#: src/SUMMARY.md:157
msgid "Catching Stack Unwinding"
msgstr ""
-#: src/SUMMARY.md:156
+#: src/SUMMARY.md:158
msgid "Structured Error Handling"
msgstr ""
-#: src/SUMMARY.md:157
+#: src/SUMMARY.md:159
msgid "Propagating Errors with ?"
msgstr ""
-#: src/SUMMARY.md:158 src/error-handling/converting-error-types.md:1
+#: src/SUMMARY.md:160 src/error-handling/converting-error-types.md:1
#: src/error-handling/converting-error-types-example.md:1
msgid "Converting Error Types"
msgstr ""
-#: src/SUMMARY.md:160 src/error-handling/deriving-error-enums.md:1
+#: src/SUMMARY.md:162 src/error-handling/deriving-error-enums.md:1
msgid "Deriving Error Enums"
msgstr ""
-#: src/SUMMARY.md:161 src/error-handling/dynamic-errors.md:1
+#: src/SUMMARY.md:163 src/error-handling/dynamic-errors.md:1
msgid "Dynamic Error Types"
msgstr ""
-#: src/SUMMARY.md:162 src/error-handling/error-contexts.md:1
+#: src/SUMMARY.md:164 src/error-handling/error-contexts.md:1
msgid "Adding Context to Errors"
msgstr ""
-#: src/SUMMARY.md:163 src/testing.md:1
+#: src/SUMMARY.md:165 src/testing.md:1
msgid "Testing"
msgstr ""
-#: src/SUMMARY.md:164 src/testing/unit-tests.md:1
+#: src/SUMMARY.md:166 src/testing/unit-tests.md:1
msgid "Unit Tests"
msgstr ""
-#: src/SUMMARY.md:165 src/testing/test-modules.md:1
+#: src/SUMMARY.md:167 src/testing/test-modules.md:1
msgid "Test Modules"
msgstr ""
-#: src/SUMMARY.md:166 src/testing/doc-tests.md:1
+#: src/SUMMARY.md:168 src/testing/doc-tests.md:1
msgid "Documentation Tests"
msgstr ""
-#: src/SUMMARY.md:167 src/testing/integration-tests.md:1
+#: src/SUMMARY.md:169 src/testing/integration-tests.md:1
msgid "Integration Tests"
msgstr ""
-#: src/SUMMARY.md:168 src/bare-metal/useful-crates.md:1
+#: src/SUMMARY.md:170 src/bare-metal/useful-crates.md:1
msgid "Useful crates"
msgstr ""
-#: src/SUMMARY.md:169 src/unsafe.md:1
+#: src/SUMMARY.md:171 src/unsafe.md:1
msgid "Unsafe Rust"
msgstr ""
-#: src/SUMMARY.md:170 src/unsafe/raw-pointers.md:1
+#: src/SUMMARY.md:172 src/unsafe/raw-pointers.md:1
msgid "Dereferencing Raw Pointers"
msgstr ""
-#: src/SUMMARY.md:171 src/unsafe/mutable-static-variables.md:1
+#: src/SUMMARY.md:173 src/unsafe/mutable-static-variables.md:1
msgid "Mutable Static Variables"
msgstr ""
-#: src/SUMMARY.md:172 src/unsafe/unions.md:1
+#: src/SUMMARY.md:174 src/unsafe/unions.md:1
msgid "Unions"
msgstr ""
-#: src/SUMMARY.md:173 src/unsafe/calling-unsafe-functions.md:1
+#: src/SUMMARY.md:175 src/unsafe/calling-unsafe-functions.md:1
msgid "Calling Unsafe Functions"
msgstr ""
-#: src/SUMMARY.md:174 src/unsafe/writing-unsafe-functions.md:1
+#: src/SUMMARY.md:176 src/unsafe/writing-unsafe-functions.md:1
msgid "Writing Unsafe Functions"
msgstr ""
-#: src/SUMMARY.md:175
+#: src/SUMMARY.md:177
msgid "Extern Functions"
msgstr ""
-#: src/SUMMARY.md:176 src/unsafe/unsafe-traits.md:1
+#: src/SUMMARY.md:178 src/unsafe/unsafe-traits.md:1
msgid "Implementing Unsafe Traits"
msgstr ""
-#: src/SUMMARY.md:178 src/exercises/day-3/safe-ffi-wrapper.md:1
+#: src/SUMMARY.md:180 src/exercises/day-3/safe-ffi-wrapper.md:1
#: src/exercises/day-3/solutions-afternoon.md:3
msgid "Safe FFI Wrapper"
msgstr ""
-#: src/SUMMARY.md:181 src/SUMMARY.md:249
+#: src/SUMMARY.md:183 src/SUMMARY.md:253
#: src/running-the-course/course-structure.md:16 src/bare-metal/android.md:1
msgid "Android"
msgstr "Android"
-#: src/SUMMARY.md:186 src/android/setup.md:1
+#: src/SUMMARY.md:188 src/android/setup.md:1
msgid "Setup"
msgstr ""
-#: src/SUMMARY.md:187 src/android/build-rules.md:1
+#: src/SUMMARY.md:189 src/android/build-rules.md:1
msgid "Build Rules"
msgstr ""
-#: src/SUMMARY.md:188
+#: src/SUMMARY.md:190
msgid "Binary"
msgstr ""
-#: src/SUMMARY.md:189
+#: src/SUMMARY.md:191
msgid "Library"
msgstr ""
-#: src/SUMMARY.md:190 src/android/aidl.md:1
+#: src/SUMMARY.md:192 src/android/aidl.md:1
msgid "AIDL"
msgstr ""
-#: src/SUMMARY.md:191
+#: src/SUMMARY.md:193
msgid "Interface"
msgstr ""
-#: src/SUMMARY.md:192
+#: src/SUMMARY.md:194
msgid "Implementation"
msgstr ""
-#: src/SUMMARY.md:193
+#: src/SUMMARY.md:195
msgid "Server"
msgstr ""
-#: src/SUMMARY.md:194 src/android/aidl/deploy.md:1
+#: src/SUMMARY.md:196 src/android/aidl/deploy.md:1
msgid "Deploy"
msgstr ""
-#: src/SUMMARY.md:195
+#: src/SUMMARY.md:197
msgid "Client"
msgstr ""
-#: src/SUMMARY.md:196 src/android/aidl/changing.md:1
+#: src/SUMMARY.md:198 src/android/aidl/changing.md:1
msgid "Changing API"
msgstr ""
-#: src/SUMMARY.md:197 src/SUMMARY.md:240 src/android/logging.md:1
+#: src/SUMMARY.md:199 src/SUMMARY.md:243 src/android/logging.md:1
#: src/bare-metal/aps/logging.md:1
msgid "Logging"
msgstr ""
-#: src/SUMMARY.md:198 src/android/interoperability.md:1
+#: src/SUMMARY.md:200 src/android/interoperability.md:1
msgid "Interoperability"
msgstr ""
-#: src/SUMMARY.md:199
+#: src/SUMMARY.md:201
msgid "With C"
msgstr ""
-#: src/SUMMARY.md:200
+#: src/SUMMARY.md:202
msgid "Calling C with Bindgen"
msgstr ""
-#: src/SUMMARY.md:201
+#: src/SUMMARY.md:203
msgid "Calling Rust from C"
msgstr ""
-#: src/SUMMARY.md:202 src/android/interoperability/cpp.md:1
+#: src/SUMMARY.md:204 src/android/interoperability/cpp.md:1
msgid "With C++"
msgstr ""
-#: src/SUMMARY.md:203
+#: src/SUMMARY.md:205
msgid "With Java"
msgstr ""
-#: src/SUMMARY.md:207
+#: src/SUMMARY.md:209
msgid "Bare Metal: Morning"
msgstr "Rå jern: Formiddag"
-#: src/SUMMARY.md:212
+#: src/SUMMARY.md:214
msgid "no_std"
msgstr "no_std"
-#: src/SUMMARY.md:213
+#: src/SUMMARY.md:215
msgid "A Minimal Example"
msgstr "Et minimalt eksempel"
-#: src/SUMMARY.md:214
+#: src/SUMMARY.md:216
msgid "alloc"
msgstr "alloc"
-#: src/SUMMARY.md:215 src/bare-metal/microcontrollers.md:1
+#: src/SUMMARY.md:217 src/bare-metal/microcontrollers.md:1
msgid "Microcontrollers"
msgstr ""
-#: src/SUMMARY.md:216 src/bare-metal/microcontrollers/mmio.md:1
+#: src/SUMMARY.md:218 src/bare-metal/microcontrollers/mmio.md:1
msgid "Raw MMIO"
msgstr "Rå MMIO"
-#: src/SUMMARY.md:217
+#: src/SUMMARY.md:219
msgid "PACs"
msgstr "PAC'er"
-#: src/SUMMARY.md:218
+#: src/SUMMARY.md:220
msgid "HAL Crates"
msgstr ""
-#: src/SUMMARY.md:219
+#: src/SUMMARY.md:221
msgid "Board Support Crates"
msgstr ""
-#: src/SUMMARY.md:220
+#: src/SUMMARY.md:222
msgid "The Type State Pattern"
msgstr ""
-#: src/SUMMARY.md:221
+#: src/SUMMARY.md:223
msgid "embedded-hal"
msgstr "embedded-hal"
-#: src/SUMMARY.md:222
+#: src/SUMMARY.md:224
msgid "probe-rs, cargo-embed"
msgstr "probe-rs, cargo-embed"
-#: src/SUMMARY.md:223 src/bare-metal/microcontrollers/debugging.md:1
+#: src/SUMMARY.md:225 src/bare-metal/microcontrollers/debugging.md:1
msgid "Debugging"
msgstr "Fejlfinding"
-#: src/SUMMARY.md:224 src/SUMMARY.md:242
+#: src/SUMMARY.md:226 src/SUMMARY.md:246
msgid "Other Projects"
msgstr "Andre projekter"
-#: src/SUMMARY.md:226 src/exercises/bare-metal/compass.md:1
+#: src/SUMMARY.md:228 src/exercises/bare-metal/compass.md:1
#: src/exercises/bare-metal/solutions-morning.md:3
msgid "Compass"
msgstr "Kompas"
-#: src/SUMMARY.md:228
+#: src/SUMMARY.md:230
msgid "Bare Metal: Afternoon"
msgstr "Rå jern: Eftermiddag"
-#: src/SUMMARY.md:230
+#: src/SUMMARY.md:232
msgid "Application Processors"
msgstr ""
-#: src/SUMMARY.md:231
-msgid "Inline Assembly"
-msgstr ""
-
-#: src/SUMMARY.md:232
-msgid "MMIO"
-msgstr "MMIO"
-
-#: src/SUMMARY.md:233
-msgid "Let's Write a UART Driver"
+#: src/SUMMARY.md:233 src/bare-metal/aps/entry-point.md:1
+msgid "Getting Ready to Rust"
msgstr ""
#: src/SUMMARY.md:234
-msgid "More Traits"
+msgid "Inline Assembly"
msgstr ""
#: src/SUMMARY.md:235
+msgid "MMIO"
+msgstr "MMIO"
+
+#: src/SUMMARY.md:236
+msgid "Let's Write a UART Driver"
+msgstr ""
+
+#: src/SUMMARY.md:237
+msgid "More Traits"
+msgstr ""
+
+#: src/SUMMARY.md:238
msgid "A Better UART Driver"
msgstr ""
-#: src/SUMMARY.md:236 src/bare-metal/aps/better-uart/bitflags.md:1
+#: src/SUMMARY.md:239 src/bare-metal/aps/better-uart/bitflags.md:1
msgid "Bitflags"
msgstr "Bitflag"
-#: src/SUMMARY.md:237
+#: src/SUMMARY.md:240
msgid "Multiple Registers"
msgstr ""
-#: src/SUMMARY.md:238 src/bare-metal/aps/better-uart/driver.md:1
+#: src/SUMMARY.md:241 src/bare-metal/aps/better-uart/driver.md:1
msgid "Driver"
msgstr "Driver"
-#: src/SUMMARY.md:239 src/SUMMARY.md:241
+#: src/SUMMARY.md:242 src/SUMMARY.md:244
msgid "Using It"
msgstr "Anvendelse"
-#: src/SUMMARY.md:243
+#: src/SUMMARY.md:245 src/bare-metal/aps/exceptions.md:1
+#, fuzzy
+msgid "Exceptions"
+msgstr "Funktioner"
+
+#: src/SUMMARY.md:247
msgid "Useful Crates"
msgstr ""
-#: src/SUMMARY.md:244
+#: src/SUMMARY.md:248
msgid "zerocopy"
msgstr "zerocopy"
-#: src/SUMMARY.md:245
+#: src/SUMMARY.md:249
msgid "aarch64-paging"
msgstr "aarch64-paging"
-#: src/SUMMARY.md:246
+#: src/SUMMARY.md:250
msgid "buddy_system_allocator"
msgstr "buddy_system_allocator"
-#: src/SUMMARY.md:247
+#: src/SUMMARY.md:251
msgid "tinyvec"
msgstr "tinyvec"
-#: src/SUMMARY.md:248
+#: src/SUMMARY.md:252
msgid "spin"
msgstr "spin"
-#: src/SUMMARY.md:250 src/bare-metal/android/vmbase.md:1
+#: src/SUMMARY.md:254 src/bare-metal/android/vmbase.md:1
msgid "vmbase"
msgstr "vmbase"
-#: src/SUMMARY.md:252
+#: src/SUMMARY.md:256
msgid "RTC Driver"
msgstr ""
-#: src/SUMMARY.md:255
+#: src/SUMMARY.md:259
msgid "Concurrency: Morning"
msgstr ""
-#: src/SUMMARY.md:260 src/concurrency/threads.md:1
+#: src/SUMMARY.md:264 src/concurrency/threads.md:1
msgid "Threads"
msgstr "Tråde"
-#: src/SUMMARY.md:261 src/concurrency/scoped-threads.md:1
+#: src/SUMMARY.md:265 src/concurrency/scoped-threads.md:1
msgid "Scoped Threads"
msgstr "Tråde med virkefelt"
-#: src/SUMMARY.md:262 src/concurrency/channels.md:1
+#: src/SUMMARY.md:266 src/concurrency/channels.md:1
msgid "Channels"
msgstr "Kanaler"
-#: src/SUMMARY.md:263 src/concurrency/channels/unbounded.md:1
+#: src/SUMMARY.md:267 src/concurrency/channels/unbounded.md:1
msgid "Unbounded Channels"
msgstr "Ubegrænsede kanaler"
-#: src/SUMMARY.md:264 src/concurrency/channels/bounded.md:1
+#: src/SUMMARY.md:268 src/concurrency/channels/bounded.md:1
msgid "Bounded Channels"
msgstr "Begrænsede kanaler"
-#: src/SUMMARY.md:265
+#: src/SUMMARY.md:269
msgid "Send and Sync"
msgstr "Send og Sync"
-#: src/SUMMARY.md:265
+#: src/SUMMARY.md:269
msgid "Send"
msgstr "Send"
-#: src/SUMMARY.md:265
+#: src/SUMMARY.md:269
msgid "Sync"
msgstr "Sync"
-#: src/SUMMARY.md:268 src/concurrency/send-sync/examples.md:1
+#: src/SUMMARY.md:272 src/concurrency/send-sync/examples.md:1
msgid "Examples"
msgstr "Eksempler"
-#: src/SUMMARY.md:269 src/concurrency/shared_state.md:1
+#: src/SUMMARY.md:273 src/concurrency/shared_state.md:1
msgid "Shared State"
msgstr "Delt tilstand"
-#: src/SUMMARY.md:270
+#: src/SUMMARY.md:274
msgid "Arc"
msgstr "Arc"
-#: src/SUMMARY.md:271
+#: src/SUMMARY.md:275
msgid "Mutex"
msgstr "Mutex"
-#: src/SUMMARY.md:274 src/SUMMARY.md:294
+#: src/SUMMARY.md:278 src/SUMMARY.md:299
#: src/exercises/concurrency/dining-philosophers.md:1
#: src/exercises/concurrency/solutions-morning.md:3
msgid "Dining Philosophers"
msgstr "Filosoffer omkring spisebordet"
-#: src/SUMMARY.md:275 src/exercises/concurrency/link-checker.md:1
+#: src/SUMMARY.md:279 src/exercises/concurrency/link-checker.md:1
msgid "Multi-threaded Link Checker"
msgstr "Flertrådet linktjekker"
-#: src/SUMMARY.md:277
+#: src/SUMMARY.md:281
#, fuzzy
msgid "Concurrency: Afternoon"
msgstr "Dag 1: Eftermiddag"
-#: src/SUMMARY.md:279
+#: src/SUMMARY.md:283
msgid "Async Basics"
msgstr "Grundlæggende Async"
-#: src/SUMMARY.md:280
+#: src/SUMMARY.md:284
msgid "async/await"
msgstr "async/await"
-#: src/SUMMARY.md:281 src/async/futures.md:1
+#: src/SUMMARY.md:285 src/async/futures.md:1
msgid "Futures"
msgstr "Fremtidige resultater (eng. Futures)"
-#: src/SUMMARY.md:282 src/async/runtimes.md:1
+#: src/SUMMARY.md:286 src/async/runtimes.md:1
#, fuzzy
msgid "Runtimes"
msgstr "Garantier under programudføring"
-#: src/SUMMARY.md:283 src/async/runtimes/tokio.md:1
+#: src/SUMMARY.md:287 src/async/runtimes/tokio.md:1
msgid "Tokio"
msgstr "Tokio"
-#: src/SUMMARY.md:284 src/exercises/concurrency/link-checker.md:106
-#: src/exercises/concurrency/chat-app.md:140 src/async/tasks.md:1
+#: src/SUMMARY.md:288 src/exercises/concurrency/link-checker.md:126
+#: src/async/tasks.md:1 src/exercises/concurrency/chat-app.md:140
msgid "Tasks"
msgstr "Opgaver (eng. Tasks)"
-#: src/SUMMARY.md:285 src/async/channels.md:1
+#: src/SUMMARY.md:289 src/async/channels.md:1
msgid "Async Channels"
msgstr "Asynkrone kanaler"
-#: src/SUMMARY.md:287 src/async/control-flow/join.md:1
+#: src/SUMMARY.md:291 src/async/control-flow/join.md:1
msgid "Join"
msgstr "Join"
-#: src/SUMMARY.md:288 src/async/control-flow/select.md:1
+#: src/SUMMARY.md:292 src/async/control-flow/select.md:1
msgid "Select"
msgstr "Select"
-#: src/SUMMARY.md:289
+#: src/SUMMARY.md:293
msgid "Pitfalls"
msgstr "Faldgruber"
-#: src/SUMMARY.md:290
+#: src/SUMMARY.md:294
msgid "Blocking the Executor"
msgstr ""
-#: src/SUMMARY.md:291 src/async/pitfalls/pin.md:1
+#: src/SUMMARY.md:295 src/async/pitfalls/pin.md:1
msgid "Pin"
msgstr "Pin"
-#: src/SUMMARY.md:292 src/async/pitfalls/async-traits.md:1
+#: src/SUMMARY.md:296 src/async/pitfalls/async-traits.md:1
msgid "Async Traits"
msgstr "Asynkrone egenskaber (eng. Traits)"
-#: src/SUMMARY.md:295 src/exercises/concurrency/chat-app.md:1
-#: src/exercises/concurrency/solutions-afternoon.md:113
+#: src/SUMMARY.md:297 src/async/pitfalls/cancellation.md:1
+#, fuzzy
+msgid "Cancellation"
+msgstr "Installation"
+
+#: src/SUMMARY.md:300 src/exercises/concurrency/chat-app.md:1
+#: src/exercises/concurrency/solutions-afternoon.md:119
msgid "Broadcast Chat Application"
msgstr "Broadcast chat-applikation"
-#: src/SUMMARY.md:298
+#: src/SUMMARY.md:303
msgid "Final Words"
msgstr "Afsluttende bemærkninger"
-#: src/SUMMARY.md:302 src/thanks.md:1
+#: src/SUMMARY.md:307 src/thanks.md:1
msgid "Thanks!"
msgstr "Tak!"
-#: src/SUMMARY.md:303
+#: src/SUMMARY.md:308
msgid "Other Resources"
msgstr "Andre resourcer"
-#: src/SUMMARY.md:304 src/credits.md:1
+#: src/SUMMARY.md:309 src/credits.md:1
msgid "Credits"
msgstr "Anerkendelser"
-#: src/SUMMARY.md:307 src/exercises/solutions.md:1
+#: src/SUMMARY.md:312 src/exercises/solutions.md:1
msgid "Solutions"
msgstr "Løsninger"
-#: src/SUMMARY.md:312
+#: src/SUMMARY.md:317
msgid "Day 1 Morning"
msgstr "Dag 1 Formiddag"
-#: src/SUMMARY.md:313
+#: src/SUMMARY.md:318
msgid "Day 1 Afternoon"
msgstr "Dag 1 Eftermiddag"
-#: src/SUMMARY.md:314
+#: src/SUMMARY.md:319
msgid "Day 2 Morning"
msgstr "Dag 2 Formiddag"
-#: src/SUMMARY.md:315
+#: src/SUMMARY.md:320
msgid "Day 2 Afternoon"
msgstr "Dag 2 Eftermiddag"
-#: src/SUMMARY.md:316
+#: src/SUMMARY.md:321
msgid "Day 3 Morning"
msgstr "Dag 3 Formiddag"
-#: src/SUMMARY.md:317
+#: src/SUMMARY.md:322
msgid "Day 3 Afternoon"
msgstr "Dag 3 Eftermiddag"
-#: src/SUMMARY.md:318
+#: src/SUMMARY.md:323
msgid "Bare Metal Rust Morning"
msgstr "Rå jern Rust formiddag"
-#: src/SUMMARY.md:319 src/exercises/bare-metal/solutions-afternoon.md:1
+#: src/SUMMARY.md:324 src/exercises/bare-metal/solutions-afternoon.md:1
msgid "Bare Metal Rust Afternoon"
msgstr "Rå jern Rust eftermiddag"
-#: src/SUMMARY.md:320
+#: src/SUMMARY.md:325
msgid "Concurrency Morning"
msgstr "Parallelprogrammering formiddag"
-#: src/SUMMARY.md:321
+#: src/SUMMARY.md:326
msgid "Concurrency Afternoon"
msgstr "Parallelprogrammering eftermiddag"
-#: src/welcome.md:3
-msgid ""
-"[![Build workflow](https://img.shields.io/github/actions/workflow/status/"
-"google/comprehensive-rust/build.yml?style=flat-square)](https://github.com/"
-"google/comprehensive-rust/actions/workflows/build.yml?query=branch%3Amain)"
-msgstr ""
-"[![Build workflow](https://img.shields.io/github/actions/workflow/status/"
-"google/comprehensive-rust/build.yml?style=flat-square)](https://github.com/"
-"google/comprehensive-rust/actions/workflows/build.yml?query=branch%3Amain)"
-
-#: src/welcome.md:3
-msgid "Build workflow"
-msgstr ""
-
-#: src/welcome.md:3
+#: src/index.md:3
msgid ""
"[![Build workflow](https://img.shields.io/github/actions/workflow/status/"
"google/comprehensive-rust/build.yml?style=flat-square)](https://github.com/"
"google/comprehensive-rust/actions/workflows/build.yml?query=branch%3Amain) [!"
"[GitHub contributors](https://img.shields.io/github/contributors/google/"
"comprehensive-rust?style=flat-square)](https://github.com/google/"
-"comprehensive-rust/graphs/contributors)"
-msgstr ""
-
-#: src/welcome.md:4
-msgid "GitHub contributors"
-msgstr ""
-
-#: src/welcome.md:4
-msgid ""
-"[![GitHub contributors](https://img.shields.io/github/contributors/google/"
-"comprehensive-rust?style=flat-square)](https://github.com/google/"
"comprehensive-rust/graphs/contributors) [![GitHub stars](https://img.shields."
"io/github/stars/google/comprehensive-rust?style=flat-square)](https://github."
"com/google/comprehensive-rust/stargazers)"
msgstr ""
-#: src/welcome.md:5
-msgid "GitHub stars"
-msgstr ""
-
-#: src/welcome.md:5
+#: src/index.md:7
+#, fuzzy
msgid ""
-"[![GitHub stars](https://img.shields.io/github/stars/google/comprehensive-"
-"rust?style=flat-square)](https://github.com/google/comprehensive-rust/"
-"stargazers)"
-msgstr ""
-
-#: src/welcome.md:7
-msgid ""
-"This is a three day Rust course developed by the Android team. The course "
-"covers the full spectrum of Rust, from basic syntax to advanced topics like "
-"generics and error handling. It also includes Android-specific content on "
-"the last day."
+"This is a free Rust course developed by the Android team at Google. The "
+"course covers the full spectrum of Rust, from basic syntax to advanced "
+"topics like generics and error handling."
msgstr ""
"Dette er et tre dages Rust-kursus udviklet af Android-teamet. Kurset dækker "
"hele spektret af Rust, fra grundlæggende syntaks til avancerede emner som "
"generiske og fejlhåndtering. Det inkluderer også Android-specifikt indhold "
"på den sidste dag."
-#: src/welcome.md:11
+#: src/index.md:11
msgid ""
"The goal of the course is to teach you Rust. We assume you don't know "
"anything about Rust and hope to:"
@@ -1079,52 +1061,55 @@ msgstr ""
"Målet med kurset er at lære dig Rust. Vi antager, at du ikke ved noget om "
"Rust og håber at:"
-#: src/welcome.md:14
+#: src/index.md:14
msgid "Give you a comprehensive understanding of the Rust syntax and language."
msgstr "Giver dig en omfattende forståelse af Rust-syntaksen og sproget."
-#: src/welcome.md:15
+#: src/index.md:15
msgid "Enable you to modify existing programs and write new programs in Rust."
msgstr ""
"Gøre det muligt for dig at ændre eksisterende programmer og skrive nye "
"programmer i Rust."
-#: src/welcome.md:16
+#: src/index.md:16
msgid "Show you common Rust idioms."
msgstr "Vis dig almindelige Rust idiomer."
-#: src/welcome.md:18
-msgid ""
-"The first three days show you the fundamentals of Rust. Following this, "
-"you're invited to dive into one or more specialized topics:"
+#: src/index.md:18
+msgid "We call the first three course days Rust Fundamentals."
msgstr ""
-#: src/welcome.md:21
+#: src/index.md:20
+msgid ""
+"Building on this, you're invited to dive into one or more specialized topics:"
+msgstr ""
+
+#: src/index.md:22
msgid ""
"[Android](android.md): a half-day course on using Rust for Android platform "
"development (AOSP). This includes interoperability with C, C++, and Java."
msgstr ""
-#: src/welcome.md:23
+#: src/index.md:24
msgid ""
-"[Bare-metal](bare-metal.md): a full day class on using Rust for bare-metal "
+"[Bare-metal](bare-metal.md): a whole-day class on using Rust for bare-metal "
"(embedded) development. Both microcontrollers and application processors are "
"covered."
msgstr ""
-#: src/welcome.md:26
+#: src/index.md:27
msgid ""
-"[Concurrency](concurrency.md): a full day class on concurrency in Rust. We "
+"[Concurrency](concurrency.md): a whole-day class on concurrency in Rust. We "
"cover both classical concurrency (preemptively scheduling using threads and "
"mutexes) and async/await concurrency (cooperative multitasking using "
"futures)."
msgstr ""
-#: src/welcome.md:32
+#: src/index.md:33
msgid "Non-Goals"
msgstr "Ting som ikke dækkes"
-#: src/welcome.md:34
+#: src/index.md:35
msgid ""
"Rust is a large language and we won't be able to cover all of it in a few "
"days. Some non-goals of this course are:"
@@ -1132,31 +1117,31 @@ msgstr ""
"Rust er et stort sprog og vi vil ikke være i stand til at dække det hele på "
"et par dage. Nogle af ting som vi ikke dækker er:"
-#: src/welcome.md:37
+#: src/index.md:38
msgid ""
-"Learn how to develop macros, please see [Chapter 19.5 in the Rust Book]"
+"Learning how to develop macros: please see [Chapter 19.5 in the Rust Book]"
"(https://doc.rust-lang.org/book/ch19-06-macros.html) and [Rust by Example]"
"(https://doc.rust-lang.org/rust-by-example/macros.html) instead."
msgstr ""
-#: src/welcome.md:41
+#: src/index.md:42
msgid "Assumptions"
msgstr "Antagelser"
-#: src/welcome.md:43
+#: src/index.md:44
msgid ""
"The course assumes that you already know how to program. Rust is a "
-"statically typed language and we will sometimes make comparisons with C and "
+"statically-typed language and we will sometimes make comparisons with C and "
"C++ to better explain or contrast the Rust approach."
msgstr ""
-#: src/welcome.md:47
+#: src/index.md:48
msgid ""
-"If you know how to program in a dynamically typed language such as Python or "
+"If you know how to program in a dynamically-typed language such as Python or "
"JavaScript, then you will be able to follow along just fine too."
msgstr ""
-#: src/welcome.md:52
+#: src/index.md:53
msgid ""
"This is an example of a _speaker note_. We will use these to add additional "
"information to the slides. This could be key points which the instructor "
@@ -1391,8 +1376,9 @@ msgstr ""
#: src/running-the-course/translations.md:6
msgid ""
"[Brazilian Portuguese](https://google.github.io/comprehensive-rust/pt-BR/) "
-"by [@rastringer](https://github.com/rastringer) and [@hugojacob](https://"
-"github.com/hugojacob)."
+"by [@rastringer](https://github.com/rastringer), [@hugojacob](https://github."
+"com/hugojacob), [@joaovicmendes](https://github.com/joaovicmendes) and "
+"[@henrif75](https://github.com/henrif75)."
msgstr ""
#: src/running-the-course/translations.md:7
@@ -1408,6 +1394,42 @@ msgid ""
msgstr ""
#: src/running-the-course/translations.md:11
+#, fuzzy
+msgid "Incomplete Translations"
+msgstr "Oversættelser"
+
+#: src/running-the-course/translations.md:13
+msgid ""
+"There is a large number of in-progress translations. We link to the most "
+"recently updated translations:"
+msgstr ""
+
+#: src/running-the-course/translations.md:16
+msgid ""
+"[Bengali](https://google.github.io/comprehensive-rust/bn/) by [@raselmandol]"
+"(https://github.com/raselmandol)."
+msgstr ""
+
+#: src/running-the-course/translations.md:17
+msgid ""
+"[French](https://google.github.io/comprehensive-rust/fr/) by [@KookaS]"
+"(https://github.com/KookaS) and [@vcaen](https://github.com/vcaen)."
+msgstr ""
+
+#: src/running-the-course/translations.md:18
+msgid ""
+"[German](https://google.github.io/comprehensive-rust/de/) by [@Throvn]"
+"(https://github.com/Throvn) and [@ronaldfw](https://github.com/ronaldfw)."
+msgstr ""
+
+#: src/running-the-course/translations.md:19
+msgid ""
+"[Japanese](https://google.github.io/comprehensive-rust/ja/) by [@CoinEZ-JPN]"
+"(https://github.com/CoinEZ) and [@momotaro1105](https://github.com/"
+"momotaro1105)."
+msgstr ""
+
+#: src/running-the-course/translations.md:21
msgid ""
"If you want to help with this effort, please see [our instructions](https://"
"github.com/google/comprehensive-rust/blob/main/TRANSLATIONS.md) for how to "
@@ -1429,55 +1451,43 @@ msgid "Installation"
msgstr "Installation"
#: src/cargo.md:10
-msgid "Rustup (Recommended)"
-msgstr "Rustup (anbefalet)"
+msgid "**Please follow the instructions on .**"
+msgstr ""
#: src/cargo.md:12
msgid ""
-"You can follow the instructions to install cargo and rust compiler, among "
-"other standard ecosystem tools with the [rustup](https://rust-analyzer."
-"github.io/) tool, which is maintained by the Rust Foundation."
-msgstr ""
-
-#: src/cargo.md:14
-msgid ""
-"Along with cargo and rustc, Rustup will install itself as a command line "
-"utility that you can use to install/switch toolchains, setup cross "
-"compilation, etc."
+"This will give you the Cargo build tool (`cargo`) and the Rust compiler "
+"(`rustc`). You will also get `rustup`, a command line utility that you can "
+"use to install/switch toolchains, setup cross compilation, etc."
msgstr ""
#: src/cargo.md:16
-msgid "Package Managers"
+msgid ""
+"On Debian/Ubuntu, you can also install Cargo, the Rust source and the [Rust "
+"formatter](https://github.com/rust-lang/rustfmt) via `apt`. However, this "
+"gets you an outdated rust version and may lead to unexpected behavior. The "
+"command would be:"
msgstr ""
#: src/cargo.md:18
-msgid "Debian"
-msgstr "Debian"
-
-#: src/cargo.md:20
+#, fuzzy
msgid ""
-"On Debian/Ubuntu, you can install Cargo, the Rust source and the [Rust "
-"formatter](https://github.com/rust-lang/rustfmt) with"
+"```shell\n"
+" sudo apt install cargo rust-src rustfmt\n"
+"```"
msgstr ""
+"```shell\n"
+"$ sudo apt install cargo rust-src rustfmt\n"
+"```"
#: src/cargo.md:22
msgid ""
-"```shell\n"
-"$ sudo apt install cargo rust-src rustfmt\n"
-"```"
-msgstr ""
-"```shell\n"
-"$ sudo apt install cargo rust-src rustfmt\n"
-"```"
-
-#: src/cargo.md:26
-msgid ""
-"This will allow \\[rust-analyzer\\]\\[1\\] to jump to the definitions. We "
-"suggest using [VS Code](https://code.visualstudio.com/) to edit the code "
-"(but any LSP compatible editor works)."
+"We suggest using [VS Code](https://code.visualstudio.com/) to edit the code "
+"(but any LSP compatible editor works with rust-analyzer[3](https://rust-"
+"analyzer.github.io/))."
msgstr ""
-#: src/cargo.md:29
+#: src/cargo.md:24
msgid ""
"Some folks also like to use the [JetBrains](https://www.jetbrains.com/"
"clion/) family of IDEs, which do their own analysis but have their own "
@@ -1504,9 +1514,9 @@ msgstr ""
#: src/cargo/rust-ecosystem.md:8
msgid ""
"`cargo`: the Rust dependency manager and build tool. Cargo knows how to "
-"download dependencies hosted on and it will pass them to "
-"`rustc` when building your project. Cargo also comes with a built-in test "
-"runner which is used to execute unit tests."
+"download dependencies, usually hosted on , and it will "
+"pass them to `rustc` when building your project. Cargo also comes with a "
+"built-in test runner which is used to execute unit tests."
msgstr ""
#: src/cargo/rust-ecosystem.md:13
@@ -1549,72 +1559,78 @@ msgstr ""
#: src/cargo/rust-ecosystem.md:32
msgid ""
+"Dependencies can also be resolved from alternative [registries](https://doc."
+"rust-lang.org/cargo/reference/registries.html), git, folders, and more."
+msgstr ""
+
+#: src/cargo/rust-ecosystem.md:34
+msgid ""
"Rust also has [editions](https://doc.rust-lang.org/edition-guide/): the "
"current edition is Rust 2021. Previous editions were Rust 2015 and Rust 2018."
msgstr ""
-#: src/cargo/rust-ecosystem.md:35
+#: src/cargo/rust-ecosystem.md:37
msgid ""
"The editions are allowed to make backwards incompatible changes to the "
"language."
msgstr ""
-#: src/cargo/rust-ecosystem.md:38
+#: src/cargo/rust-ecosystem.md:40
msgid ""
"To prevent breaking code, editions are opt-in: you select the edition for "
"your crate via the `Cargo.toml` file."
msgstr ""
-#: src/cargo/rust-ecosystem.md:41
+#: src/cargo/rust-ecosystem.md:43
msgid ""
"To avoid splitting the ecosystem, Rust compilers can mix code written for "
"different editions."
msgstr ""
-#: src/cargo/rust-ecosystem.md:44
+#: src/cargo/rust-ecosystem.md:46
msgid ""
"Mention that it is quite rare to ever use the compiler directly not through "
"`cargo` (most users never do)."
msgstr ""
-#: src/cargo/rust-ecosystem.md:46
+#: src/cargo/rust-ecosystem.md:48
msgid ""
"It might be worth alluding that Cargo itself is an extremely powerful and "
"comprehensive tool. It is capable of many advanced features including but "
"not limited to: "
msgstr ""
-#: src/cargo/rust-ecosystem.md:47
+#: src/cargo/rust-ecosystem.md:49
msgid "Project/package structure"
msgstr ""
-#: src/cargo/rust-ecosystem.md:48
+#: src/cargo/rust-ecosystem.md:50
msgid "[workspaces](https://doc.rust-lang.org/cargo/reference/workspaces.html)"
msgstr ""
-#: src/cargo/rust-ecosystem.md:49
+#: src/cargo/rust-ecosystem.md:51
msgid "Dev Dependencies and Runtime Dependency management/caching"
msgstr ""
-#: src/cargo/rust-ecosystem.md:50
+#: src/cargo/rust-ecosystem.md:52
msgid ""
"[build scripting](https://doc.rust-lang.org/cargo/reference/build-scripts."
"html)"
msgstr ""
-#: src/cargo/rust-ecosystem.md:51
+#: src/cargo/rust-ecosystem.md:53
msgid ""
"[global installation](https://doc.rust-lang.org/cargo/commands/cargo-install."
"html)"
msgstr ""
-#: src/cargo/rust-ecosystem.md:52
+#: src/cargo/rust-ecosystem.md:54
msgid ""
"It is also extensible with sub command plugins as well (such as [cargo "
"clippy](https://github.com/rust-lang/rust-clippy))."
msgstr ""
-#: src/cargo/rust-ecosystem.md:53
+#: src/cargo/rust-ecosystem.md:55
msgid ""
"Read more from the [official Cargo Book](https://doc.rust-lang.org/cargo/)"
msgstr ""
@@ -1713,20 +1729,26 @@ msgstr ""
#: src/cargo/running-locally.md:15
msgid ""
+"You can use any later version too since Rust maintains backwards "
+"compatibility."
+msgstr ""
+
+#: src/cargo/running-locally.md:17
+msgid ""
"With this in place, follow these steps to build a Rust binary from one of "
"the examples in this training:"
msgstr ""
-#: src/cargo/running-locally.md:18
+#: src/cargo/running-locally.md:20
msgid "Click the \"Copy to clipboard\" button on the example you want to copy."
msgstr ""
-#: src/cargo/running-locally.md:20
+#: src/cargo/running-locally.md:22
msgid ""
"Use `cargo new exercise` to create a new `exercise/` directory for your code:"
msgstr ""
-#: src/cargo/running-locally.md:22
+#: src/cargo/running-locally.md:24
msgid ""
"```shell\n"
"$ cargo new exercise\n"
@@ -1734,12 +1756,12 @@ msgid ""
"```"
msgstr ""
-#: src/cargo/running-locally.md:27
+#: src/cargo/running-locally.md:29
msgid ""
"Navigate into `exercise/` and use `cargo run` to build and run your binary:"
msgstr ""
-#: src/cargo/running-locally.md:29
+#: src/cargo/running-locally.md:31
msgid ""
"```shell\n"
"$ cd exercise\n"
@@ -1751,13 +1773,13 @@ msgid ""
"```"
msgstr ""
-#: src/cargo/running-locally.md:38
+#: src/cargo/running-locally.md:40
msgid ""
"Replace the boiler-plate code in `src/main.rs` with your own code. For "
"example, using the example on the previous page, make `src/main.rs` look like"
msgstr ""
-#: src/cargo/running-locally.md:41
+#: src/cargo/running-locally.md:43
msgid ""
"```rust\n"
"fn main() {\n"
@@ -1766,11 +1788,11 @@ msgid ""
"```"
msgstr ""
-#: src/cargo/running-locally.md:47
+#: src/cargo/running-locally.md:49
msgid "Use `cargo run` to build and run your updated binary:"
msgstr ""
-#: src/cargo/running-locally.md:49
+#: src/cargo/running-locally.md:51
msgid ""
"```shell\n"
"$ cargo run\n"
@@ -1781,7 +1803,7 @@ msgid ""
"```"
msgstr ""
-#: src/cargo/running-locally.md:57
+#: src/cargo/running-locally.md:59
msgid ""
"Use `cargo check` to quickly check your project for errors, use `cargo "
"build` to compile it without running it. You will find the output in `target/"
@@ -1789,14 +1811,14 @@ msgid ""
"optimized release build in `target/release/`."
msgstr ""
-#: src/cargo/running-locally.md:62
+#: src/cargo/running-locally.md:64
msgid ""
"You can add dependencies for your project by editing `Cargo.toml`. When you "
"run `cargo` commands, it will automatically download and compile missing "
"dependencies for you."
msgstr ""
-#: src/cargo/running-locally.md:70
+#: src/cargo/running-locally.md:72
msgid ""
"Try to encourage the class participants to install Cargo and use a local "
"editor. It will make their life easier since they will have a normal "
@@ -1808,8 +1830,9 @@ msgid "Welcome to Day 1"
msgstr "Velkommen til Dag 1"
#: src/welcome-day-1.md:3
+#, fuzzy
msgid ""
-"This is the first day of Comprehensive Rust. We will cover a lot of ground "
+"This is the first day of Rust Fundamentals. We will cover a lot of ground "
"today:"
msgstr ""
"Dette er den første dag af Comprehensive Rust. Vi kommer til at dække en "
@@ -1960,7 +1983,8 @@ msgid "High level of control."
msgstr ""
#: src/welcome-day-1/what-is-rust.md:25
-msgid "Can be scaled down to very constrained devices like mobile phones."
+msgid ""
+"Can be scaled down to very constrained devices such as microcontrollers."
msgstr ""
#: src/welcome-day-1/what-is-rust.md:26
@@ -2018,15 +2042,14 @@ msgstr ""
#: src/hello-world.md:22
msgid ""
"This slide tries to make the students comfortable with Rust code. They will "
-"see a ton of it over the next four days so we start small with something "
+"see a ton of it over the next three days so we start small with something "
"familiar."
msgstr ""
#: src/hello-world.md:27
msgid ""
"Rust is very much like other languages in the C/C++/Java tradition. It is "
-"imperative (not functional) and it doesn't try to reinvent things unless "
-"absolutely necessary."
+"imperative and it doesn't try to reinvent things unless absolutely necessary."
msgstr ""
#: src/hello-world.md:31
@@ -2047,6 +2070,14 @@ msgid ""
"html)."
msgstr ""
+#: src/hello-world.md:40
+msgid ""
+"Rust is multi-paradigm. For example, it has powerful [object-oriented "
+"programming features](https://doc.rust-lang.org/book/ch17-00-oop.html), and, "
+"while it is not a functional language, it includes a range of [functional "
+"concepts](https://doc.rust-lang.org/book/ch13-00-functional-features.html)."
+msgstr ""
+
#: src/hello-world/small-example.md:3
msgid "Here is a small example program in Rust:"
msgstr "Her er et lille eksempel på et program i Rust:"
@@ -2107,6 +2138,12 @@ msgid ""
"that the students become familiar with searching in the standard library."
msgstr ""
+#: src/hello-world/small-example.md:44
+msgid ""
+"In a shell `rustup doc std::fmt` will open a browser on the local std::fmt "
+"documentation"
+msgstr ""
+
#: src/why-rust.md:3
msgid "Some unique selling points of Rust:"
msgstr ""
@@ -2227,18 +2264,20 @@ msgid "Array access is bounds checked."
msgstr ""
#: src/why-rust/runtime.md:6
-msgid "Integer overflow is defined."
+msgid "Integer overflow is defined (panic or wrap-around)."
msgstr ""
#: src/why-rust/runtime.md:12
msgid ""
-"Integer overflow is defined via a compile-time flag. The options are either "
-"a panic (a controlled crash of the program) or wrap-around semantics. By "
-"default, you get panics in debug mode (`cargo build`) and wrap-around in "
-"release mode (`cargo build --release`)."
+"Integer overflow is defined via the [`overflow-checks`](https://doc.rust-"
+"lang.org/rustc/codegen-options/index.html#overflow-checks) compile-time "
+"flag. If enabled, the program will panic (a controlled crash of the "
+"program), otherwise you get wrap-around semantics. By default, you get "
+"panics in debug mode (`cargo build`) and wrap-around in release mode (`cargo "
+"build --release`)."
msgstr ""
-#: src/why-rust/runtime.md:17
+#: src/why-rust/runtime.md:18
msgid ""
"Bounds checking cannot be disabled with a compiler flag. It can also not be "
"disabled directly with the `unsafe` keyword. However, `unsafe` allows you to "
@@ -2247,7 +2286,7 @@ msgid ""
msgstr ""
#: src/why-rust/modern.md:3
-msgid "Rust is built with all the experience gained in the last 40 years."
+msgid "Rust is built with all the experience gained in the last decades."
msgstr ""
#: src/why-rust/modern.md:5
@@ -2400,7 +2439,7 @@ msgid "`i8`, `i16`, `i32`, `i64`, `i128`, `isize`"
msgstr ""
#: src/basic-syntax/scalar-types.md:5
-msgid "`-10`, `0`, `1_000`, `123i64`"
+msgid "`-10`, `0`, `1_000`, `123_i64`"
msgstr ""
#: src/basic-syntax/scalar-types.md:6
@@ -2412,7 +2451,7 @@ msgid "`u8`, `u16`, `u32`, `u64`, `u128`, `usize`"
msgstr ""
#: src/basic-syntax/scalar-types.md:6
-msgid "`0`, `123`, `10u16`"
+msgid "`0`, `123`, `10_u16`"
msgstr ""
#: src/basic-syntax/scalar-types.md:7
@@ -2424,7 +2463,7 @@ msgid "`f32`, `f64`"
msgstr ""
#: src/basic-syntax/scalar-types.md:7
-msgid "`3.14`, `-10.0e20`, `2f32`"
+msgid "`3.14`, `-10.0e20`, `2_f32`"
msgstr ""
#: src/basic-syntax/scalar-types.md:8
@@ -2476,11 +2515,11 @@ msgid "`isize` and `usize` are the width of a pointer,"
msgstr ""
#: src/basic-syntax/scalar-types.md:16
-msgid "`char` is 32 bit wide,"
+msgid "`char` is 32 bits wide,"
msgstr ""
#: src/basic-syntax/scalar-types.md:17
-msgid "`bool` is 8 bit wide."
+msgid "`bool` is 8 bits wide."
msgstr ""
#: src/basic-syntax/scalar-types.md:21
@@ -2518,6 +2557,13 @@ msgid ""
"```"
msgstr ""
+#: src/basic-syntax/scalar-types.md:43
+msgid ""
+"All underscores in numbers can be left out, they are for legibility only. So "
+"`1_000` can be written as `1000` (or `10_00`), and `123_i64` can be written "
+"as `123i64`."
+msgstr ""
+
#: src/basic-syntax/compound-types.md:5
msgid "Arrays"
msgstr ""
@@ -2578,10 +2624,10 @@ msgstr ""
#: src/basic-syntax/compound-types.md:34
msgid ""
-"Arrays have elements of the same type, `T`, and length, `N`, which is a "
-"compile-time constant. Note that the length of the array is _part of its "
-"type_, which means that `[u8; 3]` and `[u8; 4]` are considered two different "
-"types."
+"A value of the array type `[T; N]` holds `N` (a compile-time constant) "
+"elements of the same type `T`. Note that the length of the array is _part of "
+"its type_, which means that `[u8; 3]` and `[u8; 4]` are considered two "
+"different types."
msgstr ""
#: src/basic-syntax/compound-types.md:38
@@ -2720,66 +2766,69 @@ msgstr ""
msgid ""
"```rust,editable\n"
"fn main() {\n"
-" let a: [i32; 6] = [10, 20, 30, 40, 50, 60];\n"
+" let mut a: [i32; 6] = [10, 20, 30, 40, 50, 60];\n"
" println!(\"a: {a:?}\");\n"
"\n"
" let s: &[i32] = &a[2..4];\n"
+"\n"
" println!(\"s: {s:?}\");\n"
"}\n"
"```"
msgstr ""
-#: src/basic-syntax/slices.md:15
+#: src/basic-syntax/slices.md:16
msgid "Slices borrow data from the sliced type."
msgstr ""
-#: src/basic-syntax/slices.md:16
-msgid "Question: What happens if you modify `a[3]`?"
+#: src/basic-syntax/slices.md:17
+msgid "Question: What happens if you modify `a[3]` right before printing `s`?"
msgstr ""
-#: src/basic-syntax/slices.md:20
+#: src/basic-syntax/slices.md:21
msgid ""
"We create a slice by borrowing `a` and specifying the starting and ending "
"indexes in brackets."
msgstr ""
-#: src/basic-syntax/slices.md:22
+#: src/basic-syntax/slices.md:23
msgid ""
"If the slice starts at index 0, Rust’s range syntax allows us to drop the "
"starting index, meaning that `&a[0..a.len()]` and `&a[..a.len()]` are "
"identical."
msgstr ""
-#: src/basic-syntax/slices.md:24
+#: src/basic-syntax/slices.md:25
msgid ""
"The same is true for the last index, so `&a[2..a.len()]` and `&a[2..]` are "
"identical."
msgstr ""
-#: src/basic-syntax/slices.md:26
+#: src/basic-syntax/slices.md:27
msgid ""
"To easily create a slice of the full array, we can therefore use `&a[..]`."
msgstr ""
-#: src/basic-syntax/slices.md:28
+#: src/basic-syntax/slices.md:29
msgid ""
"`s` is a reference to a slice of `i32`s. Notice that the type of `s` "
"(`&[i32]`) no longer mentions the array length. This allows us to perform "
"computation on slices of different sizes."
msgstr ""
-#: src/basic-syntax/slices.md:30
+#: src/basic-syntax/slices.md:31
msgid ""
"Slices always borrow from another object. In this example, `a` has to remain "
"'alive' (in scope) for at least as long as our slice. "
msgstr ""
-#: src/basic-syntax/slices.md:32
+#: src/basic-syntax/slices.md:33
msgid ""
"The question about modifying `a[3]` can spark an interesting discussion, but "
-"the answer is that for memory safety reasons you cannot do it through `a` "
-"after you created a slice, but you can read the data from both `a` and `s` "
-"safely. More details will be explained in the borrow checker section."
+"the answer is that for memory safety reasons you cannot do it through `a` at "
+"this point in the execution, but you can read the data from both `a` and `s` "
+"safely. It works before you created the slice, and again after the "
+"`println`, when the slice is no longer used. More details will be explained "
+"in the borrow checker section."
msgstr ""
#: src/basic-syntax/string-slices.md:1
@@ -2975,6 +3024,13 @@ msgid ""
"be addressed here."
msgstr ""
+#: src/basic-syntax/rustdoc.md:33
+msgid ""
+"Rustdoc comments can contain code snippets that we can run and test using "
+"`cargo test`. We will discuss these tests in the [Testing section](../"
+"testing/doc-tests.html)."
+msgstr ""
+
#: src/basic-syntax/methods.md:3
msgid ""
"Methods are functions associated with a type. The `self` argument of a "
@@ -3015,7 +3071,7 @@ msgid ""
msgstr ""
#: src/basic-syntax/methods.md:34
-msgid "Add a `Rectangle::new` constructor and call this from `main`:"
+msgid "Add a static method called `Rectangle::new` and call this from `main`:"
msgstr ""
#: src/basic-syntax/methods.md:36
@@ -3029,8 +3085,16 @@ msgstr ""
#: src/basic-syntax/methods.md:42
msgid ""
-"Add a `Rectangle::new_square(width: u32)` constructor to illustrate that "
-"constructors can take arbitrary parameters."
+"While _technically_, Rust does not have custom constructors, static methods "
+"are commonly used to initialize structs (but don't have to). The actual "
+"constructor, `Rectangle { width, height }`, could be called directly. See "
+"the [Rustnomicon](https://doc.rust-lang.org/nomicon/constructors.html)."
+msgstr ""
+
+#: src/basic-syntax/methods.md:45
+msgid ""
+"Add a `Rectangle::square(width: u32)` constructor to illustrate that such "
+"static methods can take arbitrary parameters."
msgstr ""
#: src/basic-syntax/functions-interlude.md:1
@@ -3127,14 +3191,12 @@ msgid ""
"their state if you navigate away from the page."
msgstr ""
-#: src/exercises/day-1/morning.md:22 src/exercises/day-1/afternoon.md:11
-#: src/exercises/day-2/morning.md:11 src/exercises/day-2/afternoon.md:7
+#: src/exercises/day-1/morning.md:22 src/exercises/day-2/morning.md:11
#: src/exercises/day-3/morning.md:7 src/exercises/bare-metal/morning.md:7
-#: src/exercises/bare-metal/afternoon.md:7
#: src/exercises/concurrency/morning.md:12
-#: src/exercises/concurrency/afternoon.md:13
msgid ""
-"After looking at the exercises, you can look at the \\[solutions\\] provided."
+"After looking at the exercises, you can look at the [solutions](solutions-"
+"morning.md) provided."
msgstr ""
#: src/exercises/day-1/implicit-conversions.md:3
@@ -3247,7 +3309,7 @@ msgid ""
"fn main() {\n"
" let array = [10, 20, 30];\n"
" print!(\"Iterating over array:\");\n"
-" for n in array {\n"
+" for n in &array {\n"
" print!(\" {n}\");\n"
" }\n"
" println!();\n"
@@ -3346,6 +3408,29 @@ msgid ""
"[Solution](solutions-morning.md#arrays-and-for-loops) section."
msgstr ""
+#: src/exercises/day-1/for-loops.md:95
+msgid ""
+"The use of the reference `&array` within `for n in &array` is a subtle "
+"preview of issues of ownership that will come later in the afternoon."
+msgstr ""
+
+#: src/exercises/day-1/for-loops.md:98
+msgid "Without the `&`..."
+msgstr ""
+
+#: src/exercises/day-1/for-loops.md:99
+msgid ""
+"The loop would have been one that consumes the array. This is a change "
+"[introduced in the 2021 Edition](https://doc.rust-lang.org/edition-guide/"
+"rust-2021/IntoIterator-for-arrays.html)."
+msgstr ""
+
+#: src/exercises/day-1/for-loops.md:102
+msgid ""
+"An implicit array copy would have occured. Since `i32` is a copy type, then "
+"`[i32; 3]` is also a copy type."
+msgstr ""
+
#: src/basic-syntax/variables.md:3
msgid ""
"Rust provides type safety via static typing. Variable bindings are immutable "
@@ -3370,12 +3455,6 @@ msgid ""
"types less and less as the course progresses."
msgstr ""
-#: src/basic-syntax/variables.md:18
-msgid ""
-"Note that since `println!` is a macro, `x` is not moved, even using the "
-"function like syntax of `println!(\"x: {}\", x)`"
-msgstr ""
-
#: src/basic-syntax/type-inference.md:3
msgid "Rust will look at how the variable is _used_ to determine the type:"
msgstr ""
@@ -3442,8 +3521,10 @@ msgstr ""
#: src/basic-syntax/type-inference.md:46
msgid ""
"[`collect`](https://doc.rust-lang.org/stable/std/iter/trait.Iterator."
-"html#method.collect) relies on `FromIterator`, which [`HashSet`](https://doc."
-"rust-lang.org/std/iter/trait.FromIterator.html) implements."
+"html#method.collect) relies on [`FromIterator`](https://doc.rust-lang.org/"
+"std/iter/trait.FromIterator.html), which [`HashSet`](https://doc.rust-lang."
+"org/std/collections/struct.HashSet.html#impl-FromIterator%3CT%3E-for-"
+"HashSet%3CT,+S%3E) implements."
msgstr ""
#: src/basic-syntax/static-and-const.md:1
@@ -3451,18 +3532,23 @@ msgid "Static and Constant Variables"
msgstr ""
#: src/basic-syntax/static-and-const.md:3
-msgid "Global state is managed with static and constant variables."
+msgid ""
+"Static and constant variables are two different ways to create globally-"
+"scoped values that cannot be moved or reallocated during the execution of "
+"the program. "
msgstr ""
-#: src/basic-syntax/static-and-const.md:5
+#: src/basic-syntax/static-and-const.md:6
msgid "`const`"
msgstr ""
-#: src/basic-syntax/static-and-const.md:7
-msgid "You can declare compile-time constants:"
+#: src/basic-syntax/static-and-const.md:8
+msgid ""
+"Constant variables are evaluated at compile time and their values are "
+"inlined wherever they are used:"
msgstr ""
-#: src/basic-syntax/static-and-const.md:9
+#: src/basic-syntax/static-and-const.md:11
msgid ""
"```rust,editable\n"
"const DIGEST_SIZE: usize = 3;\n"
@@ -3484,21 +3570,29 @@ msgid ""
"```"
msgstr ""
-#: src/basic-syntax/static-and-const.md:27
+#: src/basic-syntax/static-and-const.md:29
msgid ""
"According to the [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-"
"vs-static.html) these are inlined upon use."
msgstr ""
-#: src/basic-syntax/static-and-const.md:29
-msgid "`static`"
-msgstr ""
-
#: src/basic-syntax/static-and-const.md:31
-msgid "You can also declare static variables:"
+msgid ""
+"Only functions marked `const` can be called at compile time to generate "
+"`const` values. `const` functions can however be called at runtime."
msgstr ""
#: src/basic-syntax/static-and-const.md:33
+msgid "`static`"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:35
+msgid ""
+"Static variables will live during the whole execution of the program, and "
+"therefore will not move:"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:37
msgid ""
"```rust,editable\n"
"static BANNER: &str = \"Welcome to RustOS 3.14\";\n"
@@ -3509,36 +3603,113 @@ msgid ""
"```"
msgstr ""
-#: src/basic-syntax/static-and-const.md:41
+#: src/basic-syntax/static-and-const.md:45
msgid ""
"As noted in the [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-"
"vs-static.html), these are not inlined upon use and have an actual "
-"associated memory location. This is useful for unsafe and embedded code, "
-"and the variable lives through the entirety of the program execution."
-msgstr ""
-
-#: src/basic-syntax/static-and-const.md:44
-msgid ""
-"We will look at mutating static data in the [chapter on Unsafe Rust](../"
-"unsafe.md)."
-msgstr ""
-
-#: src/basic-syntax/static-and-const.md:48
-msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`."
+"associated memory location. This is useful for unsafe and embedded code, "
+"and the variable lives through the entirety of the program execution. When a "
+"globally-scoped value does not have a reason to need object identity, "
+"`const` is generally preferred."
msgstr ""
#: src/basic-syntax/static-and-const.md:49
msgid ""
+"Because `static` variables are accessible from any thread, they must be "
+"`Sync`. Interior mutability is possible through a [`Mutex`](https://doc.rust-"
+"lang.org/std/sync/struct.Mutex.html), atomic or similar. It is also possible "
+"to have mutable statics, but they require manual synchronisation so any "
+"access to them requires `unsafe` code. We will look at [mutable statics](../"
+"unsafe/mutable-static-variables.md) in the chapter on Unsafe Rust."
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:57
+msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`."
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:58
+msgid ""
"`static`, on the other hand, is much more similar to a `const` or mutable "
"global variable in C++."
msgstr ""
-#: src/basic-syntax/static-and-const.md:50
+#: src/basic-syntax/static-and-const.md:59
+msgid ""
+"`static` provides object identity: an address in memory and state as "
+"required by types with interior mutability such as `Mutex`."
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:60
msgid ""
"It isn't super common that one would need a runtime evaluated constant, but "
"it is helpful and safer than using a static."
msgstr ""
+#: src/basic-syntax/static-and-const.md:61
+msgid "`thread_local` data can be created with the macro `std::thread_local`."
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:63
+msgid "Properties table:"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:65
+msgid "Property"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:65
+msgid "Static"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:65
+msgid "Constant"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:67
+msgid "Has an address in memory"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:67
+#: src/basic-syntax/static-and-const.md:68
+#: src/basic-syntax/static-and-const.md:70
+#: src/basic-syntax/static-and-const.md:71
+msgid "Yes"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:67
+msgid "No (inlined)"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:68
+msgid "Lives for the entire duration of the program"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:68
+#: src/basic-syntax/static-and-const.md:69
+#: src/basic-syntax/static-and-const.md:71
+msgid "No"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:69
+msgid "Can be mutable"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:69
+msgid "Yes (unsafe)"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:70
+msgid "Evaluated at compile time"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:70
+msgid "Yes (initialised at compile time)"
+msgstr ""
+
+#: src/basic-syntax/static-and-const.md:71
+msgid "Inlined wherever it is used"
+msgstr ""
+
#: src/basic-syntax/scopes-shadowing.md:3
msgid ""
"You can shadow variables, both those from outer scopes and variables from "
@@ -3673,10 +3844,15 @@ msgstr ""
msgid "No guarantee of memory locality."
msgstr ""
+#: src/memory-management/stack.md:1
+#, fuzzy
+msgid "Stack and Heap Example"
+msgstr "Stak og heap"
+
#: src/memory-management/stack.md:3
msgid ""
-"Creating a `String` puts fixed-sized data on the stack and dynamically sized "
-"data on the heap:"
+"Creating a `String` puts fixed-sized metadata on the stack and dynamically "
+"sized data, the actual string, on the heap:"
msgstr ""
#: src/memory-management/stack.md:6
@@ -3750,7 +3926,7 @@ msgid ""
"to\n"
" // undefined behavior.\n"
" unsafe {\n"
-" let (capacity, ptr, len): (usize, usize, usize) = std::mem::"
+" let (ptr, capacity, len): (usize, usize, usize) = std::mem::"
"transmute(s1);\n"
" println!(\"ptr = {ptr:#x}, len = {len}, capacity = {capacity}\");\n"
" }\n"
@@ -3780,7 +3956,7 @@ msgstr ""
msgid ""
"```c\n"
"void foo(size_t n) {\n"
-" int* int_array = (int*)malloc(n * sizeof(int));\n"
+" int* int_array = malloc(n * sizeof(int));\n"
" //\n"
" // ... lots of code\n"
" //\n"
@@ -3792,7 +3968,9 @@ msgstr ""
#: src/memory-management/manual.md:21
msgid ""
"Memory is leaked if the function returns early between `malloc` and `free`: "
-"the pointer is lost and we cannot deallocate the memory."
+"the pointer is lost and we cannot deallocate the memory. Worse, freeing the "
+"pointer twice, or accessing a freed pointer can lead to exploitable security "
+"vulnerabilities."
msgstr ""
#: src/memory-management/scope-based.md:3
@@ -3920,7 +4098,7 @@ msgid ""
msgstr ""
#: src/memory-management/rust.md:10
-msgid "It achieves this by modeling _ownership_ explicitly."
+msgid "Rust achieves this by modeling _ownership_ explicitly."
msgstr ""
#: src/memory-management/rust.md:14
@@ -4012,22 +4190,26 @@ msgid "Destructor delays."
msgstr ""
#: src/memory-management/comparison.md:30
-msgid "Complex, opt-in by programmer."
+msgid "Complex, opt-in by programmer (on C++)."
msgstr ""
#: src/memory-management/comparison.md:31
-msgid "Potential for use-after-free."
+msgid "Circular references can lead to memory leaks"
msgstr ""
#: src/memory-management/comparison.md:32
-msgid "Compiler-enforced and scope-based like Rust:"
+msgid "Potential runtime overhead"
msgstr ""
#: src/memory-management/comparison.md:33
-msgid "Some upfront complexity."
+msgid "Compiler-enforced and scope-based like Rust:"
msgstr ""
#: src/memory-management/comparison.md:34
+msgid "Some upfront complexity."
+msgstr ""
+
+#: src/memory-management/comparison.md:35
msgid "Can reject valid programs."
msgstr ""
@@ -4066,7 +4248,7 @@ msgid "We say that the variable _owns_ the value."
msgstr ""
#: src/ownership/move-semantics.md:3
-msgid "An assignment will transfer ownership between variables:"
+msgid "An assignment will transfer _ownership_ between variables:"
msgstr ""
#: src/ownership/move-semantics.md:5
@@ -4086,28 +4268,36 @@ msgid "The assignment of `s1` to `s2` transfers ownership."
msgstr ""
#: src/ownership/move-semantics.md:15
-msgid "The data was _moved_ from `s1` and `s1` is no longer accessible."
+msgid "When `s1` goes out of scope, nothing happens: it does not own anything."
msgstr ""
#: src/ownership/move-semantics.md:16
-msgid "When `s1` goes out of scope, nothing happens: it has no ownership."
-msgstr ""
-
-#: src/ownership/move-semantics.md:17
msgid "When `s2` goes out of scope, the string data is freed."
msgstr ""
-#: src/ownership/move-semantics.md:18
+#: src/ownership/move-semantics.md:17
msgid "There is always _exactly_ one variable binding which owns a value."
msgstr ""
-#: src/ownership/move-semantics.md:22
+#: src/ownership/move-semantics.md:21
msgid ""
"Mention that this is the opposite of the defaults in C++, which copies by "
"value unless you use `std::move` (and the move constructor is defined!)."
msgstr ""
-#: src/ownership/move-semantics.md:24
+#: src/ownership/move-semantics.md:23
+msgid ""
+"It is only the ownership that moves. Whether any machine code is generated "
+"to manipulate the data itself is a matter of optimization, and such copies "
+"are aggressively optimized away."
+msgstr ""
+
+#: src/ownership/move-semantics.md:25
+msgid ""
+"Simple values (such as integers) can be marked `Copy` (see later slides)."
+msgstr ""
+
+#: src/ownership/move-semantics.md:27
msgid "In Rust, clones are explicit (by using `clone`)."
msgstr ""
@@ -4199,6 +4389,11 @@ msgstr ""
"`- - - - - - - - - - - - - -'\n"
"```"
+#: src/ownership/double-free-modern-cpp.md:1
+#, fuzzy
+msgid "Extra Work in Modern C++"
+msgstr "Dobbeltfrigivelser i moderne C++"
+
#: src/ownership/double-free-modern-cpp.md:3
msgid "Modern C++ solves this differently:"
msgstr ""
@@ -4481,9 +4676,10 @@ msgstr ""
msgid ""
"Demonstrate that the return from `add` is cheap because the compiler can "
"eliminate the copy operation. Change the above code to print stack addresses "
-"and run it on the [Playground](https://play.rust-lang.org/). In the "
-"\"DEBUG\" optimization level, the addresses should change, while they stay "
-"the same when changing to the \"RELEASE\" setting:"
+"and run it on the [Playground](https://play.rust-lang.org/) or look at the "
+"assembly in [Godbolt](https://rust.godbolt.org/). In the \"DEBUG\" "
+"optimization level, the addresses should change, while they stay the same "
+"when changing to the \"RELEASE\" setting:"
msgstr ""
#: src/ownership/borrowing.md:30
@@ -4498,7 +4694,7 @@ msgid ""
" p\n"
"}\n"
"\n"
-"fn main() {\n"
+"pub fn main() {\n"
" let p1 = Point(3, 4);\n"
" let p2 = Point(10, 20);\n"
" let p3 = add(&p1, &p2);\n"
@@ -4516,8 +4712,8 @@ msgstr ""
msgid ""
"In C++, copy elision has to be defined in the language specification because "
"constructors can have side effects. In Rust, this is not an issue at all. If "
-"RVO did not happen, Rust will always performs a simple and efficient "
-"`memcpy` copy."
+"RVO did not happen, Rust will always perform a simple and efficient `memcpy` "
+"copy."
msgstr ""
#: src/ownership/shared-unique-borrows.md:3
@@ -4602,8 +4798,8 @@ msgstr ""
#: src/ownership/lifetimes.md:13
msgid ""
"Lifetimes for function arguments and return values must be fully specified, "
-"but Rust allows these to be elidied in most cases with [a few simple rules]"
-"(https://doc.rust-lang.org/nomicon/lifetime-elision.html)."
+"but Rust allows lifetimes to be elided in most cases with [a few simple "
+"rules](https://doc.rust-lang.org/nomicon/lifetime-elision.html)."
msgstr ""
#: src/ownership/lifetimes-function-calls.md:3
@@ -4646,7 +4842,7 @@ msgstr ""
#: src/ownership/lifetimes-function-calls.md:31
msgid ""
-"Move the declaration of `p2` and `p3` into a a new scope (`{ ... }`), "
+"Move the declaration of `p2` and `p3` into a new scope (`{ ... }`), "
"resulting in the following code:"
msgstr ""
@@ -4700,7 +4896,7 @@ msgstr ""
#: src/ownership/lifetimes-function-calls.md:57
msgid ""
-"Which one is it? The compiler needs to to know, so at the call site the "
+"Which one is it? The compiler needs to know, so at the call site the "
"returned reference is not used for longer than a variable from where the "
"reference came from."
msgstr ""
@@ -4780,6 +4976,14 @@ msgstr ""
msgid "Iterators and ownership (hard)."
msgstr ""
+#: src/exercises/day-1/afternoon.md:11 src/exercises/day-2/afternoon.md:7
+#: src/exercises/bare-metal/afternoon.md:7
+#: src/exercises/concurrency/afternoon.md:13
+msgid ""
+"After looking at the exercises, you can look at the [solutions](solutions-"
+"afternoon.md) provided."
+msgstr ""
+
#: src/exercises/day-1/book-library.md:3
msgid ""
"We will learn much more about structs and the `Vec` type tomorrow. For "
@@ -4803,8 +5007,8 @@ msgstr ""
#: src/exercises/day-1/book-library.md:18
msgid ""
-"Use this to create a library application. Copy the code below to and update the types to make it compile:"
+"Use this to model a library's book collection. Copy the code below to "
+" and update the types to make it compile:"
msgstr ""
#: src/exercises/day-1/book-library.md:21
@@ -4869,13 +5073,15 @@ msgid ""
"fn main() {\n"
" let library = Library::new();\n"
"\n"
-" //println!(\"The library is empty: {}\", library.is_empty());\n"
+" //println!(\"The library is empty: library.is_empty() -> {}\", library."
+"is_empty());\n"
" //\n"
" //library.add_book(Book::new(\"Lord of the Rings\", 1954));\n"
" //library.add_book(Book::new(\"Alice's Adventures in Wonderland\", "
"1865));\n"
" //\n"
-" //println!(\"The library is no longer empty: {}\", library.is_empty());\n"
+" //println!(\"The library is no longer empty: library.is_empty() -> {}\", "
+"library.is_empty());\n"
" //\n"
" //\n"
" //library.print_books();\n"
@@ -5062,9 +5268,9 @@ msgstr ""
msgid ""
"Experiment with the code above and then consult the documentation for [`impl "
"IntoIterator for &Vec`](https://doc.rust-lang.org/std/vec/struct.Vec."
-"html#impl-IntoIterator-for-%26%27a%20Vec%3CT%2C%20A%3E) and [`impl "
-"IntoIterator for Vec`](https://doc.rust-lang.org/std/vec/struct.Vec."
-"html#impl-IntoIterator-for-Vec%3CT%2C%20A%3E) to check your answers."
+"html#impl-IntoIterator-for-%26'a+Vec%3CT,+A%3E) and [`impl IntoIterator for "
+"Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html#impl-IntoIterator-"
+"for-Vec%3CT,+A%3E) to check your answers."
msgstr ""
#: src/welcome-day-2.md:1
@@ -5130,9 +5336,9 @@ msgid ""
"```"
msgstr ""
-#: src/structs.md:31 src/enums.md:33 src/enums/sizes.md:29 src/methods.md:30
+#: src/structs.md:31 src/enums.md:34 src/enums/sizes.md:28 src/methods.md:30
#: src/methods/example.md:46 src/pattern-matching.md:25
-#: src/pattern-matching/match-guards.md:22 src/control-flow/blocks.md:42
+#: src/pattern-matching/match-guards.md:22 src/control-flow/blocks.md:43
msgid "Key Points:"
msgstr ""
@@ -5251,7 +5457,13 @@ msgid ""
msgstr ""
#: src/structs/tuple-structs.md:42
-msgid "Operator overloading is discussed on Day 3 (generics). "
+msgid "Operator overloading is discussed on Day 3 (generics)."
+msgstr ""
+
+#: src/structs/tuple-structs.md:43
+msgid ""
+"The example is a subtle reference to the [Mars Climate Orbiter](https://en."
+"wikipedia.org/wiki/Mars_Climate_Orbiter) failure."
msgstr ""
#: src/structs/field-shorthand.md:3
@@ -5328,11 +5540,11 @@ msgid ""
"}\n"
"fn create_default() {\n"
" let tmp = Person {\n"
-" ..Default::default()\n"
+" ..Person::default()\n"
" };\n"
" let tmp = Person {\n"
" name: \"Sam\".to_string(),\n"
-" ..Default::default()\n"
+" ..Person::default()\n"
" };\n"
"}\n"
"```"
@@ -5363,6 +5575,7 @@ msgstr ""
msgid ""
"```rust,editable\n"
"fn generate_random_number() -> i32 {\n"
+" // Implementation based on https://xkcd.com/221/\n"
" 4 // Chosen by fair dice roll. Guaranteed to be random.\n"
"}\n"
"\n"
@@ -5387,31 +5600,31 @@ msgid ""
"```"
msgstr ""
-#: src/enums.md:35
+#: src/enums.md:36
msgid "Enumerations allow you to collect a set of values under one type"
msgstr ""
-#: src/enums.md:36
+#: src/enums.md:37
msgid ""
"This page offers an enum type `CoinFlip` with two variants `Heads` and "
-"`Tail`. You might note the namespace when using variants."
-msgstr ""
-
-#: src/enums.md:37
-msgid "This might be a good time to compare Structs and Enums:"
+"`Tails`. You might note the namespace when using variants."
msgstr ""
#: src/enums.md:38
+msgid "This might be a good time to compare Structs and Enums:"
+msgstr ""
+
+#: src/enums.md:39
msgid ""
"In both, you can have a simple version without fields (unit struct) or one "
"with different types of fields (variant payloads). "
msgstr ""
-#: src/enums.md:39
+#: src/enums.md:40
msgid "In both, associated functions are defined within an `impl` block."
msgstr ""
-#: src/enums.md:40
+#: src/enums.md:41
msgid ""
"You could even implement the different variants of an enum with separate "
"structs but then they wouldn’t be the same type as they would if they were "
@@ -5517,13 +5730,12 @@ msgstr ""
#: src/enums/sizes.md:5
msgid ""
"```rust,editable\n"
+"use std::any::type_name;\n"
"use std::mem::{align_of, size_of};\n"
"\n"
-"macro_rules! dbg_size {\n"
-" ($t:ty) => {\n"
-" println!(\"{}: size {} bytes, align: {} bytes\",\n"
-" stringify!($t), size_of::<$t>(), align_of::<$t>());\n"
-" };\n"
+"fn dbg_size() {\n"
+" println!(\"{}: size {} bytes, align: {} bytes\",\n"
+" type_name::(), size_of::(), align_of::());\n"
"}\n"
"\n"
"enum Foo {\n"
@@ -5532,29 +5744,29 @@ msgid ""
"}\n"
"\n"
"fn main() {\n"
-" dbg_size!(Foo);\n"
+" dbg_size::();\n"
"}\n"
"```"
msgstr ""
-#: src/enums/sizes.md:25
+#: src/enums/sizes.md:24
msgid ""
"See the [Rust Reference](https://doc.rust-lang.org/reference/type-layout."
"html)."
msgstr ""
-#: src/enums/sizes.md:31
+#: src/enums/sizes.md:30
msgid ""
"Internally Rust is using a field (discriminant) to keep track of the enum "
"variant."
msgstr ""
-#: src/enums/sizes.md:33
+#: src/enums/sizes.md:32
msgid ""
"You can control the discriminant if needed (e.g., for compatibility with C):"
msgstr ""
-#: src/enums/sizes.md:35
+#: src/enums/sizes.md:34
msgid ""
"```rust,editable\n"
"#[repr(u32)]\n"
@@ -5572,57 +5784,57 @@ msgid ""
"```"
msgstr ""
-#: src/enums/sizes.md:50
+#: src/enums/sizes.md:49
msgid ""
"Without `repr`, the discriminant type takes 2 bytes, because 10001 fits 2 "
"bytes."
msgstr ""
-#: src/enums/sizes.md:54
+#: src/enums/sizes.md:53
msgid "Try out other types such as"
msgstr ""
-#: src/enums/sizes.md:56
+#: src/enums/sizes.md:55
msgid "`dbg_size!(bool)`: size 1 bytes, align: 1 bytes,"
msgstr ""
-#: src/enums/sizes.md:57
+#: src/enums/sizes.md:56
msgid ""
"`dbg_size!(Option)`: size 1 bytes, align: 1 bytes (niche optimization, "
"see below),"
msgstr ""
-#: src/enums/sizes.md:58
+#: src/enums/sizes.md:57
msgid "`dbg_size!(&i32)`: size 8 bytes, align: 8 bytes (on a 64-bit machine),"
msgstr ""
-#: src/enums/sizes.md:59
+#: src/enums/sizes.md:58
msgid ""
"`dbg_size!(Option<&i32>)`: size 8 bytes, align: 8 bytes (null pointer "
"optimization, see below)."
msgstr ""
-#: src/enums/sizes.md:61
+#: src/enums/sizes.md:60
msgid ""
-"Niche optimization: Rust will merge use unused bit patterns for the enum "
+"Niche optimization: Rust will merge unused bit patterns for the enum "
"discriminant."
msgstr ""
-#: src/enums/sizes.md:64
+#: src/enums/sizes.md:63
msgid ""
"Null pointer optimization: For [some types](https://doc.rust-lang.org/std/"
"option/#representation), Rust guarantees that `size_of::()` equals "
"`size_of::