diff --git a/po/fr.po b/po/fr.po index e21170880e0e..33beabab014f 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,8 +1,8 @@ msgid "" msgstr "" "Project-Id-Version: Comprehensive Rust 🦀\n" -"POT-Creation-Date: 2024-04-05T16:37:18-04:00\n" -"PO-Revision-Date: 2024-05-24 15:14-0400\n" +"POT-Creation-Date: 2026-02-16T20:31:28+01:00\n" +"PO-Revision-Date: 2026-03-25 17:41+0100\n" "Last-Translator: Olivier Charrez \n" "Language-Team: French \n" "Language: fr\n" @@ -14,7 +14,7 @@ msgstr "" #: src/SUMMARY.md src/index.md msgid "Welcome to Comprehensive Rust 🦀" -msgstr "Bienvenue à Comprehensive Rust (le guide complet de Rust) 🦀" +msgstr "Bienvenue à Comprehensive Rust 🦀" #: src/SUMMARY.md src/running-the-course.md msgid "Running the Course" @@ -52,664 +52,713 @@ msgstr "Exécuter Cargo localement" msgid "Day 1: Morning" msgstr "Jour 1 : Matin" -#: src/SUMMARY.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-1.md +#: src/welcome-day-2.md src/welcome-day-3.md src/welcome-day-4.md +#: src/concurrency/welcome-async.md msgid "Welcome" msgstr "Bienvenue" -#: src/SUMMARY.md src/hello-world.md src/types-and-values/hello-world.md -#, fuzzy +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-1.md +#: src/hello-world.md src/types-and-values.md src/types-and-values/hello-world.md msgid "Hello, World" -msgstr "Bonjour le monde!" +msgstr "Hello, World" -#: src/SUMMARY.md src/hello-world/what-is-rust.md +#: src/SUMMARY.md src/hello-world.md src/hello-world/what-is-rust.md msgid "What is Rust?" msgstr "Qu'est-ce que Rust ?" -#: src/SUMMARY.md src/hello-world/benefits.md +#: src/SUMMARY.md src/hello-world.md src/hello-world/benefits.md msgid "Benefits of Rust" -msgstr "" +msgstr "Avantages de Rust" -#: src/SUMMARY.md src/hello-world/playground.md +#: src/SUMMARY.md src/hello-world.md src/hello-world/playground.md msgid "Playground" -msgstr "" +msgstr "Bac à sable" -#: src/SUMMARY.md src/types-and-values.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-1.md +#: src/types-and-values.md msgid "Types and Values" -msgstr "" +msgstr "Types et valeurs" -#: src/SUMMARY.md src/types-and-values/variables.md +#: src/SUMMARY.md src/types-and-values.md src/types-and-values/variables.md msgid "Variables" msgstr "Variables" -#: src/SUMMARY.md src/types-and-values/values.md +#: src/SUMMARY.md src/types-and-values.md src/types-and-values/values.md msgid "Values" -msgstr "" +msgstr "Valeurs" -#: src/SUMMARY.md src/types-and-values/arithmetic.md +#: src/SUMMARY.md src/types-and-values.md src/types-and-values/arithmetic.md msgid "Arithmetic" -msgstr "" +msgstr "Arithmétique" -#: src/SUMMARY.md src/types-and-values/inference.md +#: src/SUMMARY.md src/types-and-values.md src/types-and-values/inference.md msgid "Type Inference" msgstr "Inférence de type" -#: src/SUMMARY.md src/types-and-values/exercise.md +#: src/SUMMARY.md src/types-and-values.md src/types-and-values/exercise.md msgid "Exercise: Fibonacci" -msgstr "" - -#: src/SUMMARY.md src/types-and-values/solution.md -#: src/control-flow-basics/solution.md src/tuples-and-arrays/solution.md -#: src/references/solution.md src/user-defined-types/solution.md -#: src/pattern-matching/solution.md src/methods-and-traits/solution.md -#: src/generics/solution.md src/std-types/solution.md -#: src/std-traits/solution.md src/memory-management/solution.md -#: src/smart-pointers/solution.md src/borrowing/solution.md -#: src/lifetimes/solution.md src/iterators/solution.md src/modules/solution.md -#: src/testing/solution.md src/error-handling/solution.md +msgstr "Exercice : Fibonacci" + +#: src/SUMMARY.md src/types-and-values/solution.md src/control-flow-basics/solution.md +#: src/tuples-and-arrays/solution.md src/references/solution.md +#: src/user-defined-types/solution.md src/pattern-matching/solution.md +#: src/methods-and-traits/solution.md src/generics/solution.md src/closures/solution.md +#: src/std-types/solution.md src/std-traits/solution.md src/memory-management/solution.md +#: src/smart-pointers/solution.md src/lifetimes/solution.md src/iterators/solution.md +#: src/modules/solution.md src/testing/solution.md src/error-handling/solution.md #: src/unsafe-rust/solution.md -#, fuzzy msgid "Solution" -msgstr "Solutions" +msgstr "Solution" -#: src/SUMMARY.md src/control-flow-basics.md -#, fuzzy +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-1.md +#: src/control-flow-basics.md msgid "Control Flow Basics" msgstr "Flux de contrôle" +#: src/SUMMARY.md src/control-flow-basics.md src/control-flow-basics/blocks-and-scopes.md +msgid "Blocks and Scopes" +msgstr "Blocs et Portées" + #: src/SUMMARY.md -#, fuzzy msgid "`if` Expressions" -msgstr "expressions \"si\"" +msgstr "expressions \"if\"" -#: src/SUMMARY.md src/control-flow-basics/loops.md -#, fuzzy +#: src/SUMMARY.md src/control-flow-basics/match.md +msgid "`match` Expressions" +msgstr "expressions \"correspondantes\"" + +#: src/SUMMARY.md src/control-flow-basics.md src/control-flow-basics/loops.md msgid "Loops" -msgstr "Boucles `for`" +msgstr "Boucles" #: src/SUMMARY.md src/control-flow-basics/loops/for.md -#, fuzzy msgid "`for`" msgstr "Boucles `for`" #: src/SUMMARY.md src/control-flow-basics/loops/loop.md msgid "`loop`" -msgstr "" +msgstr "Boucles `loop`" #: src/SUMMARY.md src/control-flow-basics/break-continue.md -#, fuzzy msgid "`break` and `continue`" -msgstr "`pause` et `continue`" +msgstr "`break` et `continue`" #: src/SUMMARY.md src/control-flow-basics/break-continue/labels.md msgid "Labels" -msgstr "" - -#: src/SUMMARY.md src/control-flow-basics/blocks-and-scopes.md -msgid "Blocks and Scopes" -msgstr "" +msgstr "Labels" -#: src/SUMMARY.md src/control-flow-basics/blocks-and-scopes/scopes.md -msgid "Scopes and Shadowing" -msgstr "Portée et masquage" - -#: src/SUMMARY.md src/control-flow-basics/functions.md +#: src/SUMMARY.md src/control-flow-basics.md src/control-flow-basics/functions.md msgid "Functions" msgstr "Fonctions" -#: src/SUMMARY.md src/control-flow-basics/macros.md +#: src/SUMMARY.md src/control-flow-basics.md src/control-flow-basics/macros.md msgid "Macros" -msgstr "" +msgstr "Macros" -#: src/SUMMARY.md src/control-flow-basics/exercise.md +#: src/SUMMARY.md src/control-flow-basics.md src/control-flow-basics/exercise.md msgid "Exercise: Collatz Sequence" -msgstr "" +msgstr "Exercice : Séquence de Collatz" #: src/SUMMARY.md msgid "Day 1: Afternoon" msgstr "Jour 1 : Après-midi" -#: src/SUMMARY.md src/tuples-and-arrays.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-1-afternoon.md +#: src/tuples-and-arrays.md msgid "Tuples and Arrays" -msgstr "" +msgstr "Tuples et Arrays" -#: src/SUMMARY.md src/tuples-and-arrays/arrays.md +#: src/SUMMARY.md src/tuples-and-arrays.md src/tuples-and-arrays/arrays.md msgid "Arrays" -msgstr "" +msgstr "Arrays" -#: src/SUMMARY.md src/tuples-and-arrays/tuples.md +#: src/SUMMARY.md src/tuples-and-arrays.md src/tuples-and-arrays/tuples.md msgid "Tuples" -msgstr "" +msgstr "Tuples" -#: src/SUMMARY.md src/tuples-and-arrays/iteration.md -#, fuzzy +#: src/SUMMARY.md src/tuples-and-arrays.md src/tuples-and-arrays/iteration.md msgid "Array Iteration" -msgstr "Iterator" +msgstr "Itération sur Array" -#: src/SUMMARY.md src/tuples-and-arrays/destructuring.md -#, fuzzy +#: src/SUMMARY.md src/tuples-and-arrays.md src/tuples-and-arrays/destructuring.md msgid "Patterns and Destructuring" msgstr "Déstructuration des énumérations" -#: src/SUMMARY.md src/tuples-and-arrays/exercise.md +#: src/SUMMARY.md src/tuples-and-arrays.md src/tuples-and-arrays/exercise.md msgid "Exercise: Nested Arrays" -msgstr "" +msgstr "Exercice : Tableaux" -#: src/SUMMARY.md src/references.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-1-afternoon.md +#: src/references.md msgid "References" msgstr "Références" -#: src/SUMMARY.md src/references/shared.md -#, fuzzy +#: src/SUMMARY.md src/references.md src/references/shared.md msgid "Shared References" -msgstr "Références" +msgstr "Références partagées" -#: src/SUMMARY.md src/references/exclusive.md -#, fuzzy +#: src/SUMMARY.md src/references.md src/references/exclusive.md msgid "Exclusive References" -msgstr "Références invalides" +msgstr "Références exclusives" -#: src/SUMMARY.md -#, fuzzy -msgid "Slices: `&[T]`" +#: src/SUMMARY.md src/references.md src/references/slices.md +msgid "Slices" msgstr "Tranches" -#: src/SUMMARY.md src/references/strings.md -#, fuzzy +#: src/SUMMARY.md src/references.md src/references/strings.md msgid "Strings" -msgstr "Cordes" +msgstr "Strings" -#: src/SUMMARY.md src/references/exercise.md +#: src/SUMMARY.md src/references.md src/references/dangling.md +msgid "Reference Validity" +msgstr "Validité des références" + +#: src/SUMMARY.md src/references.md src/references/exercise.md msgid "Exercise: Geometry" -msgstr "" +msgstr "Exercice : Géométrie" -#: src/SUMMARY.md src/user-defined-types.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-1-afternoon.md +#: src/user-defined-types.md msgid "User-Defined Types" -msgstr "" +msgstr "Types définis par l'utilisateur" -#: src/SUMMARY.md src/user-defined-types/named-structs.md -#, fuzzy +#: src/SUMMARY.md src/user-defined-types.md src/user-defined-types/named-structs.md msgid "Named Structs" -msgstr "Structures" +msgstr "Structures nommées" -#: src/SUMMARY.md src/user-defined-types/tuple-structs.md +#: src/SUMMARY.md src/user-defined-types.md src/user-defined-types/tuple-structs.md msgid "Tuple Structs" msgstr "Structures tuple" -#: src/SUMMARY.md src/user-defined-types/enums.md -#: src/pattern-matching/destructuring.md +#: src/SUMMARY.md src/user-defined-types.md src/user-defined-types/enums.md +#: src/pattern-matching/destructuring-enums.md msgid "Enums" msgstr "Énumérations" -#: src/SUMMARY.md -#, fuzzy -msgid "Static" -msgstr "`statique`" +#: src/SUMMARY.md src/user-defined-types.md src/user-defined-types/aliases.md +msgid "Type Aliases" +msgstr "Alias de types" -#: src/SUMMARY.md -#, fuzzy +#: src/SUMMARY.md src/user-defined-types.md msgid "Const" msgstr "`const`" -#: src/SUMMARY.md src/user-defined-types/aliases.md -msgid "Type Aliases" -msgstr "" +#: src/SUMMARY.md src/user-defined-types.md +msgid "Static" +msgstr "`static`" -#: src/SUMMARY.md src/user-defined-types/exercise.md +#: src/SUMMARY.md src/user-defined-types.md src/user-defined-types/exercise.md msgid "Exercise: Elevator Events" -msgstr "" +msgstr "Exercice : Évènements d'asensceur" #: src/SUMMARY.md msgid "Day 2: Morning" msgstr "Jour 2 : Matin" -#: src/SUMMARY.md src/pattern-matching.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-2.md +#: src/pattern-matching.md msgid "Pattern Matching" -msgstr "Filtrage par motif" +msgstr "Correspondance par motif" -#: src/SUMMARY.md src/pattern-matching/match.md +#: src/SUMMARY.md src/pattern-matching.md src/pattern-matching/infallible.md +msgid "Irrefutable Patterns" +msgstr "Motifs irréfutables" + +#: src/SUMMARY.md src/pattern-matching.md src/pattern-matching/match.md msgid "Matching Values" -msgstr "" +msgstr "Valeurs correspondantes" -#: src/SUMMARY.md src/pattern-matching/destructuring.md -#, fuzzy -msgid "Destructuring" +#: src/SUMMARY.md src/pattern-matching.md +msgid "Destructuring Structs" +msgstr "Déstructuration des structs" + +#: src/SUMMARY.md src/pattern-matching.md +msgid "Destructuring Enums" msgstr "Déstructuration des énumérations" -#: src/SUMMARY.md src/pattern-matching/let-control-flow.md -#, fuzzy +#: src/SUMMARY.md src/pattern-matching.md src/pattern-matching/let-control-flow.md msgid "Let Control Flow" -msgstr "Flux de contrôle" +msgstr "Expressions `let`" + +#: src/SUMMARY.md src/pattern-matching/let-control-flow/if-let.md +msgid "`if let` Expressions" +msgstr "Expressions `if let`" + +#: src/SUMMARY.md src/pattern-matching/let-control-flow/while-let.md +msgid "`while let` Statements" +msgstr "Expressions `while let`" -#: src/SUMMARY.md src/pattern-matching/exercise.md +#: src/SUMMARY.md +msgid "`let else`" +msgstr "Expressions `while let`" + +#: src/SUMMARY.md src/pattern-matching.md src/pattern-matching/exercise.md msgid "Exercise: Expression Evaluation" -msgstr "" +msgstr "Exercice : Évaluation d'expression" -#: src/SUMMARY.md src/methods-and-traits.md -#, fuzzy +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-2.md +#: src/methods-and-traits.md msgid "Methods and Traits" -msgstr "Read et Write" +msgstr "Méthodes et Traits" -#: src/SUMMARY.md src/methods-and-traits/methods.md +#: src/SUMMARY.md src/methods-and-traits.md src/methods-and-traits/methods.md msgid "Methods" msgstr "Méthodes" -#: src/SUMMARY.md src/methods-and-traits/traits.md +#: src/SUMMARY.md src/methods-and-traits.md src/methods-and-traits/traits.md msgid "Traits" msgstr "Traits" #: src/SUMMARY.md src/methods-and-traits/traits/implementing.md -#, fuzzy msgid "Implementing Traits" -msgstr "Implémentation de traits non sécurisés" +msgstr "Implémentation de traits" #: src/SUMMARY.md src/methods-and-traits/traits/supertraits.md -#, fuzzy msgid "Supertraits" -msgstr "Plus de traits" +msgstr "Supertraits" #: src/SUMMARY.md src/methods-and-traits/traits/associated-types.md -#, fuzzy msgid "Associated Types" -msgstr "Types scalaires" +msgstr "Types associés" -#: src/SUMMARY.md src/methods-and-traits/deriving.md -#, fuzzy +#: src/SUMMARY.md src/methods-and-traits.md src/methods-and-traits/deriving.md msgid "Deriving" msgstr "Traits dérivés" -#: src/SUMMARY.md -#, fuzzy +#: src/SUMMARY.md src/methods-and-traits.md msgid "Exercise: Generic Logger" -msgstr "Exercices" +msgstr "Exercice : Logger générique" -#: src/SUMMARY.md src/generics.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-2.md +#: src/generics.md msgid "Generics" msgstr "Génériques" -#: src/SUMMARY.md src/generics/generic-functions.md -#, fuzzy +#: src/SUMMARY.md src/generics.md src/generics/generic-functions.md msgid "Generic Functions" msgstr "Fonctions externes" -#: src/SUMMARY.md src/generics/generic-data.md +#: src/SUMMARY.md src/generics.md src/generics/trait-bounds.md +msgid "Trait Bounds" +msgstr "Contraintes de Traits" + +#: src/SUMMARY.md src/generics.md src/generics/generic-data.md msgid "Generic Data Types" msgstr "Types de données génériques" -#: src/SUMMARY.md src/generics/generic-traits.md -#, fuzzy +#: src/SUMMARY.md src/generics.md src/generics/generic-traits.md msgid "Generic Traits" -msgstr "Génériques" - -#: src/SUMMARY.md src/generics/trait-bounds.md -msgid "Trait Bounds" -msgstr "Traits lié" +msgstr "Traits Génériques" #: src/SUMMARY.md src/generics/impl-trait.md -#, fuzzy msgid "`impl Trait`" -msgstr "`Trait d'implémentation`" +msgstr "`impl Trait`" + +#: src/SUMMARY.md src/generics/dyn-trait.md +msgid "`dyn Trait`" +msgstr "`dyn Trait`" #: src/SUMMARY.md src/generics/exercise.md msgid "Exercise: Generic `min`" -msgstr "" +msgstr "Exercice : `min` générique" #: src/SUMMARY.md msgid "Day 2: Afternoon" msgstr "Jour 2 : Après-midi" -#: src/SUMMARY.md src/std-types.md -#, fuzzy +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-2-afternoon.md +#: src/closures.md +msgid "Closures" +msgstr "Fermetures" + +#: src/SUMMARY.md src/closures.md src/closures/syntax.md +msgid "Closure Syntax" +msgstr "Syntaxe de Fermetures" + +#: src/SUMMARY.md src/closures.md src/closures/capturing.md +msgid "Capturing" +msgstr "Capture" + +#: src/SUMMARY.md src/closures.md +msgid "Closure Traits" +msgstr "Traits de Fermeture" + +#: src/SUMMARY.md src/closures.md src/closures/exercise.md +msgid "Exercise: Log Filter" +msgstr "Exercices : Filtre de Log" + +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-2-afternoon.md +#: src/std-types.md msgid "Standard Library Types" -msgstr "Bibliothèque standard" +msgstr "Types de la Bibliothèque standard" -#: src/SUMMARY.md src/std-types/std.md +#: src/SUMMARY.md src/std-types.md src/std-types/std.md msgid "Standard Library" msgstr "Bibliothèque standard" -#: src/SUMMARY.md src/std-types/docs.md -#, fuzzy +#: src/SUMMARY.md src/std-types.md src/std-types/docs.md msgid "Documentation" -msgstr "Tests de documentation" +msgstr "Documentation" #: src/SUMMARY.md -#, fuzzy msgid "`Option`" -msgstr "`Durée`" +msgstr "`Option`" -#: src/SUMMARY.md -#, fuzzy +#: src/SUMMARY.md src/error-handling/result.md msgid "`Result`" -msgstr "`Option`, `Résultat`" +msgstr "`Result`" #: src/SUMMARY.md src/android/aidl/types/primitives.md #: src/android/interoperability/cpp/type-mapping.md -#, fuzzy msgid "`String`" -msgstr "String" +msgstr "`String`" #: src/SUMMARY.md src/std-types/vec.md -#, fuzzy msgid "`Vec`" msgstr "`Vec`" #: src/SUMMARY.md src/std-types/hashmap.md src/bare-metal/no_std.md -#, fuzzy msgid "`HashMap`" msgstr "`HashMap`" -#: src/SUMMARY.md src/std-types/exercise.md -#, fuzzy +#: src/SUMMARY.md src/std-types.md src/std-types/exercise.md msgid "Exercise: Counter" -msgstr "Exercices" +msgstr "Exercice : Conteur" -#: src/SUMMARY.md src/std-traits.md -#, fuzzy +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-2-afternoon.md +#: src/std-traits.md msgid "Standard Library Traits" -msgstr "Bibliothèque standard" +msgstr "Traits de la Bibliothèque standard" -#: src/SUMMARY.md src/std-traits/comparisons.md src/async.md -#, fuzzy +#: src/SUMMARY.md src/std-traits.md src/std-traits/comparisons.md +#: src/concurrency/welcome-async.md msgid "Comparisons" -msgstr "Comparaison" +msgstr "Comparaisons" -#: src/SUMMARY.md src/std-traits/operators.md -#, fuzzy +#: src/SUMMARY.md src/std-traits.md src/std-traits/operators.md msgid "Operators" -msgstr "Itérateurs" +msgstr "Opérateurs" #: src/SUMMARY.md src/std-traits/from-and-into.md -#, fuzzy msgid "`From` and `Into`" -msgstr "`De` et `Dans`" +msgstr "`From` et `Into`" -#: src/SUMMARY.md src/std-traits/casting.md -#, fuzzy +#: src/SUMMARY.md src/std-traits.md src/std-traits/casting.md msgid "Casting" -msgstr "Tester" +msgstr "Casting" #: src/SUMMARY.md src/std-traits/read-and-write.md -#, fuzzy msgid "`Read` and `Write`" -msgstr "`Lire` et `Ecrire`" +msgstr "`Read` et `Write`" #: src/SUMMARY.md msgid "`Default`, struct update syntax" -msgstr "" - -#: src/SUMMARY.md src/std-traits/closures.md -#, fuzzy -msgid "Closures" -msgstr "Fermetures" +msgstr "`Default`, syntaxe de mise à jour de struct" -#: src/SUMMARY.md src/std-traits/exercise.md -#, fuzzy +#: src/SUMMARY.md src/std-traits.md src/std-traits/exercise.md msgid "Exercise: ROT13" -msgstr "Exercices" +msgstr "Exercice : ROT13" #: src/SUMMARY.md msgid "Day 3: Morning" msgstr "Jour 3 : Matin" -#: src/SUMMARY.md src/memory-management.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-3.md +#: src/memory-management.md msgid "Memory Management" msgstr "Gestion de la mémoire" -#: src/SUMMARY.md src/memory-management/review.md +#: src/SUMMARY.md src/memory-management.md src/memory-management/review.md msgid "Review of Program Memory" -msgstr "" +msgstr "Rappels sur la mémoire d'un programme" -#: src/SUMMARY.md src/memory-management/approaches.md -#, fuzzy +#: src/SUMMARY.md src/memory-management.md src/memory-management/approaches.md msgid "Approaches to Memory Management" -msgstr "Gestion automatique de la mémoire" +msgstr "Approches de la gestion mémoire" -#: src/SUMMARY.md src/memory-management/ownership.md +#: src/SUMMARY.md src/memory-management.md src/memory-management/ownership.md msgid "Ownership" msgstr "Possession" -#: src/SUMMARY.md src/memory-management/move.md +#: src/SUMMARY.md src/memory-management.md src/memory-management/move.md msgid "Move Semantics" msgstr "Sémantique de déplacement" #: src/SUMMARY.md msgid "`Clone`" -msgstr "" +msgstr "`Clone`" -#: src/SUMMARY.md src/memory-management/copy-types.md -#, fuzzy +#: src/SUMMARY.md src/memory-management.md src/memory-management/copy-types.md msgid "Copy Types" -msgstr "Types composés" +msgstr "Types copiables" #: src/SUMMARY.md -#, fuzzy msgid "`Drop`" -msgstr "Drop" +msgstr "`Drop`" -#: src/SUMMARY.md src/memory-management/exercise.md +#: src/SUMMARY.md src/memory-management.md src/memory-management/exercise.md msgid "Exercise: Builder Type" -msgstr "" +msgstr "Exercice : type Constructeur" -#: src/SUMMARY.md src/smart-pointers.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-3.md +#: src/smart-pointers.md msgid "Smart Pointers" -msgstr "" +msgstr "Pointeurs Intelligents" -#: src/SUMMARY.md src/smart-pointers/box.md -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy +#: src/SUMMARY.md src/smart-pointers/box.md src/android/interoperability/cpp/type-mapping.md msgid "`Box`" -msgstr "`Boîte`" +msgstr "`Box`" #: src/SUMMARY.md src/smart-pointers/rc.md -#, fuzzy msgid "`Rc`" msgstr "`Rc`" -#: src/SUMMARY.md src/smart-pointers/trait-objects.md -msgid "Trait Objects" +#: src/SUMMARY.md src/smart-pointers.md src/smart-pointers/trait-objects.md +msgid "Owned Trait Objects" msgstr "Objets traits" -#: src/SUMMARY.md src/smart-pointers/exercise.md +#: src/SUMMARY.md src/smart-pointers.md src/smart-pointers/exercise.md msgid "Exercise: Binary Tree" -msgstr "" +msgstr "Exercice : Arbre binaire" #: src/SUMMARY.md msgid "Day 3: Afternoon" msgstr "Jour 3 : Après-midi" -#: src/SUMMARY.md src/borrowing.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-3-afternoon.md +#: src/borrowing.md msgid "Borrowing" msgstr "Emprunts" -#: src/SUMMARY.md src/borrowing/shared.md -#, fuzzy +#: src/SUMMARY.md src/borrowing.md src/borrowing/shared.md msgid "Borrowing a Value" -msgstr "Emprunts" +msgstr "Emprunter une valeur" -#: src/SUMMARY.md src/borrowing/borrowck.md -#, fuzzy +#: src/SUMMARY.md src/borrowing.md src/borrowing/borrowck.md msgid "Borrow Checking" -msgstr "Emprunts" +msgstr "Validation d'emprunt" -#: src/SUMMARY.md src/borrowing/interior-mutability.md -#, fuzzy +#: src/SUMMARY.md src/borrowing.md src/borrowing/examples.md +msgid "Borrow Errors" +msgstr "Erreur d'emprunt" + +#: src/SUMMARY.md src/borrowing.md src/borrowing/interior-mutability.md msgid "Interior Mutability" -msgstr "Interopérabilité" +msgstr "Mutabilité interne" -#: src/SUMMARY.md src/borrowing/exercise.md -#, fuzzy -msgid "Exercise: Health Statistics" -msgstr "Statistiques de santé" +#: src/SUMMARY.md src/borrowing/interior-mutability/cell.md +msgid "`Cell`" +msgstr "`Cell`" -#: src/SUMMARY.md src/lifetimes.md +#: src/SUMMARY.md src/borrowing/interior-mutability/refcell.md +msgid "`RefCell`" +msgstr "`RefCell`" + +#: src/SUMMARY.md src/borrowing.md src/borrowing/exercise.md +msgid "Exercise: Wizard's Inventory" +msgstr "Exercice : Inventaire du magicien" + +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-3-afternoon.md +#: src/lifetimes.md src/unsafe-deep-dive/safety-preconditions/common-preconditions.md msgid "Lifetimes" msgstr "Durées de vie" -#: src/SUMMARY.md src/lifetimes/lifetime-annotations.md -#, fuzzy -msgid "Lifetime Annotations" -msgstr "Durées de vie dans les appels de fonction" +#: src/SUMMARY.md src/lifetimes.md +msgid "Borrowing and Functions" +msgstr "Emprunts et Fonctions" -#: src/SUMMARY.md -#, fuzzy +#: src/SUMMARY.md src/lifetimes.md src/lifetimes/returning-borrows.md +msgid "Returning Borrows" +msgstr "Retourner une valeur empruntée" + +#: src/SUMMARY.md src/lifetimes.md src/lifetimes/multiple-borrows.md +msgid "Multiple Borrows" +msgstr "Emprunts multiples" + +#: src/SUMMARY.md src/lifetimes.md src/lifetimes/borrow-both.md +msgid "Borrow Both" +msgstr "Emprunter les deux" + +#: src/SUMMARY.md src/lifetimes.md src/lifetimes/borrow-one.md +msgid "Borrow One" +msgstr "Emprunter un" + +#: src/SUMMARY.md src/lifetimes.md src/lifetimes/lifetime-elision.md msgid "Lifetime Elision" -msgstr "Durées de vie" +msgstr "Ellipse des durées de vie" -#: src/SUMMARY.md -#, fuzzy -msgid "Struct Lifetimes" -msgstr "Durées de vie" +#: src/SUMMARY.md src/lifetimes.md src/lifetimes/struct-lifetimes.md +msgid "Lifetimes in Data Structures" +msgstr "Durées de vie dans les structures de données" -#: src/SUMMARY.md src/lifetimes/exercise.md +#: src/SUMMARY.md src/lifetimes.md src/lifetimes/exercise.md msgid "Exercise: Protobuf Parsing" -msgstr "" +msgstr "Exercice : Parsing Protobuf" #: src/SUMMARY.md -#, fuzzy msgid "Day 4: Morning" -msgstr "Jour 1 : Matin" +msgstr "Jour 4 : Matin" -#: src/SUMMARY.md src/iterators.md -#, fuzzy +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-4.md +#: src/iterators.md msgid "Iterators" msgstr "Itérateurs" -#: src/SUMMARY.md src/iterators/iterator.md src/bare-metal/no_std.md -#, fuzzy -msgid "`Iterator`" -msgstr "`Itérateur`" +#: src/SUMMARY.md src/iterators.md +msgid "Motivation" +msgstr "Objectifs" + +#: src/SUMMARY.md src/iterators/iterator.md +msgid "`Iterator` Trait" +msgstr "Trait `Iterator`" + +#: src/SUMMARY.md src/iterators/helpers.md +msgid "`Iterator` Helper Methods" +msgstr "Méthodes utiles d'`Iterator`" + +#: src/SUMMARY.md src/iterators/collect.md +msgid "`collect`" +msgstr "`collect`" #: src/SUMMARY.md src/iterators/intoiterator.md -#, fuzzy msgid "`IntoIterator`" msgstr "`IntoIterator`" -#: src/SUMMARY.md -#, fuzzy -msgid "`FromIterator`" -msgstr "FromIterator" - -#: src/SUMMARY.md src/iterators/exercise.md +#: src/SUMMARY.md src/iterators.md src/iterators/exercise.md msgid "Exercise: Iterator Method Chaining" -msgstr "" +msgstr "Exercice : Enchaînement d'adaptateurs d'itérateurs" -#: src/SUMMARY.md src/modules.md src/modules/modules.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-4.md +#: src/modules.md src/modules/modules.md msgid "Modules" msgstr "Modules" -#: src/SUMMARY.md src/modules/filesystem.md +#: src/SUMMARY.md src/modules.md src/modules/filesystem.md msgid "Filesystem Hierarchy" msgstr "Hiérarchie du système de fichiers" -#: src/SUMMARY.md src/modules/visibility.md +#: src/SUMMARY.md src/modules.md src/modules/visibility.md msgid "Visibility" msgstr "Visibilité" +#: src/SUMMARY.md src/modules.md +msgid "Encapsulation" +msgstr "Encapsulation" + #: src/SUMMARY.md msgid "`use`, `super`, `self`" -msgstr "" +msgstr "`use`, `super`, `self`" -#: src/SUMMARY.md src/modules/exercise.md -#, fuzzy +#: src/SUMMARY.md src/modules.md src/modules/exercise.md msgid "Exercise: Modules for a GUI Library" -msgstr "Une bibliothèque d'interface graphique" +msgstr "Exercice : Une bibliothèque d'interface graphique" -#: src/SUMMARY.md src/testing.md src/chromium/testing.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-4.md +#: src/testing.md src/chromium/testing.md msgid "Testing" msgstr "Tester" -#: src/SUMMARY.md -msgid "Test Modules" -msgstr "Modules de test" +#: src/SUMMARY.md src/testing.md src/testing/unit-tests.md +msgid "Unit Tests" +msgstr "Tests unitaires" -#: src/SUMMARY.md src/testing/other.md -#, fuzzy +#: src/SUMMARY.md src/testing.md src/testing/other.md msgid "Other Types of Tests" -msgstr "Autres projets" +msgstr "Autres types de tests" -#: src/SUMMARY.md src/testing/lints.md +#: src/SUMMARY.md src/testing.md src/testing/lints.md msgid "Compiler Lints and Clippy" -msgstr "" +msgstr "Conseils du compilateur et clippy" -#: src/SUMMARY.md src/testing/exercise.md -#, fuzzy +#: src/SUMMARY.md src/testing.md src/testing/exercise.md msgid "Exercise: Luhn Algorithm" -msgstr "Algorithme de Luhn" +msgstr "Exercice : Algorithme de Luhn" #: src/SUMMARY.md -#, fuzzy msgid "Day 4: Afternoon" -msgstr "Jour 1 : Après-midi" +msgstr "Jour 4 : Après-midi" -#: src/SUMMARY.md src/error-handling.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-4-afternoon.md +#: src/error-handling.md src/idiomatic/welcome.md msgid "Error Handling" msgstr "Gestion des erreurs" -#: src/SUMMARY.md src/error-handling/panics.md +#: src/SUMMARY.md src/error-handling.md src/error-handling/panics.md msgid "Panics" msgstr "Paniques" -#: src/SUMMARY.md src/error-handling/try.md -#, fuzzy +#: src/SUMMARY.md src/error-handling.md src/error-handling/try.md msgid "Try Operator" -msgstr "Iterator" +msgstr "Opérateur try" -#: src/SUMMARY.md src/error-handling/try-conversions.md -#, fuzzy +#: src/SUMMARY.md src/error-handling.md src/error-handling/try-conversions.md msgid "Try Conversions" -msgstr "Conversions implicites" +msgstr "Conversions try" #: src/SUMMARY.md -#, fuzzy msgid "`Error` Trait" -msgstr "\"Erreur\"" +msgstr "Trait `Error`" -#: src/SUMMARY.md src/error-handling/thiserror-and-anyhow.md -#, fuzzy -msgid "`thiserror` and `anyhow`" -msgstr "`De` et `Dans`" +#: src/SUMMARY.md src/error-handling/thiserror.md +msgid "`thiserror`" +msgstr "`thiserror`" + +#: src/SUMMARY.md src/error-handling/anyhow.md src/idiomatic/welcome.md +msgid "`anyhow`" +msgstr "`anyhow`" #: src/SUMMARY.md -#, fuzzy msgid "Exercise: Rewriting with `Result`" -msgstr "Gestion structurée des erreurs avec `Result`" +msgstr "Exercice : Gestion structurée des erreurs avec `Result`" -#: src/SUMMARY.md src/unsafe-rust.md src/unsafe-rust/unsafe.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/welcome-day-4-afternoon.md +#: src/unsafe-rust.md src/unsafe-rust/unsafe.md +#: src/unsafe-deep-dive/introduction/responsibility-shift.md msgid "Unsafe Rust" msgstr "Rust non sécurisé (_unsafe_)" -#: src/SUMMARY.md -#, fuzzy +#: src/SUMMARY.md src/unsafe-rust.md msgid "Unsafe" -msgstr "Rust non sécurisé (_unsafe_)" +msgstr "Unsafe" -#: src/SUMMARY.md src/unsafe-rust/dereferencing.md +#: src/SUMMARY.md src/unsafe-rust.md src/unsafe-rust/dereferencing.md msgid "Dereferencing Raw Pointers" msgstr "Déréférencement des pointeurs nus" -#: src/SUMMARY.md src/unsafe-rust/mutable-static.md +#: src/SUMMARY.md src/unsafe-rust.md src/unsafe-rust/mutable-static.md msgid "Mutable Static Variables" msgstr "Variables statiques mutables" -#: src/SUMMARY.md src/unsafe-rust/unions.md +#: src/SUMMARY.md src/unsafe-rust.md src/unsafe-rust/unions.md msgid "Unions" msgstr "Unions" -#: src/SUMMARY.md src/unsafe-rust/unsafe-functions.md -#, fuzzy +#: src/SUMMARY.md src/unsafe-rust.md src/unsafe-rust/unsafe-functions.md msgid "Unsafe Functions" +msgstr "Fonctions non sécurisées" + +#: src/SUMMARY.md src/unsafe-rust/unsafe-functions/rust.md +msgid "Unsafe Rust Functions" +msgstr "Fonctions Rust non sécurisées" + +#: src/SUMMARY.md src/unsafe-rust/unsafe-functions/extern-c.md +msgid "Unsafe External Functions" +msgstr "Fonctions non sécurisées externes" + +#: src/SUMMARY.md src/unsafe-rust/unsafe-functions/calling.md +msgid "Calling Unsafe Functions" msgstr "Appel de fonctions non sécurisées" -#: src/SUMMARY.md -#, fuzzy +#: src/SUMMARY.md src/unsafe-rust.md msgid "Unsafe Traits" -msgstr "Implémentation de traits non sécurisés" +msgstr "Traits non sécurisés" -#: src/SUMMARY.md -#, fuzzy +#: src/SUMMARY.md src/unsafe-rust.md msgid "Exercise: FFI Wrapper" -msgstr "Enveloppe FFI sécurisée" +msgstr "Exercice : Enveloppe FFI sécurisée" -#: src/SUMMARY.md src/bare-metal/android.md +#: src/SUMMARY.md msgid "Android" msgstr "Android" @@ -734,9 +783,8 @@ msgid "AIDL" msgstr "AIDL" #: src/SUMMARY.md src/android/aidl/birthday-service.md -#, fuzzy msgid "Birthday Service Tutorial" -msgstr "_service_anniversaire/src/lib.rs_ :" +msgstr "Tutoriel de service d'anniversaire" #: src/SUMMARY.md msgid "Interface" @@ -744,12 +792,11 @@ msgstr "Interface" #: src/SUMMARY.md msgid "Service API" -msgstr "" +msgstr "API de Service" #: src/SUMMARY.md -#, fuzzy msgid "Service" -msgstr "Serveur" +msgstr "Service" #: src/SUMMARY.md msgid "Server" @@ -768,45 +815,40 @@ msgid "Changing API" msgstr "Modification de l'API" #: src/SUMMARY.md -#, fuzzy msgid "Updating Implementations" -msgstr "Mise en œuvre" +msgstr "Mise à jour de l'implémentation" #: src/SUMMARY.md -#, fuzzy msgid "AIDL Types" -msgstr "Types" +msgstr "AIDL Types" #: src/SUMMARY.md src/android/aidl/types/primitives.md msgid "Primitive Types" -msgstr "" +msgstr "Types primitifs" #: src/SUMMARY.md src/android/aidl/types/arrays.md -#, fuzzy msgid "Array Types" -msgstr "Types composés" +msgstr "Types Array" #: src/SUMMARY.md src/android/aidl/types/objects.md -#, fuzzy msgid "Sending Objects" -msgstr "Objets traits" +msgstr "Objets `Send`" #: src/SUMMARY.md src/android/aidl/types/parcelables.md -#, fuzzy msgid "Parcelables" -msgstr "Variables" +msgstr "Parcelables" #: src/SUMMARY.md src/android/aidl/types/file-descriptor.md msgid "Sending Files" -msgstr "" +msgstr "Envoyer des fichiers" #: src/SUMMARY.md src/android/testing/googletest.md msgid "GoogleTest" -msgstr "" +msgstr "GoogleTest" #: src/SUMMARY.md src/android/testing/mocking.md msgid "Mocking" -msgstr "" +msgstr "Mocking" #: src/SUMMARY.md src/android/logging.md src/bare-metal/aps/logging.md msgid "Logging" @@ -820,9 +862,21 @@ msgstr "Interopérabilité" msgid "With C" msgstr "Avec C" +#: src/SUMMARY.md src/android/interoperability/with-c/c-library.md +msgid "A Simple C Library" +msgstr "Une librairie C simple" + #: src/SUMMARY.md -msgid "Calling C with Bindgen" -msgstr "Appeler C avec Bindgen" +msgid "Bindgen" +msgstr "Bindgen" + +#: src/SUMMARY.md src/android/interoperability/with-c/run-our-binary.md +msgid "Running Our Binary" +msgstr "Exécuter notre binaire" + +#: src/SUMMARY.md src/android/interoperability/with-c/rust-library.md +msgid "A Simple Rust Library" +msgstr "Une bibliothèques Rust simple" #: src/SUMMARY.md msgid "Calling Rust from C" @@ -833,202 +887,181 @@ msgid "With C++" msgstr "Avec C++" #: src/SUMMARY.md src/android/interoperability/cpp/bridge.md -#, fuzzy msgid "The Bridge Module" -msgstr "Modules de test" +msgstr "Le Module d'interface" #: src/SUMMARY.md -#, fuzzy msgid "Rust Bridge" -msgstr "Binaires Rust" +msgstr "Pont en Rust" #: src/SUMMARY.md src/android/interoperability/cpp/generated-cpp.md msgid "Generated C++" -msgstr "" +msgstr "C++ généré" #: src/SUMMARY.md msgid "C++ Bridge" -msgstr "" +msgstr "Pont C++" #: src/SUMMARY.md src/android/interoperability/cpp/shared-types.md -#, fuzzy msgid "Shared Types" -msgstr "Types scalaires" +msgstr "Types partagés" #: src/SUMMARY.md src/android/interoperability/cpp/shared-enums.md msgid "Shared Enums" -msgstr "" +msgstr "Énumérations partagées" #: src/SUMMARY.md src/android/interoperability/cpp/rust-result.md -#, fuzzy msgid "Rust Error Handling" -msgstr "Gestion des erreurs" +msgstr "Gestion des erreurs en Rust" #: src/SUMMARY.md src/android/interoperability/cpp/cpp-exception.md -#, fuzzy msgid "C++ Error Handling" -msgstr "Gestion des erreurs" +msgstr "Gestion des erreurs en C++" #: src/SUMMARY.md src/android/interoperability/cpp/type-mapping.md msgid "Additional Types" -msgstr "" +msgstr "Types supplémentaires" #: src/SUMMARY.md -msgid "Building for Android: C++" -msgstr "" +msgid "Building for Android: Genrules" +msgstr "Développement pour Android : Genrules" #: src/SUMMARY.md -msgid "Building for Android: Genrules" -msgstr "" +msgid "Building for Android: C++" +msgstr "Développement pour Android : C++" #: src/SUMMARY.md msgid "Building for Android: Rust" -msgstr "" +msgstr "Développement pour Android : Rust" #: src/SUMMARY.md msgid "With Java" msgstr "Avec Java" -#: src/SUMMARY.md src/exercises/android/morning.md -#: src/exercises/bare-metal/morning.md src/exercises/bare-metal/afternoon.md -#: src/exercises/concurrency/morning.md src/exercises/concurrency/afternoon.md -msgid "Exercises" -msgstr "Exercices" - #: src/SUMMARY.md msgid "Chromium" -msgstr "" +msgstr "Chromium" #: src/SUMMARY.md src/chromium/cargo.md msgid "Comparing Chromium and Cargo Ecosystems" -msgstr "" +msgstr "Comparaison des écosystèmes Chromium et Cargo" #: src/SUMMARY.md msgid "Policy" -msgstr "" +msgstr "Politique" #: src/SUMMARY.md -#, fuzzy msgid "Unsafe Code" msgstr "Rust non sécurisé (_unsafe_)" #: src/SUMMARY.md src/chromium/build-rules/depending.md msgid "Depending on Rust Code from Chromium C++" -msgstr "" +msgstr "Dépendre de code Rust depuis Chromium C++" #: src/SUMMARY.md src/chromium/build-rules/vscode.md msgid "Visual Studio Code" -msgstr "" +msgstr "Visual Studio Code" -#: src/SUMMARY.md src/exercises/chromium/third-party.md -#, fuzzy +#: src/SUMMARY.md src/lifetimes/exercise.md src/exercises/chromium/third-party.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md msgid "Exercise" msgstr "Exercices" #: src/SUMMARY.md src/chromium/testing/rust-gtest-interop.md msgid "`rust_gtest_interop` Library" -msgstr "" +msgstr "Bibliothèque `rust_gtest_interop`" #: src/SUMMARY.md src/chromium/testing/build-gn.md msgid "GN Rules for Rust Tests" -msgstr "" +msgstr "Règles GN pour les tests Rust" #: src/SUMMARY.md src/chromium/testing/chromium-import-macro.md msgid "`chromium::import!` Macro" -msgstr "" +msgstr "Macro `chromium::import!`" #: src/SUMMARY.md src/chromium/interoperability-with-cpp.md -#, fuzzy msgid "Interoperability with C++" -msgstr "Interopérabilité avec C" +msgstr "Interopérabilité avec C++" #: src/SUMMARY.md src/chromium/interoperability-with-cpp/example-bindings.md -#, fuzzy msgid "Example Bindings" -msgstr "Exemples" +msgstr "Exemples de bindings" #: src/SUMMARY.md src/chromium/interoperability-with-cpp/limitations-of-cxx.md msgid "Limitations of CXX" -msgstr "" +msgstr "Limitations de CXX" #: src/SUMMARY.md src/chromium/interoperability-with-cpp/error-handling.md -#, fuzzy msgid "CXX Error Handling" -msgstr "Gestion des erreurs" +msgstr "Gestion des erreurs CXX" #: src/SUMMARY.md -#, fuzzy msgid "Error Handling: QR Example" -msgstr "Gestion des erreurs" +msgstr "Gestion des erreurs : QR" #: src/SUMMARY.md -#, fuzzy msgid "Error Handling: PNG Example" -msgstr "Gestion des erreurs" +msgstr "Gestion des erreurs : PNG" #: src/SUMMARY.md msgid "Using CXX in Chromium" -msgstr "" +msgstr "Usage de CXX dans Chromium" #: src/SUMMARY.md src/chromium/adding-third-party-crates.md msgid "Adding Third Party Crates" -msgstr "" +msgstr "Ajout de dépendances externes" #: src/SUMMARY.md msgid "Configuring Cargo.toml" -msgstr "" +msgstr "Configurer le Cargo.toml" -#: src/SUMMARY.md -#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +#: src/SUMMARY.md src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md msgid "Configuring `gnrt_config.toml`" -msgstr "" +msgstr "Configurer `gnrt_config.toml`" #: src/SUMMARY.md src/chromium/adding-third-party-crates/downloading-crates.md msgid "Downloading Crates" -msgstr "" +msgstr "Télécharger des caisses" -#: src/SUMMARY.md -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +#: src/SUMMARY.md src/chromium/adding-third-party-crates/generating-gn-build-rules.md msgid "Generating `gn` Build Rules" -msgstr "" +msgstr "Génération des règles de compilation `gn`" #: src/SUMMARY.md src/chromium/adding-third-party-crates/resolving-problems.md msgid "Resolving Problems" -msgstr "" +msgstr "Résolution des problèmes" #: src/SUMMARY.md #: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md msgid "Build Scripts Which Generate Code" -msgstr "" +msgstr "Créer des scripts qui génèrent du code" #: src/SUMMARY.md #: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md msgid "Build Scripts Which Build C++ or Take Arbitrary Actions" -msgstr "" +msgstr "Générer des scripts qui compilent du C++ ou effectuent des actions arbitraires" -#: src/SUMMARY.md -#: src/chromium/adding-third-party-crates/depending-on-a-crate.md +#: src/SUMMARY.md src/chromium/adding-third-party-crates/depending-on-a-crate.md msgid "Depending on a Crate" -msgstr "" +msgstr "Dépendre d'un Crate" #: src/SUMMARY.md msgid "Reviews and Audits" -msgstr "" +msgstr "Examens et audits" #: src/SUMMARY.md msgid "Checking into Chromium Source Code" -msgstr "" +msgstr "Vérification du code source de Chromium" #: src/SUMMARY.md src/chromium/adding-third-party-crates/keeping-up-to-date.md msgid "Keeping Crates Up to Date" -msgstr "" +msgstr "Mise à jour régulière des Crates" #: src/SUMMARY.md msgid "Bringing It Together - Exercise" -msgstr "" +msgstr "Rassembler les éléments - Exercice" #: src/SUMMARY.md src/exercises/chromium/solutions.md -#, fuzzy msgid "Exercise Solutions" msgstr "Solutions" @@ -1037,7 +1070,6 @@ msgid "Bare Metal: Morning" msgstr "Bare Metal : Matin" #: src/SUMMARY.md src/bare-metal/no_std.md -#, fuzzy msgid "`no_std`" msgstr "`no_std`" @@ -1046,9 +1078,8 @@ msgid "A Minimal Example" msgstr "Un exemple minimal" #: src/SUMMARY.md src/bare-metal/no_std.md src/bare-metal/alloc.md -#, fuzzy msgid "`alloc`" -msgstr "`allouer`" +msgstr "`alloc`" #: src/SUMMARY.md src/bare-metal/microcontrollers.md msgid "Microcontrollers" @@ -1075,12 +1106,10 @@ msgid "The Type State Pattern" msgstr "Le modèle d'état de type" #: src/SUMMARY.md src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy msgid "`embedded-hal`" msgstr "`embedded-hal`" #: src/SUMMARY.md src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy msgid "`probe-rs` and `cargo-embed`" msgstr "`probe-rs`, `cargo-embed`" @@ -1092,12 +1121,21 @@ msgstr "Débogage" msgid "Other Projects" msgstr "Autres projets" +#: src/SUMMARY.md src/running-the-course/course-structure.md +#: src/exercises/bare-metal/morning.md src/exercises/bare-metal/afternoon.md +#: src/concurrency/welcome.md src/concurrency/sync-exercises.md +#: src/concurrency/welcome-async.md src/concurrency/async-exercises.md +msgid "Exercises" +msgstr "Exercices" + #: src/SUMMARY.md src/exercises/bare-metal/compass.md #: src/exercises/bare-metal/solutions-morning.md msgid "Compass" msgstr "Boussole" -#: src/SUMMARY.md +#: src/SUMMARY.md src/concurrency/sync-exercises.md +#: src/concurrency/sync-exercises/solutions.md src/concurrency/async-exercises.md +#: src/concurrency/async-exercises/solutions.md msgid "Solutions" msgstr "Solutions" @@ -1111,7 +1149,7 @@ msgstr "Processeurs d'applications" #: src/SUMMARY.md src/bare-metal/aps/entry-point.md msgid "Getting Ready to Rust" -msgstr "" +msgstr "Se préparer à Rust" #: src/SUMMARY.md msgid "Inline Assembly" @@ -1129,6 +1167,10 @@ msgstr "Écrivons un pilote UART" msgid "More Traits" msgstr "Plus de traits" +#: src/SUMMARY.md src/bare-metal/aps/safemmio/using.md +msgid "Using It" +msgstr "Utilisation" + #: src/SUMMARY.md msgid "A Better UART Driver" msgstr "Un meilleur pilote UART" @@ -1142,50 +1184,54 @@ msgid "Multiple Registers" msgstr "Registres multiples" #: src/SUMMARY.md src/bare-metal/aps/better-uart/driver.md +#: src/bare-metal/aps/safemmio/driver.md msgid "Driver" msgstr "Pilote" -#: src/SUMMARY.md -msgid "Using It" -msgstr "Utilisation" +#: src/SUMMARY.md src/bare-metal/aps/safemmio/registers.md +msgid "safe-mmio" +msgstr "MMIO sûre" -#: src/SUMMARY.md src/bare-metal/aps/exceptions.md +#: src/SUMMARY.md src/error-handling/result.md src/bare-metal/aps/exceptions.md +#: src/bare-metal/aps/aarch64-rt/exceptions.md msgid "Exceptions" msgstr "Exceptions" +#: src/SUMMARY.md src/bare-metal/aps/aarch64-rt.md +msgid "aarch64-rt" +msgstr "`aarch64-rt`" + #: src/SUMMARY.md msgid "Useful Crates" msgstr "Crates utiles" #: src/SUMMARY.md src/bare-metal/useful-crates/zerocopy.md -#, fuzzy msgid "`zerocopy`" -msgstr "`zérocopie`" +msgstr "`zerocopy`" #: src/SUMMARY.md src/bare-metal/useful-crates/aarch64-paging.md -#, fuzzy msgid "`aarch64-paging`" -msgstr "`aarch64-pagination`" +msgstr "`aarch64-paging`" #: src/SUMMARY.md src/bare-metal/useful-crates/buddy_system_allocator.md -#, fuzzy msgid "`buddy_system_allocator`" msgstr "`buddy_system_allocator`" #: src/SUMMARY.md src/bare-metal/useful-crates/tinyvec.md -#, fuzzy msgid "`tinyvec`" msgstr "`tinyvec`" #: src/SUMMARY.md src/bare-metal/useful-crates/spin.md -#, fuzzy msgid "`spin`" -msgstr "`tourner`" +msgstr "`spin`" + +#: src/SUMMARY.md src/bare-metal/android.md +msgid "Bare-Metal on Android" +msgstr "Bare Metal : Matin" #: src/SUMMARY.md -#, fuzzy msgid "`vmbase`" -msgstr "vmbase" +msgstr "`vmbase`" #: src/SUMMARY.md msgid "RTC Driver" @@ -1195,71 +1241,82 @@ msgstr "Pilote RTC" msgid "Concurrency: Morning" msgstr "Concurrence : Matin" -#: src/SUMMARY.md src/concurrency/threads.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/concurrency/welcome.md +#: src/concurrency/threads.md msgid "Threads" msgstr "Threads" -#: src/SUMMARY.md src/concurrency/scoped-threads.md +#: src/SUMMARY.md src/concurrency/threads.md src/concurrency/threads/plain.md +msgid "Plain Threads" +msgstr "Threads" + +#: src/SUMMARY.md src/concurrency/threads.md src/concurrency/threads/scoped.md msgid "Scoped Threads" msgstr "Threads délimités" -#: src/SUMMARY.md src/concurrency/channels.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/concurrency/welcome.md +#: src/concurrency/channels.md msgid "Channels" msgstr "Canaux" -#: src/SUMMARY.md src/concurrency/channels/unbounded.md +#: src/SUMMARY.md src/concurrency/channels.md src/concurrency/channels/senders-receivers.md +msgid "Senders and Receivers" +msgstr "Expéditeurs et récepteurs" + +#: src/SUMMARY.md src/concurrency/channels.md src/concurrency/channels/unbounded.md msgid "Unbounded Channels" msgstr "Canaux illimités" -#: src/SUMMARY.md src/concurrency/channels/bounded.md +#: src/SUMMARY.md src/concurrency/channels.md src/concurrency/channels/bounded.md msgid "Bounded Channels" msgstr "Canaux limités" #: src/SUMMARY.md src/concurrency/send-sync.md -#, fuzzy msgid "`Send` and `Sync`" -msgstr "`Envoyer` et `Synchroniser`" +msgstr "`Send` et `Sync`" + +#: src/SUMMARY.md src/concurrency/send-sync.md src/concurrency/send-sync/marker-traits.md +msgid "Marker Traits" +msgstr "Traits marqueurs" #: src/SUMMARY.md src/concurrency/send-sync/send.md -#, fuzzy msgid "`Send`" -msgstr "`Envoyer`" +msgstr "`Send`" #: src/SUMMARY.md src/concurrency/send-sync/sync.md -#, fuzzy msgid "`Sync`" -msgstr "`Synchroniser`" +msgstr "`Sync`" -#: src/SUMMARY.md src/concurrency/send-sync/examples.md +#: src/SUMMARY.md src/concurrency/send-sync.md src/concurrency/send-sync/examples.md msgid "Examples" msgstr "Exemples" -#: src/SUMMARY.md src/concurrency/shared_state.md +#: src/SUMMARY.md src/running-the-course/course-structure.md src/concurrency/welcome.md +#: src/concurrency/shared-state.md msgid "Shared State" msgstr "État partagé" -#: src/SUMMARY.md src/concurrency/shared_state/arc.md -#, fuzzy +#: src/SUMMARY.md src/concurrency/shared-state/arc.md msgid "`Arc`" msgstr "`Arc`" -#: src/SUMMARY.md src/concurrency/shared_state/mutex.md -#, fuzzy +#: src/SUMMARY.md src/concurrency/shared-state/mutex.md msgid "`Mutex`" msgstr "`Mutex`" -#: src/SUMMARY.md src/memory-management/review.md -#: src/error-handling/try-conversions.md -#: src/concurrency/shared_state/example.md +#: src/SUMMARY.md src/memory-management/review.md src/error-handling/try-conversions.md +#: src/concurrency/shared-state.md src/concurrency/shared-state/example.md msgid "Example" msgstr "Exemple" -#: src/SUMMARY.md src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md +#: src/SUMMARY.md src/concurrency/sync-exercises.md +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md src/concurrency/async-exercises.md msgid "Dining Philosophers" msgstr "Dîner des philosophes" -#: src/SUMMARY.md src/exercises/concurrency/link-checker.md +#: src/SUMMARY.md src/concurrency/sync-exercises.md +#: src/concurrency/sync-exercises/link-checker.md msgid "Multi-threaded Link Checker" msgstr "Vérificateur de liens à plusieurs threads" @@ -1267,19612 +1324,34308 @@ msgstr "Vérificateur de liens à plusieurs threads" msgid "Concurrency: Afternoon" msgstr "Concurrence : Après-midi" -#: src/SUMMARY.md +#: src/SUMMARY.md src/running-the-course/course-structure.md +#: src/concurrency/welcome-async.md src/concurrency/async.md msgid "Async Basics" -msgstr "" +msgstr "Bases d'async" -#: src/SUMMARY.md src/async/async-await.md +#: src/SUMMARY.md src/concurrency/async/async-await.md msgid "`async`/`await`" -msgstr "" +msgstr "`async`/`await`" -#: src/SUMMARY.md src/async/futures.md +#: src/SUMMARY.md src/concurrency/async.md src/concurrency/async/futures.md msgid "Futures" -msgstr "Fermetures" +msgstr "Futures" -#: src/SUMMARY.md src/async/runtimes.md -#, fuzzy +#: src/SUMMARY.md src/concurrency/async.md src/concurrency/async/state-machine.md +msgid "State Machine" +msgstr "Machine à états" + +#: src/SUMMARY.md src/concurrency/async.md src/concurrency/async/runtimes.md msgid "Runtimes" -msgstr "Garanties d'exécution" +msgstr "Runtimes" -#: src/SUMMARY.md src/async/runtimes/tokio.md +#: src/SUMMARY.md src/concurrency/async/runtimes/tokio.md msgid "Tokio" msgstr "Tokio" -#: src/SUMMARY.md src/exercises/concurrency/link-checker.md src/async/tasks.md -#: src/exercises/concurrency/chat-app.md +#: src/SUMMARY.md src/concurrency/sync-exercises/link-checker.md src/concurrency/async.md +#: src/concurrency/async/tasks.md src/concurrency/async-exercises/chat-app.md msgid "Tasks" msgstr "Tâches" -#: src/SUMMARY.md src/async/channels.md +#: src/SUMMARY.md src/running-the-course/course-structure.md +#: src/concurrency/welcome-async.md src/concurrency/async-control-flow.md +msgid "Channels and Control Flow" +msgstr "Flux de contrôle" + +#: src/SUMMARY.md src/concurrency/async-control-flow.md +#: src/concurrency/async-control-flow/channels.md msgid "Async Channels" msgstr "Canaux asynchrones" -#: src/SUMMARY.md -msgid "Control Flow" -msgstr "Flux de contrôle" - -#: src/SUMMARY.md src/async/control-flow/join.md +#: src/SUMMARY.md src/concurrency/async-control-flow.md +#: src/concurrency/async-control-flow/join.md msgid "Join" -msgstr "" +msgstr "Jointures" -#: src/SUMMARY.md src/async/control-flow/select.md +#: src/SUMMARY.md src/concurrency/async-control-flow.md +#: src/concurrency/async-control-flow/select.md msgid "Select" msgstr "Select" -#: src/SUMMARY.md +#: src/SUMMARY.md src/running-the-course/course-structure.md +#: src/concurrency/welcome-async.md src/concurrency/async-pitfalls.md msgid "Pitfalls" msgstr "Pièges" -#: src/SUMMARY.md +#: src/SUMMARY.md src/concurrency/async-pitfalls.md msgid "Blocking the Executor" msgstr "Bloquer l'exécuteur" -#: src/SUMMARY.md src/async/pitfalls/pin.md +#: src/SUMMARY.md src/concurrency/async-pitfalls/pin.md msgid "`Pin`" -msgstr "" +msgstr "`Pin`" -#: src/SUMMARY.md src/async/pitfalls/async-traits.md +#: src/SUMMARY.md src/concurrency/async-pitfalls.md +#: src/concurrency/async-pitfalls/async-traits.md msgid "Async Traits" msgstr "Traits asynchrones" -#: src/SUMMARY.md src/async/pitfalls/cancellation.md +#: src/SUMMARY.md src/concurrency/async-pitfalls.md +#: src/concurrency/async-pitfalls/cancellation.md msgid "Cancellation" msgstr "Annulation" -#: src/SUMMARY.md src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md +#: src/SUMMARY.md src/concurrency/async-exercises.md +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md msgid "Broadcast Chat Application" -msgstr "" +msgstr "Application de chat de diffusion" -#: src/SUMMARY.md -msgid "Final Words" -msgstr "Derniers mots" +#: src/SUMMARY.md src/running-the-course/course-structure.md +msgid "Idiomatic Rust" +msgstr "Rust idiomatique" -#: src/SUMMARY.md src/thanks.md -msgid "Thanks!" -msgstr "Merci!" +#: src/SUMMARY.md src/running-the-course/course-structure.md src/idiomatic/welcome.md +#: src/idiomatic/foundations-api-design.md +msgid "Foundations of API Design" +msgstr "Fondements de la conception d'API" -#: src/SUMMARY.md src/glossary.md -msgid "Glossary" -msgstr "" +#: src/SUMMARY.md src/idiomatic/foundations-api-design.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments.md +msgid "Meaningful Doc Comments" +msgstr "Commentaires pertinents pour la documentation" #: src/SUMMARY.md -msgid "Other Resources" -msgstr "Autres ressources" +msgid "Who Are You Writing For?" +msgstr "Pour qui écrivez-vous ?" -#: src/SUMMARY.md src/credits.md -msgid "Credits" -msgstr "Crédits" +#: src/SUMMARY.md +msgid "Library vs Application docs" +msgstr "Documentation de bibliothèque vs d'application" -#: src/index.md -#, fuzzy -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) [![GitHub stars](https://img.shields." -"io/github/stars/google/comprehensive-rust?style=flat-square)](https://github." -"com/google/comprehensive-rust/stargazers)" -msgstr "" -"[![Flux de construction](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) [![Contributeurs GitHub](https://img.shields.io/github/" -"contributors/google/comprehensive-rust?style=flat-square)](https://github." -"com/google/comprehensive-rust/graphs/contributors)" +#: src/SUMMARY.md +msgid "Anatomy of a Doc Comment" +msgstr "Anatomie d'un commentaire pour la documentation" -#: src/index.md -msgid "" -"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 "" -"Ce cours Rust gratuit a été développé par l'équipe Android de Google. Le " -"cours couvre l'ensemble du langage Rust, de la syntaxe de base aux sujets " -"avancés comme les génériques et la gestion des erreurs." +#: src/SUMMARY.md +msgid "Name Drop and Signpost" +msgstr "Abandon de nom et indicateurs" -#: src/index.md -msgid "" -"The latest version of the course can be found at . If you are reading somewhere else, please check there " -"for updates." -msgstr "" -"La version la plus à jour de ce cours se trouve à l'adresse suivante: " -". Si vous lisez ce cours " -"depuis une autre adresse, n'hésitez pas à suivre ce lien pour accéder à la " -"dernière version." +#: src/SUMMARY.md +msgid "Avoid Redundancy" +msgstr "Éviter les redondances" -#: src/index.md -msgid "The course is also available [as a PDF](comprehensive-rust.pdf)." -msgstr "" -"Ce cours est également disponible [au format PDF](comprehensive-rust.pdf)." +#: src/SUMMARY.md +msgid "Name and Signature are Not Enough" +msgstr "Le nom et la signature ne suffisent pas" -#: src/index.md -msgid "" -"The goal of the course is to teach you Rust. We assume you don't know " -"anything about Rust and hope to:" -msgstr "" -"Le but du cours est de vous apprendre Rust. Nous supposons que vous " -"découvrez ce langage et espérons :" +#: src/SUMMARY.md +msgid "What and Why, not How and Where" +msgstr "Quoi et pourquoi, et non comment et où." -#: src/index.md -msgid "Give you a comprehensive understanding of the Rust syntax and language." -msgstr "" -"Vous donner une compréhension complète de la syntaxe et du langage Rust." +#: src/SUMMARY.md src/idiomatic/foundations-api-design.md +#: src/idiomatic/foundations-api-design/predictable-api.md +msgid "Predictable API" +msgstr "API prévisible" -#: src/index.md -msgid "Enable you to modify existing programs and write new programs in Rust." -msgstr "" -"Vous permettre de modifier des programmes existants et d'écrire de nouveaux " -"programmes en Rust." +#: src/SUMMARY.md +msgid "Naming conventions" +msgstr "Conventions d'appellation" -#: src/index.md -msgid "Show you common Rust idioms." -msgstr "Vous montrer les constructions fréquentes (idiomes) en Rust." +#: src/SUMMARY.md +msgid "New" +msgstr "New" -#: src/index.md -msgid "We call the first four course days Rust Fundamentals." -msgstr "" -"Nous appelons les quatre premiers jours de ce cours les «Fondamentaux de " -"Rust»." +#: src/SUMMARY.md +msgid "Get" +msgstr "Get" -#: src/index.md -msgid "" -"Building on this, you're invited to dive into one or more specialized topics:" -msgstr "" -"Au-delà de ces quatre premiers jours de cours, nous vous invitons à " -"approfondir un ou plusieurs des sujets suivant:" +#: src/SUMMARY.md +msgid "Push" +msgstr "Push" -#: src/index.md -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 "" -"[Android](android.md): un cours d'une demi-journée consacré à l'utilisation " -"de Rust dans le cadre du développement pour la plate-forme Android. Ce cours " -"couvre également l'interopérabilité avec les langages C, C++ et Java." +#: src/SUMMARY.md +msgid "Is" +msgstr "Is" -#: src/index.md -msgid "" -"[Chromium](chromium.md): a half-day course on using Rust within Chromium " -"based browsers. This includes interoperability with C++ and how to include " -"third-party crates in Chromium." -msgstr "" -"[Chromium](chromium.md): un cours d'une demi-journée consacré à " -"l'utilisation de Rust dans le cadre du développement pour les navigateurs " -"internet basés sur Chromium. Il inclut l'interopérabilité avec le langage C+" -"+ et explique comment inclure des crates tierces dans Chromium." +#: src/SUMMARY.md +msgid "Mut" +msgstr "Mut" -#: src/index.md -msgid "" -"[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 "" -"[Bare-metal](bare-metal.md): un cours d'une journée consacré à l'utilisation " -"de Rust pour le développement embarqué. Le cours touche à la fois aux " -"microcontrôleurs et aux processeurs d'applications." +#: src/SUMMARY.md +msgid "With: Constructor" +msgstr "Avec: Constructeur" -#: src/index.md -msgid "" -"[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 "" -"[Programmation concurrente](concurrency.md): un cours d'une journée consacré " -"à la programmation concurrente en Rust. Nous couvrons la concurrence " -"classique (planification à base de threads et mutex) ainsi que la " -"concurrence async/await (multitâche coopératif à base de _futures_)." +#: src/SUMMARY.md +msgid "With: Copy-and-change" +msgstr "Avec: Copy-and-change" -#: src/index.md -msgid "Non-Goals" -msgstr "Non-objectifs" +#: src/SUMMARY.md +msgid "With: Closures" +msgstr "Avec: Fermetures" -#: src/index.md -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:" -msgstr "" -"Rust est un vaste langage et nous ne pourrons pas tout couvrir en quelques " -"jours. Certains non-objectifs de ce cours sont :" +#: src/SUMMARY.md +msgid "With in normal use" +msgstr "En usage normal" -#: src/index.md -msgid "" -"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 "" -"Apprendre comment développer des macros: pour cela, nous vous invitons à " -"consulter le [Chapitre 19.5 dans le Rust Book](https://doc.rust-lang.org/" -"book/ch19-06-macros.html) et [Rust by Example](https://doc.rust-lang.org/" -"rust-by-example/macros.html) (an anglais). Vous pouvez également consulter " -"[le Chapitre 19.5 dans la traduction non-officielle du Rust Book](https://" -"jimskapt.github.io/rust-book-fr/ch19-06-macros.html) en français." +#: src/SUMMARY.md +msgid "Try" +msgstr "Try" -#: src/index.md -msgid "Assumptions" -msgstr "Prérequis" +#: src/SUMMARY.md +msgid "From" +msgstr "From" -#: src/index.md -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 " -"C++ to better explain or contrast the Rust approach." -msgstr "" -"Le cours suppose que vous savez déjà programmer. Rust est un langage " -"statiquement typé et nous ferons parfois des comparaisons avec C et C++ pour " -"mieux expliquer ou contraster l'approche de Rust." +#: src/SUMMARY.md +msgid "Into" +msgstr "Into" -#: src/index.md -msgid "" -"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 "" -"Si vous savez programmer dans un langage à typage dynamique tel que Python " -"ou JavaScript, vous pourrez également suivre ce cours sans problème." +#: src/SUMMARY.md +msgid "Into inner" +msgstr "Into inner" -#: src/index.md -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 " -"should cover as well as answers to typical questions which come up in class." -msgstr "" -"Ceci est un exemple de _note du formateur_. Nous les utiliserons pour " -"ajouter d'autres informations sur les diapositives. Cela pourrait être des " -"points clés que l'instructeur devrait couvrir, ainsi que des réponses aux " -"questions typiques posées en classe." +#: src/SUMMARY.md +msgid "By" +msgstr "By" -#: src/running-the-course.md src/running-the-course/course-structure.md -msgid "This page is for the course instructor." -msgstr "Cette page est destinée au formateur." +#: src/SUMMARY.md +msgid "Unchecked" +msgstr "Unchecked" -#: src/running-the-course.md -msgid "" -"Here is a bit of background information about how we've been running the " -"course internally at Google." -msgstr "" -"Voici quelques informations générales sur la façon dont nous avons organisé " -"le cours en interne chez Google." +#: src/SUMMARY.md +msgid "To" +msgstr "To" -#: src/running-the-course.md -msgid "" -"We typically run classes from 9:00 am to 4:00 pm, with a 1 hour lunch break " -"in the middle. This leaves 3 hours for the morning class and 3 hours for the " -"afternoon class. Both sessions contain multiple breaks and time for students " -"to work on exercises." -msgstr "" -"En général les classes sont organisées de 9 heures à 16 heures, avec une " -"pause déjeuner d'une heure, soit trois heures de cours le matin et trois " -"heures l'après-midi. La session du matin comme celle de l'après-midi " -"comportent plusieurs pauses ainsi que du temps consacré aux exercices." +#: src/SUMMARY.md +msgid "As and Ref" +msgstr "As et Ref" -#: src/running-the-course.md -msgid "Before you run the course, you will want to:" -msgstr "" -"Avant de présenter le cours, nous vous recommandons les choses suivantes :" +#: src/SUMMARY.md +msgid "Raw parts" +msgstr "Raw parts" -#: src/running-the-course.md -msgid "" -"Make yourself familiar with the course material. We've included speaker " -"notes to help highlight the key points (please help us by contributing more " -"speaker notes!). When presenting, you should make sure to open the speaker " -"notes in a popup (click the link with a little arrow next to \"Speaker " -"Notes\"). This way you have a clean screen to present to the class." -msgstr "" -"Familiarisez-vous avec le cours. Nous avons inclus les _notes du formateur_ " -"afin de mettre les points clés en évidence (n'hésitez pas à nous proposer " -"des notes supplémentaires !). Lors de la présentation, vous devez vous " -"assurer d'ouvrir les notes du formateur dans une popup (cliquez sur le lien " -"avec une petite flèche à côté de _Notes du Formateur_ (_Speaker Notes_)). De " -"cette façon, vous affichez le cours sans les notes à la classe, et pouvez " -"suivre les notes séparément." +#: src/SUMMARY.md +msgid "Implementing Common Traits" +msgstr "Implémentation de traits communs" -#: src/running-the-course.md -msgid "" -"Decide on the dates. Since the course takes four days, we recommend that you " -"schedule the days over two weeks. Course participants have said that they " -"find it helpful to have a gap in the course since it helps them process all " -"the information we give them." -msgstr "" -"Décidez des dates de la classe en avance. Étant donné que le cours dure " -"quatre jours complets, nous vous recommandons de programmer les jours de " -"classe sur un intervalle de deux semaines. Les participants aux classes " -"précédentes ont en effet indiqué qu'il est utile d'espacer les jours de " -"classe afin de mieux absorber le contenu." +#: src/SUMMARY.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "Debug" +msgstr "Débogage" -#: src/running-the-course.md -msgid "" -"Find a room large enough for your in-person participants. We recommend a " -"class size of 15-25 people. That's small enough that people are comfortable " -"asking questions --- it's also small enough that one instructor will have " -"time to answer the questions. Make sure the room has _desks_ for yourself " -"and for the students: you will all need to be able to sit and work with your " -"laptops. In particular, you will be doing a lot of live-coding as an " -"instructor, so a lectern won't be very helpful for you." -msgstr "" -"Trouvez une salle suffisamment grande pour que tous les participants " -"puissent suivre en personne. Nous recommandons que le nombre de participants " -"soit de 15 à 20 personnes. Cela constitue un groupe suffisamment petit pour " -"que les gens soient à l'aise pour poser des questions --- c'est aussi assez " -"petit pour qu'un instructeur ait le temps de répondre aux questions. Assurez-" -"vous que la salle dispose de _bureaux_ pour vous et pour les étudiants : " -"vous devriez tous pouvoir vous assoir et travailler avec vos ordinateurs " -"portables. En particulier, vous serez amené à faire beaucoup de " -"programmation en direct en tant qu'instructeur, donc un simple pupitre ne " -"serait pas très pratique pour vous." +#: src/SUMMARY.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "PartialEq and Eq" +msgstr "PartialEq et Eq" -#: src/running-the-course.md -msgid "" -"On the day of your course, show up to the room a little early to set things " -"up. We recommend presenting directly using `mdbook serve` running on your " -"laptop (see the [installation instructions](https://github.com/google/" -"comprehensive-rust#building)). This ensures optimal performance with no lag " -"as you change pages. Using your laptop will also allow you to fix typos as " -"you or the course participants spot them." -msgstr "" -"Les jours de classe, prévoyez d'arriver en avance afin de préparer la salle. " -"Nous vous recommandons de présenter directement en utilisant `mdbook serve` " -"exécuté sur votre ordinateur portable (voir les [instructions d'installation]" -"(https://github.com/google/comprehensive-rust#building)). Cela garantit des " -"performances optimales sans ralentissement lorsque vous changez de page. " -"L'utilisation de votre ordinateur portable vous permettra également de " -"corriger les éventuelles fautes de frappe." +#: src/SUMMARY.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +msgid "PartialOrd and Ord" +msgstr "PartialOrd et Ord" -#: src/running-the-course.md -msgid "" -"Let people solve the exercises by themselves or in small groups. We " -"typically spend 30-45 minutes on exercises in the morning and in the " -"afternoon (including time to review the solutions). Make sure to ask people " -"if they're stuck or if there is anything you can help with. When you see " -"that several people have the same problem, call it out to the class and " -"offer a solution, e.g., by showing people where to find the relevant " -"information in the standard library." -msgstr "" -"Laissez les participants résoudre les exercices seuls ou en petits groupes. " -"En général nous consacrons 30 à 45 minutes aux exercices le matin et l'après-" -"midi (y compris pour discuter les solutions). Assurez-vous de demander aux " -"gens s'ils sont bloqués ou si vous pouvez les aider. Si vous constatez que " -"plusieurs personnes font face au même problème, partagez-le avec la classe " -"et proposez une solution, par exemple en montrant aux participants où " -"trouver les informations pertinentes dans la bibliothèque standard." +#: src/SUMMARY.md src/idiomatic/foundations-api-design/predictable-api/common-traits/hash.md +msgid "Hash" +msgstr "Hash" -#: src/running-the-course.md -msgid "" -"That is all, good luck running the course! We hope it will be as much fun " -"for you as it has been for us!" -msgstr "" -"C'est tout, bonne chance pour la présentation du cours ! Nous espérons que " -"vous y prendrez autant de plaisir que nous !" +#: src/SUMMARY.md src/memory-management.md src/memory-management/clone.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md +msgid "Clone" +msgstr "Clone" -#: src/running-the-course.md -msgid "" -"Please [provide feedback](https://github.com/google/comprehensive-rust/" -"discussions/86) afterwards so that we can keep improving the course. We " -"would love to hear what worked well for you and what can be made better. " -"Your students are also very welcome to [send us feedback](https://github.com/" -"google/comprehensive-rust/discussions/100)!" -msgstr "" -"Nous vous demandons de bien vouloir [fournir des commentaires](https://" -"github.com/google/comprehensive-rust/discussions/86) par la suite afin que " -"nous puissions continuer d'améliorer le cours. Nous aimerions savoir ce qui " -"a bien fonctionné pour vous et ce qui pourrait être amélioré. Vos élèves " -"peuvent également [envoyer des commentaires](https://github.com/google/" -"comprehensive-rust/discussions/100). Merci !" +#: src/SUMMARY.md src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "Copy" +msgstr "Copy" -#: src/running-the-course/course-structure.md -msgid "Rust Fundamentals" -msgstr "Fondamentaux de Rust" +#: src/SUMMARY.md +msgid "Serialize and Deserialize" +msgstr "Serialize et Deserialize" -#: src/running-the-course/course-structure.md -msgid "" -"The first four days make up [Rust Fundamentals](../welcome-day-1.md). The " -"days are fast paced and we cover a lot of ground!" -msgstr "" -"Les quatre premiers jours constituent les [Fondamentaux de Rust](../welcome-" -"day-1.md). Le rythme est soutenu et nous couvrons beaucoup de sujets!" +#: src/SUMMARY.md src/std-traits.md +msgid "From and Into" +msgstr "From et Into" -#: src/running-the-course/course-structure.md -msgid "{{%course outline Fundamentals}}" -msgstr "{{%course outline Fundamentals}}" +#: src/SUMMARY.md +msgid "TryFrom and TryInto" +msgstr "TryFrom et TryInto" -#: src/running-the-course/course-structure.md -msgid "Deep Dives" -msgstr "Approfondissements" +#: src/SUMMARY.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "Display" +msgstr "Display" -#: src/running-the-course/course-structure.md -msgid "" -"In addition to the 4-day class on Rust Fundamentals, we cover some more " -"specialized topics:" -msgstr "" -"Au delà des quatre jours portant sur les Fondamentaux de Rust, nous couvrons " -"également des sujets spécifiques:" +#: src/SUMMARY.md src/running-the-course/course-structure.md src/idiomatic/welcome.md +#: src/idiomatic/leveraging-the-type-system.md +msgid "Leveraging the Type System" +msgstr "Exploiter le système de types" -#: src/running-the-course/course-structure.md -msgid "Rust in Android" -msgstr "Rust pour Android" +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md +msgid "Newtype Pattern" +msgstr "Newtype Pattern" -#: src/running-the-course/course-structure.md -msgid "" -"The [Rust in Android](../android.md) deep dive is a half-day course on using " -"Rust for Android platform development. This includes interoperability with " -"C, C++, and Java." -msgstr "" -"[Rust pour Android](../android.md) est un cours d'une demi-journée consacré " -"à l'utilisation de Rust dans le cadre du développement pour la plate-forme " -"Android. Ce cours couvre également l'interopérabilité avec les langages C, C+" -"+ et Java." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +msgid "Semantic Confusion" +msgstr "Confusion sémantique" -#: src/running-the-course/course-structure.md -msgid "" -"You will need an [AOSP checkout](https://source.android.com/docs/setup/" -"download/downloading). Make a checkout of the [course repository](https://" -"github.com/google/comprehensive-rust) on the same machine and move the `src/" -"android/` directory into the root of your AOSP checkout. This will ensure " -"that the Android build system sees the `Android.bp` files in `src/android/`." -msgstr "" -"Vous aurez besoin d'un [AOSP checkout](https://source.android.com/docs/setup/" -"download/downloading). Effectuez un checkout du [répertoire du cours]" -"(https://github.com/google/comprehensive-rust) sur la même machine et " -"déplacez le dossier `src/android/` à la racine de votre checkout AOSP. Cela " -"assurera que le système de construction d'Android a accès aux fichiers " -"`Android.bp` dans `src/android/`." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md +msgid "Parse, Don't Validate" +msgstr "Analyser, ne pas valider" -#: src/running-the-course/course-structure.md -msgid "" -"Ensure that `adb sync` works with your emulator or real device and pre-build " -"all Android examples using `src/android/build_all.sh`. Read the script to " -"see the commands it runs and make sure they work when you run them by hand." -msgstr "" -"Assurez-vous que `adb sync` fonctionne avec votre émulateur ou votre " -"appareil réel et pré-construisez tous les exemples Android en utilisant `src/" -"android/build_all.sh`. Lisez le script pour voir les commandes éxécutées et " -"assurez-vous qu'elles fonctionnent lorsque vous les exécutez à la main." +#: src/SUMMARY.md +msgid "Is It Encapsulated?" +msgstr "Est-ce encapsulé ?" -#: src/running-the-course/course-structure.md -msgid "Rust in Chromium" -msgstr "Rust pour Chromium" +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system.md +msgid "RAII" +msgstr "RAII" -#: src/running-the-course/course-structure.md -msgid "" -"The [Rust in Chromium](../chromium.md) deep dive is a half-day course on " -"using Rust as part of the Chromium browser. It includes using Rust in " -"Chromium's `gn` build system, bringing in third-party libraries (\"crates\") " -"and C++ interoperability." -msgstr "" -"Le cours [Rust pour Chromium](../chromium.md) dure une demi-journée et " -"explore l'utilisation de Rust pour le navigateur Chromium. Il couvre " -"l'utilisation de Rust au sein du système de compilation `gn` de Chromium, " -"l'intégration de bibliothèques tierces (\"crates\") et l'interopérabilité " -"avec C++." +#: src/SUMMARY.md +msgid "Drop Skipped" +msgstr "Drop sauté" -#: src/running-the-course/course-structure.md -msgid "" -"You will need to be able to build Chromium --- a debug, component build is " -"[recommended](../chromium/setup.md) for speed but any build will work. " -"Ensure that you can run the Chromium browser that you've built." -msgstr "" -"Vous aurez besoin de pouvoir compiler Chromium --- une compilation debug par " -"composant est [recommandée](../chromium/setup.md) pour pouvoir effectuer des " -"itérations de développement plus rapidement. Assurez-vous que vous pouvez " -"lancer le navigateur Chromium que vous avez compilé." +#: src/SUMMARY.md src/concurrency/shared-state.md +msgid "Mutex" +msgstr "Mutex" -#: src/running-the-course/course-structure.md -msgid "Bare-Metal Rust" -msgstr "Bare-Metal Rust" +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "Drop Guards" +msgstr "Drop Guards" -#: src/running-the-course/course-structure.md -msgid "" -"The [Bare-Metal Rust](../bare-metal.md) deep dive is a full day class on " -"using Rust for bare-metal (embedded) development. Both microcontrollers and " -"application processors are covered." -msgstr "" -"[Bare-metal Rust](../bare-metal.md) est un cours d'une journée consacré à " -"l'utilisation de Rust pour le développement embarqué. Le cours touche à la " -"fois aux microcontrôleurs et aux processeurs d'applications." +#: src/SUMMARY.md +msgid "Drop Bomb" +msgstr "Drop Bomb" -#: src/running-the-course/course-structure.md -msgid "" -"For the microcontroller part, you will need to buy the [BBC micro:bit]" -"(https://microbit.org/) v2 development board ahead of time. Everybody will " -"need to install a number of packages as described on the [welcome page](../" -"bare-metal.md)." -msgstr "" -"Pour la partie microcontrôleurs, vous devrez acheter la carte de " -"développement [BBC micro:bit](https://microbit.org/) v2 avant de commencer.\n" -"Tous les participants à ce cours devront installer les paquets listés sur " -"[la page de bienvenue](../bare-metal.md) du cours." +#: src/SUMMARY.md +msgid "Drop Bomb Forget" +msgstr "Drop Bomb Forget" -#: src/running-the-course/course-structure.md -msgid "Concurrency in Rust" -msgstr "Programmation concurrente en Rust" +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md +msgid "forget and drop functions" +msgstr "Fonctions forget et drop" -#: src/running-the-course/course-structure.md -msgid "" -"The [Concurrency in Rust](../concurrency.md) deep dive is a full day class " -"on classical as well as `async`/`await` concurrency." -msgstr "" -"[La programmation concurrente en Rust](../concurrency.md) est un cours d'une " -"journée portant sur la programmation concurrente classique ainsi que `async`/" -"`await`." +#: src/SUMMARY.md +msgid "Scope Guard" +msgstr "Threads délimités" -#: src/running-the-course/course-structure.md -msgid "" -"You will need a fresh crate set up and the dependencies downloaded and ready " -"to go. You can then copy/paste the examples into `src/main.rs` to experiment " -"with them:" -msgstr "" -"Il faudra que vous ayez préparé une crate à jour et que vous ayez téléchargé " -"et installé les dépendances. Vous pourrez ensuite copier/coller les exemples " -"dans `src/main.rs` et les modifier:" +#: src/SUMMARY.md +msgid "Drop Option" +msgstr "Drop Option" -#: src/running-the-course/course-structure.md -msgid "Format" -msgstr "Format du cours" +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system.md +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "Extension Traits" +msgstr "Extension Traits" -#: src/running-the-course/course-structure.md -msgid "" -"The course is meant to be very interactive and we recommend letting the " -"questions drive the exploration of Rust!" -msgstr "" -"Le cours se veut très interactif et nous recommandons de laisser les " -"questions guider l'exploration de Rust !" +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "Extending Foreign Types" +msgstr "Extension des types étrangers" -#: src/running-the-course/keyboard-shortcuts.md -msgid "There are several useful keyboard shortcuts in mdBook:" -msgstr "Il existe plusieurs raccourcis clavier utiles dans mdBook :" +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "Method Resolution Conflicts" +msgstr "Conflits de résolution des méthodes" -#: src/running-the-course/keyboard-shortcuts.md -msgid "Arrow-Left" -msgstr "Flèche vers la gauche" +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "Trait Method Conflicts" +msgstr "Conflits de méthodes de traits" -#: src/running-the-course/keyboard-shortcuts.md -msgid ": Navigate to the previous page." -msgstr " : Navigue à la page précédente." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "Extending Other Traits" +msgstr "Extension d'autres Traits" -#: src/running-the-course/keyboard-shortcuts.md -msgid "Arrow-Right" -msgstr "Flèche vers la droite" +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md +msgid "Should I Define An Extension Trait?" +msgstr "Dois-je définir un trait d'extension ?" -#: src/running-the-course/keyboard-shortcuts.md -msgid ": Navigate to the next page." -msgstr " : Navigue à la page suivante." +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system.md +msgid "Typestate Pattern" +msgstr "Le patron d'état de type" -#: src/running-the-course/keyboard-shortcuts.md src/cargo/code-samples.md -msgid "Ctrl + Enter" -msgstr "Ctrl + Entrée" +#: src/SUMMARY.md +msgid "Typestate Pattern Example" +msgstr "Le patron d'état de type" -#: src/running-the-course/keyboard-shortcuts.md -msgid ": Execute the code sample that has focus." -msgstr " : Exécute l'exemple de code qui a le focus." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "Beyond Simple Typestate" +msgstr "Au-delà du simple état de type" -#: src/running-the-course/keyboard-shortcuts.md -msgid "s" -msgstr "s" +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +msgid "Typestate Pattern with Generics" +msgstr "Le patron d'état de type avec génériques" -#: src/running-the-course/keyboard-shortcuts.md -msgid ": Activate the search bar." -msgstr " : Active la barre de recherche." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/root.md +msgid "Serializer: implement Root" +msgstr "Sérialiseur : implémenter Root" -#: src/running-the-course/translations.md -msgid "" -"The course has been translated into other languages by a set of wonderful " -"volunteers:" -msgstr "" -"Le cours a été traduit dans d'autres langues par un ensemble de merveilleux " -"bénévoles:" +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +msgid "Serializer: implement Struct" +msgstr "Sérialiseur : implémente Struct" -#: src/running-the-course/translations.md -msgid "" -"[Brazilian Portuguese](https://google.github.io/comprehensive-rust/pt-BR/) " -"by [@rastringer](https://github.com/rastringer), [@hugojacob](https://github." -"com/hugojacob), [@joaovicmendes](https://github.com/joaovicmendes), and " -"[@henrif75](https://github.com/henrif75)." -msgstr "" -"[portugais brésilien](https://google.github.io/comprehensive-rust/pt-BR/) " -"par [@rastringer](https://github.com/rastringer), [@hugojacob](https://" -"github.com/hugojacob), [@joaovicmendes](https://github.com/joaovicmendes), " -"et [@henrif75](https://github.com/henrif75)." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "Serializer: implement Property" +msgstr "Sérialiseur : implémenter la propriété" -#: src/running-the-course/translations.md -msgid "" -"[Chinese (Simplified)](https://google.github.io/comprehensive-rust/zh-CN/) " -"by [@suetfei](https://github.com/suetfei), [@wnghl](https://github.com/" -"wnghl), [@anlunx](https://github.com/anlunx), [@kongy](https://github.com/" -"kongy), [@noahdragon](https://github.com/noahdragon), [@superwhd](https://" -"github.com/superwhd), [@SketchK](https://github.com/SketchK), and [@nodmp]" -"(https://github.com/nodmp)." -msgstr "" -"[chinois (simplifié)](https://google.github.io/comprehensive-rust/zh-CN/) " -"par [@suetfei](https://github.com/suetfei), [@wnghl](https://github.com/" -"wnghl), [@anlunx](https://github.com/anlunx), [@kongy](https://github.com/" -"kongy), [@noahdragon](https://github.com/noahdragon), [@superwhd](https://" -"github.com/superwhd), [@SketchK](https://github.com/SketchK), et [@nodmp]" -"(https://github.com/nodmp)." +#: src/SUMMARY.md +msgid "Serializer: Complete implementation" +msgstr "Sérialiseur : Implémentation complète" -#: src/running-the-course/translations.md -msgid "" -"[Chinese (Traditional)](https://google.github.io/comprehensive-rust/zh-TW/) " -"by [@hueich](https://github.com/hueich), [@victorhsieh](https://github.com/" -"victorhsieh), [@mingyc](https://github.com/mingyc), [@kuanhungchen](https://" -"github.com/kuanhungchen), and [@johnathan79717](https://github.com/" -"johnathan79717)." -msgstr "" -"[chinois (traditionnel)](https://google.github.io/comprehensive-rust/zh-TW/) " -"par [@hueich](https://github.com/hueich), [@victorhsieh](https://github.com/" -"victorhsieh), [@mingyc](https://github.com/mingyc), [@kuanhungchen](https://" -"github.com/kuanhungchen), et [@johnathan79717](https://github.com/" -"johnathan79717)." +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system.md +msgid "Borrow checking invariants" +msgstr "Invariants d'emprunts" -#: src/running-the-course/translations.md -msgid "" -"[Korean](https://google.github.io/comprehensive-rust/ko/) by [@keispace]" -"(https://github.com/keispace), [@jiyongp](https://github.com/jiyongp), " -"[@jooyunghan](https://github.com/jooyunghan), and [@namhyung](https://github." -"com/namhyung)." -msgstr "" -"[coréen](https://google.github.io/comprehensive-rust/ko/) par [@keispace]" -"(https://github.com/keispace), [@jiyongp](https://github.com/jiyongp), " -"[@jooyunghan](https://github.com/jooyunghan), et [@namhyung](https://github." -"com/namhyung)." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "Lifetimes and Borrows: the Abstract Rules" +msgstr "Durées de vie et emprunts : règles théoriques" -#: src/running-the-course/translations.md -msgid "" -"[Spanish](https://google.github.io/comprehensive-rust/es/) by [@deavid]" -"(https://github.com/deavid)." -msgstr "" -"[espagnol](https://google.github.io/comprehensive-rust/es/) by [@deavid]" -"(https://github.com/deavid)." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "Single-use values" +msgstr "Valeurs à usage unique" -#: src/running-the-course/translations.md -msgid "" -"Use the language picker in the top-right corner to switch between languages." -msgstr "" -"Utilisez le sélecteur de langue dans le coin supérieur droit pour basculer " -"entre les langues." +#: src/SUMMARY.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "Mutually Exclusive References / \"Aliasing XOR Mutability\"" +msgstr "Références mutuellement exclusives / \"Aliasing XOR Mutability\"" -#: src/running-the-course/translations.md -msgid "Incomplete Translations" -msgstr "Traductions incomplètes" +#: src/SUMMARY.md +msgid "PhantomData and Types" +msgstr "Données fantômes et types" -#: src/running-the-course/translations.md -msgid "" -"There is a large number of in-progress translations. We link to the most " -"recently updated translations:" -msgstr "" -"Il y a beaucoup de traductions en cours d'élaboration. Nous listons ci-" -"dessous celles ayant été mises à jour le plus récemment:" +#: src/SUMMARY.md +msgid "PhantomData and Types (implementation)" +msgstr "Données fantômes et types (implémentation)" -#: src/running-the-course/translations.md -msgid "" -"[Bengali](https://google.github.io/comprehensive-rust/bn/) by [@raselmandol]" -"(https://github.com/raselmandol)." -msgstr "" -"[bengali](https://google.github.io/comprehensive-rust/bn/) par [@raselmandol]" -"(https://github.com/raselmandol)." +#: src/SUMMARY.md +msgid "PhantomData: Lifetimes for External Resources" +msgstr "Données fantômes: Durées de vie et ressources externes" -#: src/running-the-course/translations.md -msgid "" -"[French](https://google.github.io/comprehensive-rust/fr/) by [@KookaS]" -"(https://github.com/KookaS) and [@vcaen](https://github.com/vcaen)." +#: src/SUMMARY.md +msgid "PhantomData: OwnedFd & BorrowedFd" msgstr "" -"[francais](https://google.github.io/comprehensive-rust/fr/) par [@KookaS]" -"(https://github.com/KookaS), [@vcaen](https://github.com/vcaen) et " -"[@AdrienBaudemont](https://github.com/AdrienBaudemont)." -#: src/running-the-course/translations.md -msgid "" -"[German](https://google.github.io/comprehensive-rust/de/) by [@Throvn]" -"(https://github.com/Throvn) and [@ronaldfw](https://github.com/ronaldfw)." -msgstr "" -"[allemand](https://google.github.io/comprehensive-rust/de/) par [@Throvn]" -"(https://github.com/Throvn) et [@ronaldfw](https://github.com/ronaldfw)." +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system.md +#: src/idiomatic/leveraging-the-type-system/token-types.md +#, fuzzy +msgid "Token Types" +msgstr "Types composés" -#: src/running-the-course/translations.md -msgid "" -"[Japanese](https://google.github.io/comprehensive-rust/ja/) by [@CoinEZ-JPN]" -"(https://github.com/CoinEZ) and [@momotaro1105](https://github.com/" -"momotaro1105)." +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md +msgid "Permission Tokens" msgstr "" -"[japonais](https://google.github.io/comprehensive-rust/ja/) par [@CoinEZ-JPN]" -"(https://github.com/CoinEZ) et [@momotaro1105](https://github.com/" -"momotaro1105)." -#: src/running-the-course/translations.md -msgid "" -"[Italian](https://google.github.io/comprehensive-rust/it/) by " -"[@henrythebuilder](https://github.com/henrythebuilder) and [@detro](https://" -"github.com/detro)." +#: src/SUMMARY.md src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md +msgid "Token Types with Data: Mutex Guards" msgstr "" -"[italien](https://google.github.io/comprehensive-rust/it/) par " -"[@henrythebuilder](https://github.com/henrythebuilder) et [@detro](https://" -"github.com/detro)." -#: src/running-the-course/translations.md -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 " -"get going. Translations are coordinated on the [issue tracker](https://" -"github.com/google/comprehensive-rust/issues/282)." +#: src/SUMMARY.md +msgid "Branded pt 1: Variable-specific tokens" msgstr "" -"Si vous souhaitez contribuer à cet effort, veuillez consulter [nos " -"instructions - en anglais](https://github.com/google/comprehensive-rust/blob/" -"main/TRANSLATIONS.md) pour savoir comment se lancer. Les traductions sont " -"coordonnées sur le [suivi de bogues - en anglais](https://github.com/google/" -"comprehensive-rust/issues/282)." -#: src/cargo.md -msgid "" -"When you start reading about Rust, you will soon meet [Cargo](https://doc." -"rust-lang.org/cargo/), the standard tool used in the Rust ecosystem to build " -"and run Rust applications. Here we want to give a brief overview of what " -"Cargo is and how it fits into the wider ecosystem and how it fits into this " -"training." +#: src/SUMMARY.md +msgid "Branded pt 2: `PhantomData` and Lifetime Subtyping" msgstr "" -"Lorsque vous commencerez à vous documenter sur Rust, vous rencontrerez " -"rapidement [Cargo](https://doc.rust-lang.org/cargo/), l'outil standard " -"utilisé dans l'écosystème Rust pour créer et exécuter des applications Rust. " -"Dans cette section, nous voulons donner un bref aperçu de ce qu'est Cargo, " -"comment il s'intègre dans le large écosystème de Rust et comment il " -"s'inscrit dans cette formation." -#: src/cargo.md -msgid "Installation" -msgstr "Installation" +#: src/SUMMARY.md +#, fuzzy +msgid "Branded pt 3: Implementation" +msgstr "Mise en œuvre des services" -#: src/cargo.md -msgid "**Please follow the instructions on .**" +#: src/SUMMARY.md +msgid "Branded pt 4: Branded types in action." msgstr "" -"**Veuillez suivre les instructions sur ** (en anglais)." -#: src/cargo.md -msgid "" -"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 to different compiler versions." +#: src/SUMMARY.md src/running-the-course/course-structure.md src/idiomatic/welcome.md +#: src/idiomatic/polymorphism.md +msgid "Polymorphism" msgstr "" -"Une fois que vous aurez suivi ces instructions, vous disposerez du " -"gestionnaire de dépendances et système de compilation `cargo` et du " -"compilateur `rustc`. `rustup` sera également installé : il s'agit d'un " -"utilitaire en ligne de commande que vous pourrez utiliser pour installer " -"différentes versions du compilateur." -#: src/cargo.md -msgid "" -"After installing Rust, you should configure your editor or IDE to work with " -"Rust. Most editors do this by talking to [rust-analyzer](https://rust-" -"analyzer.github.io/), which provides auto-completion and jump-to-definition " -"functionality for [VS Code](https://code.visualstudio.com/), [Emacs](https://" -"rust-analyzer.github.io/manual.html#emacs), [Vim/Neovim](https://rust-" -"analyzer.github.io/manual.html#vimneovim), and many others. There is also a " -"different IDE available called [RustRover](https://www.jetbrains.com/rust/)." -msgstr "" -"Après avoir installé Rust, il vous faudra configurer votre éditeur de texte " -"ou votre IDE (environnement de développement) pour travailler avec Rust. La " -"plupart des éditeurs reposent, pour ce faire, sur le [rust-analyzer](https://" -"rust-analyzer.github.io/), un outil qui fournit les fonctionnalités de " -"complétion automatique et de lien vers les définitions des symboles, " -"notamment pour [VS Code](https://code.visualstudio.com/), [Emacs](https://" -"rust-analyzer.github.io/manual.html#emacs), [Vim/Neovim](https://rust-" -"analyzer.github.io/manual.html#vimneovim), et bien d'autres. Il existe " -"également un IDE appelé [RustRover](https://www.jetbrains.com/rust/)." - -#: src/cargo.md -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:" +#: src/SUMMARY.md src/idiomatic/polymorphism/refresher.md +msgid "Refresher" msgstr "" -"Sur Debian/Ubuntu, vous pouvez installer Cargo, les sources Rust (`rust-" -"src`: compilateur et bibliothèques standards) et l'outil de [formatage Rust]" -"(https://github.com/rust-lang/rustfmt) via `apt`. Veuillez noter toutefois " -"que l'installation via `apt` ne vous procurera pas la dernière version de " -"Rust, ce qui pourrait conduire à des problèmes de comportement indéterminé " -"(undefined behavior). La ligne de commande à utiliser serait :" -#: src/cargo/rust-ecosystem.md -msgid "The Rust Ecosystem" -msgstr "L'écosystème de Rust" +#: src/SUMMARY.md src/idiomatic/polymorphism/refresher/deriving-traits.md +#, fuzzy +msgid "Deriving Traits" +msgstr "Traits dérivés" -#: src/cargo/rust-ecosystem.md -msgid "" -"The Rust ecosystem consists of a number of tools, of which the main ones are:" -msgstr "" -"L'écosystème de Rust est composé d'un certain nombre d'outils, dont les " -"principaux sont :" +#: src/SUMMARY.md +#, fuzzy +msgid "Default Implementations" +msgstr "Mise en œuvre" -#: src/cargo/rust-ecosystem.md -msgid "" -"`rustc`: the Rust compiler which turns `.rs` files into binaries and other " -"intermediate formats." -msgstr "" -"`rustc` : le compilateur Rust qui transforme les fichiers `.rs` en binaires " -"et autres formats intermédiaires." +#: src/SUMMARY.md +#, fuzzy +msgid "Blanket Implementations" +msgstr "Mise en œuvre" -#: src/cargo/rust-ecosystem.md -msgid "" -"`cargo`: the Rust dependency manager and build tool. Cargo knows how to " -"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." +#: src/SUMMARY.md +msgid "Conditional Methods" msgstr "" -"`cargo` : le gestionnaire de dépendances Rust et l'outil de compilation. " -"Cargo peut télécharger les dépendances, en général hébergées sur , et les rendre disponibles pour `rustc` lors de la compilation de " -"votre projet. Cargo intègre également un outil pour exécuter des tests " -"unitaires." -#: src/cargo/rust-ecosystem.md -msgid "" -"`rustup`: the Rust toolchain installer and updater. This tool is used to " -"install and update `rustc` and `cargo` when new versions of Rust are " -"released. In addition, `rustup` can also download documentation for the " -"standard library. You can have multiple versions of Rust installed at once " -"and `rustup` will let you switch between them as needed." +#: src/SUMMARY.md src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "Orphan Rule" msgstr "" -"`rustup` : le programme d'installation et de mise à jour de la chaîne " -"d'outils Rust. Cet outil sert à installer et mettre à jour `rustc` et " -"`cargo` lorsque de nouvelles versions de Rust sont publiées. De plus, " -"`rustup` peut également télécharger la documentation de la bibliothèque " -"standard. Vous pouvez avoir plusieurs versions de Rust installées à la fois " -"et `rustup` vous permettra de basculer entre elles au besoin." - -#: src/cargo/rust-ecosystem.md src/types-and-values/hello-world.md -#: src/references/exclusive.md src/pattern-matching/destructuring.md -#: src/memory-management/move.md src/error-handling/try.md src/android/setup.md -#: src/async/async-await.md -msgid "Key points:" -msgstr "Points clés:" -#: src/cargo/rust-ecosystem.md -msgid "" -"Rust has a rapid release schedule with a new release coming out every six " -"weeks. New releases maintain backwards compatibility with old releases --- " -"plus they enable new functionality." +#: src/SUMMARY.md +msgid "Statically Sized and Dynamically Sized types" msgstr "" -"Rust a un calendrier de publication rapide : une nouvelle version est " -"disponible toutes les six semaines. Les nouvelles versions maintiennent la " -"rétrocompatibilité avec les anciennes versions --- en plus, elles proposent " -"de nouvelles fonctionnalités." -#: src/cargo/rust-ecosystem.md -msgid "" -"There are three release channels: \"stable\", \"beta\", and \"nightly\"." +#: src/SUMMARY.md src/idiomatic/polymorphism/refresher/monomorphization.md +msgid "Monomorphization and Binary Size" msgstr "" -"Il existe trois types de publication : \"stable\", \"beta\" et \"nightly\"." -#: src/cargo/rust-ecosystem.md -msgid "" -"New features are being tested on \"nightly\", \"beta\" is what becomes " -"\"stable\" every six weeks." +#: src/SUMMARY.md +msgid "From OOP to Rust" msgstr "" -"Les nouvelles fonctionnalités sont testées sur \"nightly\". \"beta\" est ce " -"qui devient \"stable\" toutes les six semaines." -#: src/cargo/rust-ecosystem.md -msgid "" -"Dependencies can also be resolved from alternative [registries](https://doc." -"rust-lang.org/cargo/reference/registries.html), git, folders, and more." +#: src/SUMMARY.md +msgid "Inheritance" msgstr "" -"Les dépendances peuvent aussi être obtenues sur des [dépôts alternatifs]" -"(https://doc.rust-lang.org/cargo/reference/registries.html), via `git`, dans " -"des répertoires système, et autres." -#: src/cargo/rust-ecosystem.md -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." +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "Why no Inheritance in Rust?" msgstr "" -"Rust a également des [éditions](https://doc.rust-lang.org/edition-guide/) : " -"l'édition actuelle est Rust 2021. Les éditions passées étaient Rust 2015 et " -"Rust 2018." -#: src/cargo/rust-ecosystem.md -msgid "" -"The editions are allowed to make backwards incompatible changes to the " -"language." +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "Inheritance from Rust's Perspective" msgstr "" -"Les éditions sont autorisées à apporter des modifications **non** " -"rétrocompatibles au langage." -#: src/cargo/rust-ecosystem.md -msgid "" -"To prevent breaking code, editions are opt-in: you select the edition for " -"your crate via the `Cargo.toml` file." +#: src/SUMMARY.md +msgid "\"Inheritance\" in Rust and Supertraits" msgstr "" -"Pour éviter de casser vos dépendances et empêcher la compilation de votre " -"projet, les éditions sont laissées au choix : vous sélectionnez l'édition " -"pour chaque crate via le fichier `Cargo.toml`." -#: src/cargo/rust-ecosystem.md -msgid "" -"To avoid splitting the ecosystem, Rust compilers can mix code written for " -"different editions." +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/composition.md +msgid "Composition over Inheritance" msgstr "" -"Pour éviter de diviser l'écosystème, les compilateurs Rust peuvent mélanger " -"du code écrit pour différentes éditions." -#: src/cargo/rust-ecosystem.md -msgid "" -"Mention that it is quite rare to ever use the compiler directly not through " -"`cargo` (most users never do)." +#: src/SUMMARY.md +msgid "Trait Objects and Dynamic Dispatch" msgstr "" -"Veuillez noter qu'il est assez rare d'utiliser le compilateur directement et " -"non via `cargo` (la plupart des utilisateurs ne le font jamais)." -#: src/cargo/rust-ecosystem.md -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 "" -"Il peut être utile de mentionner que Cargo est un outil extrêmement puissant " -"et complet. Il est capable de nombreuses fonctionnalités avancées, y " -"compris, mais sans s'y limiter :" +#: src/SUMMARY.md +#, fuzzy +msgid "Dyn Compatibility" +msgstr "Interopérabilité" -#: src/cargo/rust-ecosystem.md -msgid "Project/package structure" -msgstr "Structure du projet/paquets" +#: src/SUMMARY.md +#, fuzzy +msgid "Generics vs Trait Objects" +msgstr "Génériques" -#: src/cargo/rust-ecosystem.md -msgid "[workspaces](https://doc.rust-lang.org/cargo/reference/workspaces.html)" -msgstr "" -"[Espaces de travail](https://doc.rust-lang.org/cargo/reference/workspaces." -"html)" +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md +#, fuzzy +msgid "Limits of Trait Objects" +msgstr "Objets traits" -#: src/cargo/rust-ecosystem.md -msgid "Dev Dependencies and Runtime Dependency management/caching" +#: src/SUMMARY.md +msgid "Heterogeneous Collections" msgstr "" -"Gestion/mise en cache des dépendances de développement et des dépendances " -"d'exécution" -#: src/cargo/rust-ecosystem.md -msgid "" -"[build scripting](https://doc.rust-lang.org/cargo/reference/build-scripts." -"html)" -msgstr "" -"[Créer des scripts](https://doc.rust-lang.org/cargo/reference/build-scripts." -"html)" +#: src/SUMMARY.md +#, fuzzy +msgid "The `Any` Trait" +msgstr "Le trait `Lâcher`" -#: src/cargo/rust-ecosystem.md -msgid "" -"[global installation](https://doc.rust-lang.org/cargo/commands/cargo-install." -"html)" +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md +msgid "Pitfall: Reaching too quickly for `dyn Trait`" msgstr "" -"[Installation globale](https://doc.rust-lang.org/cargo/commands/cargo-" -"install.html)" -#: src/cargo/rust-ecosystem.md -msgid "" -"It is also extensible with sub command plugins as well (such as [cargo " -"clippy](https://github.com/rust-lang/rust-clippy))." +#: src/SUMMARY.md +#, fuzzy +msgid "Sealed Traits" +msgstr "Implémentation de traits non sécurisés" + +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/sealing-with-enums.md +#, fuzzy +msgid "Sealing with Enums" +msgstr "Appeler C avec Bindgen" + +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/sticking-with-traits.md +msgid "Traits for Polymorphism users can extend" msgstr "" -"Il est également extensible avec des plugins de sous-commande (tels que " -"[cargo clippy](https://github.com/rust-lang/rust-clippy))." -#: src/cargo/rust-ecosystem.md -msgid "" -"Read more from the [official Cargo Book](https://doc.rust-lang.org/cargo/)" +#: src/SUMMARY.md src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "Problem solving: Break Down the Problem" msgstr "" -"Pour en savoir plus, vous pouvez lire le [livre officiel de Cargo - en " -"anglais](https://doc.rust-lang.org/cargo/)" -#: src/cargo/code-samples.md -msgid "Code Samples in This Training" -msgstr "Échantillons de code dans cette formation" +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +#, fuzzy +msgid "Introduction" +msgstr "Solutions" -#: src/cargo/code-samples.md -msgid "" -"For this training, we will mostly explore the Rust language through examples " -"which can be executed through your browser. This makes the setup much easier " -"and ensures a consistent experience for everyone." +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +#: src/unsafe-deep-dive/introduction/definition.md +#, fuzzy +msgid "Defining Unsafe Rust" +msgstr "Rust non sécurisé (_unsafe_)" + +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +msgid "Purpose of the unsafe keyword" msgstr "" -"Pour cette formation, nous allons surtout explorer le langage Rust à travers " -"des exemples qui peuvent être exécuté via votre navigateur. Cela rend la " -"configuration beaucoup plus facile et assure une expérience cohérente pour " -"chacun." -#: src/cargo/code-samples.md -msgid "" -"Installing Cargo is still encouraged: it will make it easier for you to do " -"the exercises. On the last day, we will do a larger exercise which shows you " -"how to work with dependencies and for that you need Cargo." +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +msgid "Two roles of the unsafe keyword" msgstr "" -"L'installation de Cargo est tout de même encouragée : elle vous facilitera " -"la tâche pour les exercices. Le dernier jour, nous ferons un exercice plus " -"conséquent qui vous montrera comment travailler avec des dépendances et, " -"pour cela, vous avez besoin de Cargo." -#: src/cargo/code-samples.md -msgid "The code blocks in this course are fully interactive:" -msgstr "Les blocs de code de ce cours sont entièrement interactifs :" +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +#, fuzzy +msgid "Warm Up Examples" +msgstr "Exemples" -#: src/cargo/code-samples.md src/cargo/running-locally.md -msgid "\"Edit me!\"" +#: src/SUMMARY.md src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md +msgid "Using an unsafe block" msgstr "" -#: src/cargo/code-samples.md -msgid "You can use " -msgstr "Vous pouvez utiliser " +#: src/SUMMARY.md src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +#, fuzzy +msgid "Defining an unsafe function" +msgstr "Ecrire des fonctions non sécurisées" -#: src/cargo/code-samples.md -msgid " to execute the code when focus is in the text box." -msgstr " pour exécuter le code lorsque le focus est dans la zone de texte." +#: src/SUMMARY.md src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +#, fuzzy +msgid "Implementing an unsafe trait" +msgstr "Implémentation de traits non sécurisés" -#: src/cargo/code-samples.md -msgid "" -"Most code samples are editable like shown above. A few code samples are not " -"editable for various reasons:" -msgstr "" -"La plupart des exemples de code sont modifiables comme indiqué ci-dessus. " -"Quelques exemples de code ne sont pas modifiables pour diverses raisons :" +#: src/SUMMARY.md src/unsafe-deep-dive/introduction/warm-up/unsafe-trait.md +#, fuzzy +msgid "Defining an unsafe trait" +msgstr "Implémentation de traits non sécurisés" -#: src/cargo/code-samples.md -msgid "" -"The embedded playgrounds cannot execute unit tests. Copy-paste the code and " -"open it in the real Playground to demonstrate unit tests." +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +msgid "Characteristics of Unsafe Rust" msgstr "" -"Les environnements d'exécution intégrés ne peuvent pas exécuter de tests " -"unitaires. Copiez-collez le code et ouvrez-le dans l'environnement " -"d'exécution complet pour valider les tests unitaires." -#: src/cargo/code-samples.md -msgid "" -"The embedded playgrounds lose their state the moment you navigate away from " -"the page! This is the reason that the students should solve the exercises " -"using a local Rust installation or via the Playground." +#: src/SUMMARY.md +msgid "Dangerous" msgstr "" -"Les environnements d'exécution intégrés sont réinitialisés dès que vous " -"quittez la page! C'est la raison pour laquelle les élèves doivent résoudre " -"les exercices en utilisant une installation Rust locale ou via " -"l'environnement d'exécution complet." -#: src/cargo/running-locally.md -msgid "Running Code Locally with Cargo" -msgstr "Exécuter du code localement avec Cargo" +#: src/SUMMARY.md +msgid "Sometimes necessary" +msgstr "" -#: src/cargo/running-locally.md -msgid "" -"If you want to experiment with the code on your own system, then you will " -"need to first install Rust. Do this by following the [instructions in the " -"Rust Book](https://doc.rust-lang.org/book/ch01-01-installation.html). This " -"should give you a working `rustc` and `cargo`. At the time of writing, the " -"latest stable Rust release has these version numbers:" +#: src/SUMMARY.md +msgid "Sometimes useful" msgstr "" -"Si vous souhaitez expérimenter le code sur votre propre système, il vous " -"faudra d'abord installer Rust. Pour ce faire, suivez les [instructions dans " -"le livre Rust - en anglais](https://doc.rust-lang.org/book/ch01-01-" -"installation.html). Vous disposerez alors de `rustc` et `cargo`. Au moment " -"de l'écriture, la dernière version stable de Rust a ces numéros de version :" -#: src/cargo/running-locally.md -msgid "" -"You can use any later version too since Rust maintains backwards " -"compatibility." +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +msgid "Responsibility shift" msgstr "" -"N'importe quelle version plus récente peut également être utilisée, étant " -"donné que les versions de Rust sont rétrocompatibles." -#: src/cargo/running-locally.md -msgid "" -"With this in place, follow these steps to build a Rust binary from one of " -"the examples in this training:" +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +msgid "Stronger development workflow required" msgstr "" -"Suivez ensuite ces étapes pour créer un binaire Rust à partir d'un des " -"exemples dans cette formation :" -#: src/cargo/running-locally.md -msgid "Click the \"Copy to clipboard\" button on the example you want to copy." +#: src/SUMMARY.md src/unsafe-deep-dive/introduction.md +msgid "Example: may_overflow" msgstr "" -"Cliquez sur le bouton \"Copy to clipboard\" sur l'exemple que vous souhaitez " -"copier." -#: src/cargo/running-locally.md -msgid "" -"Use `cargo new exercise` to create a new `exercise/` directory for your code:" +#: src/SUMMARY.md src/unsafe-deep-dive/safety-preconditions.md +msgid "Safety Preconditions" msgstr "" -"Exécutez `cargo new exercise` pour créer un nouveau répertoire `exercise/` " -"pour héberger votre code :" -#: src/cargo/running-locally.md -msgid "" -"Navigate into `exercise/` and use `cargo run` to build and run your binary:" +#: src/SUMMARY.md +msgid "Common Preconditions" msgstr "" -"Rendez vous dans le répertoire `exercise/` et exécutez `cargo run` pour " -"compiler et exécuter votre binaire :" -#: src/cargo/running-locally.md -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" +#: src/SUMMARY.md src/unsafe-deep-dive/safety-preconditions/getter.md +#, fuzzy +msgid "Getter example" +msgstr "Exécutez l'exemple avec :" + +#: src/SUMMARY.md src/unsafe-deep-dive/safety-preconditions/semantic-preconditions.md +msgid "Semantic preconditions" msgstr "" -"Remplacez le code standard sous `src/main.rs` par votre propre code. Par " -"exemple, en suivant l'exemple de la page précédente, modifiez `src/main.rs` " -"comme ceci :" -#: src/cargo/running-locally.md -msgid "Use `cargo run` to build and run your updated binary:" +#: src/SUMMARY.md src/unsafe-deep-dive/safety-preconditions/u8-to-bool.md +msgid "Example: u8 to bool" msgstr "" -"Exécutez `cargo run` pour compiler et exécuter votre binaire mis à jour :" -#: src/cargo/running-locally.md -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/" -"debug/` for a normal debug build. Use `cargo build --release` to produce an " -"optimized release build in `target/release/`." +#: src/SUMMARY.md +msgid "Determining preconditions" msgstr "" -"Exécutez `cargo check` afin de rapidement déterminer si votre projet " -"contient des erreurs. Exécutez `cargo build` pour le compiler sans " -"l'exécuter. Pour une compilation normale en mode debug, le résultat se " -"trouvera dans le répertoire `target/debug/`. Enfin, vous pouvez exécuter " -"`cargo build --release` pour générer un binaire optimisé qui se trouvera " -"dans le répertoire `target/release/`." -#: src/cargo/running-locally.md -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." +#: src/SUMMARY.md +#, fuzzy +msgid "Example: references" +msgstr "Références invalides" + +#: src/SUMMARY.md src/unsafe-deep-dive/safety-preconditions/defining.md +msgid "Defining your own preconditions" msgstr "" -"Vous pouvez déclarer des dépendances pour votre projet dans le fichier " -"`Cargo.toml`. Quand vous lancez des commandes `cargo`, Cargo se charge de " -"télécharger et compiler les dépendances manquantes." -#: src/cargo/running-locally.md -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 " -"development environment." +#: src/SUMMARY.md src/unsafe-deep-dive/safety-preconditions/ascii.md +msgid "Example: ASCII Type" msgstr "" -"Essayez d'encourager les participants à installer Cargo et à utiliser un " -"éditeur local. Cela leur facilitera la vie puisqu'ils auront un " -"environnement de développement normal." -#: src/welcome-day-1.md -msgid "Welcome to Day 1" -msgstr "Bienvenue au jour 1" +#: src/SUMMARY.md src/unsafe-deep-dive/rules-of-the-game.md +#, fuzzy +msgid "Rules of the game" +msgstr "Exécutez l'exemple avec :" -#: src/welcome-day-1.md +#: src/SUMMARY.md src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md #, fuzzy -msgid "" -"This is the first day of Rust Fundamentals. We will cover a lot of ground " -"today:" -msgstr "" -"C'est le premier jour de Comprehensive Rust(le guide complet de Rust). Nous " -"couvrirons beaucoup de terrain aujourd'hui:" +msgid "Rust is sound" +msgstr "Rust pour Android" -#: src/welcome-day-1.md -msgid "" -"Basic Rust syntax: variables, scalar and compound types, enums, structs, " -"references, functions, and methods." +#: src/SUMMARY.md +msgid "Copying memory" msgstr "" -"Syntaxe de base de Rust : variables, types scalaires et composés, " -"énumérations, structures, références, fonctions et méthodes." -#: src/welcome-day-1.md +#: src/SUMMARY.md src/unsafe-deep-dive/introduction/responsibility-shift.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md #, fuzzy -msgid "Types and type inference." -msgstr "Inférence de type" +msgid "Safe Rust" +msgstr "Rust non sécurisé (_unsafe_)" -#: src/welcome-day-1.md -msgid "Control flow constructs: loops, conditionals, and so on." +#: src/SUMMARY.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md +#, fuzzy +msgid "Encapsulated Unsafe Rust" +msgstr "Rust non sécurisé (_unsafe_)" + +#: src/SUMMARY.md src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +#, fuzzy +msgid "Exposed Unsafe Rust" +msgstr "Rust non sécurisé (_unsafe_)" + +#: src/SUMMARY.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "Documented safety preconditions" msgstr "" -#: src/welcome-day-1.md -msgid "User-defined types: structs and enums." +#: src/SUMMARY.md src/unsafe-deep-dive/rules-of-the-game/copying-memory/crying-wolf.md +msgid "Crying Wolf" msgstr "" -#: src/welcome-day-1.md -#, fuzzy -msgid "Pattern matching: destructuring enums, structs, and arrays." +#: src/SUMMARY.md +msgid "3 shapes of sound Rust" msgstr "" -"Filtrage par motif : déstructuration des énumérations, des structures et des " -"tableaux." -#: src/welcome-day-1.md src/welcome-day-2.md src/welcome-day-3.md -#: src/welcome-day-4.md -msgid "Schedule" +#: src/SUMMARY.md src/unsafe-deep-dive/rules-of-the-game/soundness-proof.md +msgid "Soundness Proof" msgstr "" -#: src/welcome-day-1.md src/welcome-day-1-afternoon.md src/welcome-day-2.md -#: src/welcome-day-2-afternoon.md src/welcome-day-3.md -#: src/welcome-day-3-afternoon.md src/welcome-day-4.md -#: src/welcome-day-4-afternoon.md -msgid "{{%session outline}}" +#: src/SUMMARY.md src/unsafe-deep-dive/rules-of-the-game/soundness-proof/soundness.md +msgid "Soundness" msgstr "" -#: src/welcome-day-1.md -msgid "Please remind the students that:" -msgstr "Veuillez rappeler aux élèves que :" +#: src/SUMMARY.md +msgid "Corollary" +msgstr "" -#: src/welcome-day-1.md +#: src/SUMMARY.md src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md #, fuzzy -msgid "" -"They should ask questions when they get them, don't save them to the end." +msgid "Unsoundness" +msgstr "Canaux illimités" + +#: src/SUMMARY.md src/unsafe-deep-dive/memory-lifecycle.md +msgid "Memory Lifecycle" msgstr "" -"Ils doivent poser des questions lorsqu'ils les reçoivent, ne les enregistrez " -"pas jusqu'à la fin." -#: src/welcome-day-1.md +#: src/SUMMARY.md src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +#: src/unsafe-deep-dive/initialization.md #, fuzzy -msgid "" -"The class is meant to be interactive and discussions are very much " -"encouraged!" +msgid "Initialization" +msgstr "Installation" + +#: src/SUMMARY.md src/unsafe-deep-dive/initialization/maybeuninit.md +msgid "MaybeUninit" msgstr "" -"Le cours se veut interactif et les discussions sont vivement encouragées !" -#: src/welcome-day-1.md -#, fuzzy -msgid "" -"As an instructor, you should try to keep the discussions relevant, i.e., " -"keep the discussions related to how Rust does things vs some other language. " -"It can be hard to find the right balance, but err on the side of allowing " -"discussions since they engage people much more than one-way communication." +#: src/SUMMARY.md +msgid "Arrays of uninit" msgstr "" -"En tant qu'instructeur, vous devez essayer de garder les discussions " -"pertinentes, c'est-à-dire, garder le lien avec la façon dont Rust fait les " -"choses par rapport à un autre langage. Ça peut être difficile de trouver le " -"bon équilibre, mais privilégiez les discussions car elles engagent les gens " -"bien plus que la communication à sens unique." -#: src/welcome-day-1.md -#, fuzzy -msgid "" -"The questions will likely mean that we talk about things ahead of the slides." +#: src/SUMMARY.md src/unsafe-deep-dive/initialization/maybeuninit/zeroed-method.md +msgid "MaybeUninit::zeroed()" msgstr "" -"Les questions signifieront probablement que nous parlons de choses avant les " -"diapositives." -#: src/welcome-day-1.md -#, fuzzy -msgid "" -"This is perfectly okay! Repetition is an important part of learning. " -"Remember that the slides are just a support and you are free to skip them as " -"you like." +#: src/SUMMARY.md +msgid "ptr::write vs assignment" msgstr "" -"C'est tout à fait correct! La répétition est une partie importante de " -"l'apprentissage. N'oubliez pas que les diapositives ne sont qu'un support et " -"que vous êtes libre de les sauter si vous le souhaitez." -#: src/welcome-day-1.md -msgid "" -"The idea for the first day is to show the \"basic\" things in Rust that " -"should have immediate parallels in other languages. The more advanced parts " -"of Rust come on the subsequent days." +#: src/SUMMARY.md +msgid "How to initialize memory" msgstr "" -#: src/welcome-day-1.md -msgid "" -"If you're teaching this in a classroom, this is a good place to go over the " -"schedule. Note that there is an exercise at the end of each segment, " -"followed by a break. Plan to cover the exercise solution after the break. " -"The times listed here are a suggestion in order to keep the course on " -"schedule. Feel free to be flexible and adjust as necessary!" +#: src/SUMMARY.md +msgid "Partial initialization" msgstr "" -#: src/hello-world.md src/types-and-values.md src/control-flow-basics.md -#: src/tuples-and-arrays.md src/references.md src/user-defined-types.md -#: src/pattern-matching.md src/methods-and-traits.md src/generics.md -#: src/std-types.md src/std-traits.md src/memory-management.md -#: src/smart-pointers.md src/borrowing.md src/lifetimes.md src/iterators.md -#: src/modules.md src/testing.md src/error-handling.md src/unsafe-rust.md -msgid "{{%segment outline}}" +#: src/SUMMARY.md src/unsafe-deep-dive/pinning.md +msgid "Pinning" msgstr "" -#: src/hello-world/what-is-rust.md -msgid "" -"Rust is a new programming language which had its [1.0 release in 2015]" -"(https://blog.rust-lang.org/2015/05/15/Rust-1.0.html):" +#: src/SUMMARY.md src/unsafe-deep-dive/pinning.md +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "What pinning is" msgstr "" -"Rust est un nouveau langage de programmation qui a eu sa [version 1.0 en " -"2015](https://blog.rust-lang.org/2015/05/15/Rust-1.0.html) :" -#: src/hello-world/what-is-rust.md -#, fuzzy -msgid "Rust is a statically compiled language in a similar role as C++" -msgstr "Rust est un langage compilé statiquement dans un rôle similaire à C++" +#: src/SUMMARY.md +msgid "What a move is" +msgstr "" -#: src/hello-world/what-is-rust.md -#, fuzzy -msgid "`rustc` uses LLVM as its backend." -msgstr "`rustc` utilise LLVM comme backend." +#: src/SUMMARY.md +msgid "Definition of Pin" +msgstr "" -#: src/hello-world/what-is-rust.md -#, fuzzy -msgid "" -"Rust supports many [platforms and architectures](https://doc.rust-lang.org/" -"nightly/rustc/platform-support.html):" +#: src/SUMMARY.md +msgid "Why it's difficult" msgstr "" -"Rust prend en charge de nombreuses [plates-formes et architectures](https://" -"doc.rust-lang.org/nightly/rustc/platform-support.html):" -#: src/hello-world/what-is-rust.md -#, fuzzy -msgid "x86, ARM, WebAssembly, ..." -msgstr "x86, ARM, WebAssembly, ... \\*Linux, Mac, Windows, ..." +#: src/SUMMARY.md +msgid "`Unpin` trait" +msgstr "" -#: src/hello-world/what-is-rust.md -#, fuzzy -msgid "Linux, Mac, Windows, ..." -msgstr "Rust est utilisé pour une large gamme d'appareils :" +#: src/SUMMARY.md +msgid "`PhantomPinned`" +msgstr "" -#: src/hello-world/what-is-rust.md -#, fuzzy -msgid "Rust is used for a wide range of devices:" -msgstr "firmware et chargeurs de démarrage," +#: src/SUMMARY.md src/unsafe-deep-dive/pinning.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "Self-Referential Buffer Example" +msgstr "" -#: src/hello-world/what-is-rust.md +#: src/SUMMARY.md #, fuzzy -msgid "firmware and boot loaders," -msgstr "écrans intelligents," +msgid "C++ implementation" +msgstr "Mise en œuvre des services" -#: src/hello-world/what-is-rust.md -#, fuzzy -msgid "smart displays," -msgstr "téléphones portables," +#: src/SUMMARY.md src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md +msgid "Modeled in Rust" +msgstr "" -#: src/hello-world/what-is-rust.md +#: src/SUMMARY.md src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +msgid "With a raw pointer" +msgstr "" + +#: src/SUMMARY.md +msgid "With an integer offset" +msgstr "" + +#: src/SUMMARY.md src/unsafe-deep-dive/pinning/self-referential-buffer/rust-pin.md +msgid "With `Pin`" +msgstr "" + +#: src/SUMMARY.md #, fuzzy -msgid "mobile phones," -msgstr "ordinateurs de bureau," +msgid "`Pin` and `Drop`" +msgstr "`Lire` et `Ecrire`" -#: src/hello-world/what-is-rust.md +#: src/SUMMARY.md #, fuzzy -msgid "desktops," -msgstr "serveurs." +msgid "Worked Example" +msgstr "Exemple" -#: src/hello-world/what-is-rust.md -msgid "servers." +#: src/SUMMARY.md src/unsafe-deep-dive/ffi.md +msgid "FFI" msgstr "" -#: src/hello-world/what-is-rust.md -msgid "Rust fits in the same area as C++:" -msgstr "Rust s'inscrit dans le même domaine que C++ :" +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/language-interop.md +msgid "Language Interop" +msgstr "" -#: src/hello-world/what-is-rust.md -msgid "High flexibility." -msgstr "Grande flexibilité." +#: src/SUMMARY.md +#, fuzzy +msgid "Strategies" +msgstr "caisses HAL" -#: src/hello-world/what-is-rust.md -msgid "High level of control." -msgstr "Haut niveau de contrôle." +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/type-safety.md +msgid "Consideration: Type Safety" +msgstr "" -#: src/hello-world/what-is-rust.md +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/language-differences.md #, fuzzy -msgid "" -"Can be scaled down to very constrained devices such as microcontrollers." -msgstr "" -"Peut être réduit à des appareils très limités comme les téléphones mobiles." +msgid "Language differences" +msgstr "Références" -#: src/hello-world/what-is-rust.md -msgid "Has no runtime or garbage collection." -msgstr "N'a pas de temps d'exécution ou de récupération d'ordures." +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/language-differences/representations.md +#, fuzzy +msgid "Different representations" +msgstr "expressions `si nous allons`" -#: src/hello-world/what-is-rust.md -msgid "Focuses on reliability and safety without sacrificing performance." +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/language-differences/semantics.md +#, fuzzy +msgid "Different semantics" +msgstr "Sémantique de déplacement" + +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Rust ↔ C" msgstr "" -"Se concentre sur la fiabilité et la sécurité sans sacrifier les performances." -#: src/hello-world/benefits.md -msgid "Some unique selling points of Rust:" -msgstr "Quelques arguments de vente uniques à Rust :" +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "C++ ↔ C" +msgstr "" -#: src/hello-world/benefits.md -msgid "" -"_Compile time memory safety_ - whole classes of memory bugs are prevented at " -"compile time" +#: src/SUMMARY.md src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Rust ↔ C++" msgstr "" -#: src/hello-world/benefits.md -msgid "No uninitialized variables." -msgstr "Aucune variable non initialisée." - -#: src/hello-world/benefits.md -msgid "No double-frees." -msgstr "Pas de double libération de mémoire." +#: src/SUMMARY.md +msgid "`abs(3)`" +msgstr "" -#: src/hello-world/benefits.md -msgid "No use-after-free." -msgstr "Aucune utilisation après la libération." +#: src/SUMMARY.md +msgid "`rand(3)`" +msgstr "" -#: src/hello-world/benefits.md -msgid "No `NULL` pointers." -msgstr "Pas de pointeurs `NULL`." +#: src/SUMMARY.md +#, fuzzy +msgid "Exercise:C library" +msgstr "Enveloppe FFI sécurisée" -#: src/hello-world/benefits.md -msgid "No forgotten locked mutexes." -msgstr "Pas de mutex verrouillés oubliés." +#: src/SUMMARY.md +#, fuzzy +msgid "Exercise: C++ library" +msgstr "Bibliothèque" -#: src/hello-world/benefits.md -msgid "No data races between threads." -msgstr "Pas de courses de données entre les threads." +#: src/SUMMARY.md +msgid "Final Words" +msgstr "Derniers mots" -#: src/hello-world/benefits.md -msgid "No iterator invalidation." -msgstr "Aucune invalidation d'itérateur." +#: src/SUMMARY.md src/thanks.md +msgid "Thanks!" +msgstr "Merci!" -#: src/hello-world/benefits.md -msgid "" -"_No undefined runtime behavior_ - what a Rust statement does is never left " -"unspecified" +#. Please keep { #glossary } untranslated. +#: src/SUMMARY.md src/glossary.md +msgid "Glossary" msgstr "" -#: src/hello-world/benefits.md -#, fuzzy -msgid "Array access is bounds checked." -msgstr "L'accès au tableau est vérifié dans les limites." +#: src/SUMMARY.md +msgid "Other Resources" +msgstr "Autres ressources" -#: src/hello-world/benefits.md -#, fuzzy -msgid "Integer overflow is defined (panic or wrap-around)." -msgstr "Le débordement d'entier est défini." +#: src/SUMMARY.md src/credits.md +msgid "Credits" +msgstr "Crédits" -#: src/hello-world/benefits.md +#: src/index.md +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) [![GitHub stars](https://img." +"shields.io/github/stars/google/comprehensive-rust?style=flat-square)](https://github.com/" +"google/comprehensive-rust/stargazers)" +msgstr "" +"[![Flux de construction](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) [![Contributeurs GitHub](https://" +"img.shields.io/github/contributors/google/comprehensive-rust?style=flat-square)](https://" +"github.com/google/comprehensive-rust/graphs/contributors) [![Étoiles GitHub](https://img." +"shields.io/github/stars/google/comprehensive-rust?style=flat-square)](https://github.com/" +"google/comprehensive-rust/stargazers)" + +#: src/index.md msgid "" -"_Modern language features_ - as expressive and ergonomic as higher-level " -"languages" +"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 "" +"Ce cours Rust gratuit a été développé par l'équipe Android de Google. Le cours couvre " +"l'ensemble du langage Rust, de la syntaxe de base aux sujets avancés comme les génériques " +"et la gestion des erreurs." -#: src/hello-world/benefits.md -#, fuzzy -msgid "Enums and pattern matching." -msgstr "Énumérations et filtrage par motif." +#: src/index.md +msgid "" +"The latest version of the course can be found at . If you are reading somewhere else, please check there for updates." +msgstr "" +"La version la plus à jour de ce cours se trouve à l'adresse suivante: . Si vous lisez ce cours depuis une autre adresse, " +"n'hésitez pas à suivre ce lien pour accéder à la dernière version." -#: src/hello-world/benefits.md -#, fuzzy -msgid "Generics." -msgstr "Génériques." +#: src/index.md +msgid "" +"The course is available in other languages. Select your preferred language in the top " +"right corner of the page or check the [Translations](running-the-course/translations.md) " +"page for a list of all available translations." +msgstr "" +"Ce cours est disponible dans d'autres langues. Sélectionnez votre langue préférée en haut " +"à droite de la page ou consultez la page [Traductions](running-the-course/translations." +"md) pour obtenir la liste de toutes les traductions disponibles." -#: src/hello-world/benefits.md -#, fuzzy -msgid "No overhead FFI." -msgstr "Pas de frais généraux FFI." +#: src/index.md +msgid "The course is also available [as a PDF](comprehensive-rust.pdf)." +msgstr "Ce cours est également disponible [au format PDF](comprehensive-rust.pdf)." -#: src/hello-world/benefits.md -#, fuzzy -msgid "Zero-cost abstractions." -msgstr "Abstractions à coût zéro." +#: src/index.md +msgid "" +"The goal of the course is to teach you Rust. We assume you don't know anything about Rust " +"and hope to:" +msgstr "" +"Le but du cours est de vous apprendre Rust. Nous supposons que vous découvrez ce langage " +"et espérons :" -#: src/hello-world/benefits.md -#, fuzzy -msgid "Great compiler errors." -msgstr "Grandes erreurs de compilation." +#: src/index.md +msgid "Give you a comprehensive understanding of the Rust syntax and language." +msgstr "Vous donner une compréhension complète de la syntaxe et du langage Rust." -#: src/hello-world/benefits.md -#, fuzzy -msgid "Built-in dependency manager." -msgstr "Gestionnaire de dépendances intégré." +#: src/index.md +msgid "Enable you to modify existing programs and write new programs in Rust." +msgstr "" +"Vous permettre de modifier des programmes existants et d'écrire de nouveaux programmes en " +"Rust." -#: src/hello-world/benefits.md -#, fuzzy -msgid "Built-in support for testing." -msgstr "Support intégré pour les tests." +#: src/index.md +msgid "Show you common Rust idioms." +msgstr "Vous montrer les constructions fréquentes (idiomes) en Rust." -#: src/hello-world/benefits.md -#, fuzzy -msgid "Excellent Language Server Protocol support." -msgstr "Excellente prise en charge du protocole de serveur de langue." +#: src/index.md +msgid "We call the first four course days Rust Fundamentals." +msgstr "Nous appelons les quatre premiers jours de ce cours les «Fondamentaux de Rust»." -#: src/hello-world/benefits.md -msgid "" -"Do not spend much time here. All of these points will be covered in more " -"depth later." +#: src/index.md +msgid "Building on this, you're invited to dive into one or more specialized topics:" msgstr "" +"Au-delà de ces quatre premiers jours de cours, nous vous invitons à approfondir un ou " +"plusieurs des sujets suivant:" -#: src/hello-world/benefits.md +#: src/index.md msgid "" -"Make sure to ask the class which languages they have experience with. " -"Depending on the answer you can highlight different features of Rust:" +"[Android](android.md): a half-day course on using Rust for Android platform development " +"(AOSP). This includes interoperability with C, C++, and Java." msgstr "" -"Assurez-vous de demander à la classe dans quels langages ils ont de " -"l'expérience. Selon la réponse, vous pouvez mettre en évidence différentes " -"fonctionnalités de Rust :" +"[Android](android.md): un cours d'une demi-journée consacré à l'utilisation de Rust dans " +"le cadre du développement pour la plate-forme Android. Ce cours couvre également " +"l'interopérabilité avec les langages C, C++ et Java." -#: src/hello-world/benefits.md +#: src/index.md msgid "" -"Experience with C or C++: Rust eliminates a whole class of _runtime errors_ " -"via the borrow checker. You get performance like in C and C++, but you don't " -"have the memory unsafety issues. In addition, you get a modern language with " -"constructs like pattern matching and built-in dependency management." +"[Chromium](chromium.md): a half-day course on using Rust in Chromium-based browsers. This " +"includes interoperability with C++ and how to include third-party crates in Chromium." msgstr "" -"Expérience avec C ou C++ : Rust élimine toute une classe d'_erreurs " -"d'exécution_ via le vérificateur d'emprunt. On obtient des performances " -"comme en C et C++, mais sans problèmes d'insécurité de la mémoire. De plus, " -"Rust est un langage moderne avec des constructions telles que le filtrage " -"par motif et la gestion intégrée des dépendances." +"[Chromium](chromium.md): un cours d'une demi-journée consacré à l'utilisation de Rust " +"dans le cadre du développement pour les navigateurs internet basés sur Chromium. Il " +"inclut l'interopérabilité avec le langage C++ et explique comment inclure des crates " +"tierces dans Chromium." -#: src/hello-world/benefits.md +#: src/index.md msgid "" -"Experience with Java, Go, Python, JavaScript...: You get the same memory " -"safety as in those languages, plus a similar high-level language feeling. In " -"addition you get fast and predictable performance like C and C++ (no garbage " -"collector) as well as access to low-level hardware (should you need it)" +"[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 "" -"Expérience avec Java, Go, Python, JavaScript... : On bénéficie de la même " -"sécurité mémoire que dans ces langages, plus un sentiment de langage de haut " -"niveau similaire. En outre on obtient des performances rapides et " -"prévisibles comme C et C++ (pas de ramassage d'ordures) ainsi que l'accès au " -"matériel de bas niveau (si l'on en a besoin)." +"[Bare-metal](bare-metal.md): un cours d'une journée consacré à l'utilisation de Rust pour " +"le développement embarqué. Le cours touche à la fois aux microcontrôleurs et aux " +"processeurs d'applications." -#: src/hello-world/playground.md +#: src/index.md msgid "" -"The [Rust Playground](https://play.rust-lang.org/) provides an easy way to " -"run short Rust programs, and is the basis for the examples and exercises in " -"this course. Try running the \"hello-world\" program it starts with. It " -"comes with a few handy features:" +"[Concurrency](concurrency/welcome.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 "" +"[Programmation concurrente](concurrency/welcome.md): un cours d'une journée consacré à la " +"programmation concurrente en Rust. Nous couvrons la concurrence classique (planification " +"à base de threads et mutex) ainsi que la concurrence async/await (multitâche coopératif à " +"base de _futures_)." -#: src/hello-world/playground.md +#: src/index.md +msgid "Non-Goals" +msgstr "Non-objectifs" + +#: src/index.md msgid "" -"Under \"Tools\", use the `rustfmt` option to format your code in the " -"\"standard\" way." +"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:" msgstr "" +"Rust est un vaste langage et nous ne pourrons pas tout couvrir en quelques jours. " +"Certains non-objectifs de ce cours sont :" -#: src/hello-world/playground.md +#: src/index.md msgid "" -"Rust has two main \"profiles\" for generating code: Debug (extra runtime " -"checks, less optimization) and Release (fewer runtime checks, lots of " -"optimization). These are accessible under \"Debug\" at the top." +"Learning how to develop macros: please see [the Rust Book](https://doc.rust-lang.org/" +"book/) and [Rust by Example](https://doc.rust-lang.org/rust-by-example/macros.html) " +"instead." msgstr "" +"Apprendre comment développer des macrosi : pour cela, nous vous invitons à consulter le " +"[Chapitre 19.5 dans le Rust Book](https://doc.rust-lang.org/book/ch19-06-macros.html) et " +"[Rust by Example](https://doc.rust-lang.org/rust-by-example/macros.html) (an anglais). " +"Vous pouvez également consulter [le Chapitre 19.5 dans la traduction non-officielle du " +"Rust Book](https://jimskapt.github.io/rust-book-fr/ch19-06-macros.html) en français." -#: src/hello-world/playground.md +#: src/index.md +msgid "Assumptions" +msgstr "Prérequis" + +#: src/index.md msgid "" -"If you're interested, use \"ASM\" under \"...\" to see the generated " -"assembly code." +"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 C++ to better explain or " +"contrast the Rust approach." msgstr "" +"Le cours suppose que vous savez déjà programmer. Rust est un langage statiquement typé et " +"nous ferons parfois des comparaisons avec C et C++ pour mieux expliquer ou contraster " +"l'approche de Rust." -#: src/hello-world/playground.md +#: src/index.md msgid "" -"As students head into the break, encourage them to open up the playground " -"and experiment a little. Encourage them to keep the tab open and try things " -"out during the rest of the course. This is particularly helpful for advanced " -"students who want to know more about Rust's optimizations or generated " -"assembly." +"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 "" +"Si vous savez programmer dans un langage à typage dynamique tel que Python ou JavaScript, " +"vous pourrez également suivre ce cours sans problème." -#: src/types-and-values/hello-world.md +#: src/index.md msgid "" -"Let us jump into the simplest possible Rust program, a classic Hello World " -"program:" +"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 should cover as well as " +"answers to typical questions which come up in class." msgstr "" -"Passons au programme Rust le plus simple possible, un Bonjour Monde " -"classique programme:" +"Ceci est un exemple de _note du formateur_. Nous les utiliserons pour ajouter d'autres " +"informations sur les diapositives. Cela pourrait être des points clés que l'instructeur " +"devrait couvrir, ainsi que des réponses aux questions typiques posées en classe." -#: src/types-and-values/hello-world.md -msgid "\"Hello 🌍!\"" +#: src/running-the-course.md src/running-the-course/course-structure.md +msgid "This page is for the course instructor." +msgstr "Cette page est destinée au formateur." + +#: src/running-the-course.md +msgid "" +"Here is a bit of background information about how we've been running the course " +"internally at Google." msgstr "" +"Voici quelques informations générales sur la façon dont nous avons organisé le cours en " +"interne chez Google." -#: src/types-and-values/hello-world.md -msgid "What you see:" -msgstr "Ce que tu vois:" +#: src/running-the-course.md +msgid "" +"We typically run classes from 9:00 am to 4:00 pm, with a 1 hour lunch break in the " +"middle. This leaves 3 hours for the morning class and 3 hours for the afternoon class. " +"Both sessions contain multiple breaks and time for students to work on exercises." +msgstr "" +"En général les classes sont organisées de 9 heures à 16 heures, avec une pause déjeuner " +"d'une heure, soit trois heures de cours le matin et trois heures l'après-midi. La session " +"du matin comme celle de l'après-midi comportent plusieurs pauses ainsi que du temps " +"consacré aux exercices." -#: src/types-and-values/hello-world.md -msgid "Functions are introduced with `fn`." -msgstr "Les fonctions sont introduites avec `fn`." +#: src/running-the-course.md +msgid "Before you run the course, you will want to:" +msgstr "Avant de présenter le cours, nous vous recommandons les choses suivantes :" -#: src/types-and-values/hello-world.md -msgid "Blocks are delimited by curly braces like in C and C++." -msgstr "Les blocs sont délimités par des accolades comme en C et C++." +#: src/running-the-course.md +msgid "" +"Make yourself familiar with the course material. We've included speaker notes to help " +"highlight the key points (please help us by contributing more speaker notes!). When " +"presenting, you should make sure to open the speaker notes in a popup (click the link " +"with a little arrow next to \"Speaker Notes\"). This way you have a clean screen to " +"present to the class." +msgstr "" +"Familiarisez-vous avec le cours. Nous avons inclus les _notes du formateur_ afin de " +"mettre les points clés en évidence (n'hésitez pas à nous proposer des notes " +"supplémentaires !). Lors de la présentation, vous devez vous assurer d'ouvrir les notes " +"du formateur dans une popup (cliquez sur le lien avec une petite flèche à côté de _Notes " +"du Formateur_ (_Speaker Notes_)). De cette façon, vous affichez le cours sans les notes à " +"la classe, et pouvez suivre les notes séparément." -#: src/types-and-values/hello-world.md -msgid "The `main` function is the entry point of the program." -msgstr "La fonction `main` est le point d'entrée du programme." +#: src/running-the-course.md +msgid "" +"Decide on the dates. Since the course takes four days, we recommend that you schedule the " +"days over two weeks. Course participants have said that they find it helpful to have a " +"gap in the course since it helps them process all the information we give them." +msgstr "" +"Décidez des dates de la classe en avance. Étant donné que le cours dure quatre jours " +"complets, nous vous recommandons de programmer les jours de classe sur un intervalle de " +"deux semaines. Les participants aux classes précédentes ont en effet indiqué qu'il est " +"utile d'espacer les jours de classe afin de mieux absorber le contenu." -#: src/types-and-values/hello-world.md -msgid "Rust has hygienic macros, `println!` is an example of this." -msgstr "Rust a des macros hygiéniques, `println!` en est un exemple." +#: src/running-the-course.md +msgid "" +"Find a room large enough for your in-person participants. We recommend a class size of " +"15-25 people. That's small enough that people are comfortable asking questions --- it's " +"also small enough that one instructor will have time to answer the questions. Make sure " +"the room has _desks_ for yourself and for the students: you will all need to be able to " +"sit and work with your laptops. In particular, you will be doing significant live-coding " +"as an instructor, so a lectern won't be very helpful for you." +msgstr "" +"Trouvez une salle suffisamment grande pour que tous les participants puissent suivre en " +"personne. Nous recommandons que le nombre de participants soit de 15 à 20 personnes. Cela " +"constitue un groupe suffisamment petit pour que les gens soient à l'aise pour poser des " +"questions --- c'est aussi assez petit pour qu'un instructeur ait le temps de répondre aux " +"questions. Assurez-vous que la salle dispose de _bureaux_ pour vous et pour les " +"étudiants : vous devriez tous pouvoir vous assoir et travailler avec vos ordinateurs " +"portables. En particulier, vous serez amené à faire beaucoup de programmation en direct " +"en tant qu'instructeur, donc un simple pupitre ne serait pas très pratique pour vous." -#: src/types-and-values/hello-world.md -msgid "Rust strings are UTF-8 encoded and can contain any Unicode character." +#: src/running-the-course.md +msgid "" +"On the day of your course, show up to the room a little early to set things up. We " +"recommend presenting directly using `mdbook serve` running on your laptop (see the " +"[installation instructions](https://github.com/google/comprehensive-rust#building)). This " +"ensures optimal performance with no lag as you change pages. Using your laptop will also " +"allow you to fix typos as you or the course participants spot them." msgstr "" -"Les strings Rust sont encodées en UTF-8 et peuvent contenir n'importe quel " -"caractère Unicode." +"Les jours de classe, prévoyez d'arriver en avance afin de préparer la salle. Nous vous " +"recommandons de présenter directement en utilisant `mdbook serve` exécuté sur votre " +"ordinateur portable (voir les [instructions d'installation](https://github.com/google/" +"comprehensive-rust#building)). Cela garantit des performances optimales sans " +"ralentissement lorsque vous changez de page. L'utilisation de votre ordinateur portable " +"vous permettra également de corriger les éventuelles fautes de frappe." -#: src/types-and-values/hello-world.md -#, fuzzy +#: src/running-the-course.md 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 " -"familiar." +"Let people solve the exercises by themselves or in small groups. We typically spend 30-45 " +"minutes on exercises in the morning and in the afternoon (including time to review the " +"solutions). Make sure to ask people if they're stuck or if there is anything you can help " +"with. When you see that several people have the same problem, call it out to the class " +"and offer a solution, e.g., by showing people where to find the relevant information in " +"the standard library." msgstr "" -"Cette diapositive tente de mettre les étudiants à l'aise avec le code Rust. " -"Ils en verront une tonne durant les quatre prochains jours, alors nous " -"commençons petit avec quelque chose de familier." +"Laissez les participants résoudre les exercices seuls ou en petits groupes. En général " +"nous consacrons 30 à 45 minutes aux exercices le matin et l'après-midi (y compris pour " +"discuter les solutions). Assurez-vous de demander aux gens s'ils sont bloqués ou si vous " +"pouvez les aider. Si vous constatez que plusieurs personnes font face au même problème, " +"partagez-le avec la classe et proposez une solution, par exemple en montrant aux " +"participants où trouver les informations pertinentes dans la bibliothèque standard." -#: src/types-and-values/hello-world.md -#, fuzzy +#: src/running-the-course.md msgid "" -"Rust is very much like other languages in the C/C++/Java tradition. It is " -"imperative and it doesn't try to reinvent things unless absolutely necessary." +"That is all, good luck running the course! We hope it will be as much fun for you as it " +"has been for us!" msgstr "" -"Rust ressemble beaucoup aux autres langages traditionnels C/C++/Java. C'est " -"impératif (non fonctionnel) et il n'essaie pas de réinventer les choses à " -"moins qu'absolument nécessaire." +"C'est tout, bonne chance pour la présentation du cours ! Nous espérons que vous y " +"prendrez autant de plaisir que nous_!" -#: src/types-and-values/hello-world.md -#, fuzzy -msgid "Rust is modern with full support for things like Unicode." +#: src/running-the-course.md +msgid "" +"Please [provide feedback](https://github.com/google/comprehensive-rust/discussions/86) " +"afterwards so that we can keep improving the course. We would love to hear what worked " +"well for you and what can be made better. Your students are also very welcome to [send us " +"feedback](https://github.com/google/comprehensive-rust/discussions/100)!" msgstr "" -"Rust est moderne avec un support complet pour des choses comme Unicode." +"Nous vous demandons de bien vouloir [fournir des commentaires](https://github.com/google/" +"comprehensive-rust/discussions/86) par la suite afin que nous puissions continuer " +"d'améliorer le cours. Nous aimerions savoir ce qui a bien fonctionné pour vous et ce qui " +"pourrait être amélioré. Vos élèves peuvent également [envoyer des commentaires](https://" +"github.com/google/comprehensive-rust/discussions/100). Merci !" -#: src/types-and-values/hello-world.md -#, fuzzy +#: src/running-the-course.md +msgid "Instructor Preparation" +msgstr "Instructions de préparation" + +#: src/running-the-course.md msgid "" -"Rust uses macros for situations where you want to have a variable number of " -"arguments (no function [overloading](../control-flow-basics/functions.md))." +"**Go through all the material:** Before teaching the course, make sure you have gone " +"through all the slides and exercises yourself. This will help you anticipate questions " +"and potential difficulties." msgstr "" -"Rust utilise des macros pour les situations où vous souhaitez avoir un " -"nombre variable d'arguments (pas de fonction [surchargées](basic-syntax/" -"functions-interlude.md))." +"**Parcourez le cours :** Avant d'enseigner le cours, soyez sûrs que vous avez parcouru " +"toutes les diapositives et les exercices vous-même. Cela vous aidera à anticiper les " +"questions et difficultés potentielles." -#: src/types-and-values/hello-world.md -#, fuzzy +#: src/running-the-course.md msgid "" -"Macros being 'hygienic' means they don't accidentally capture identifiers " -"from the scope they are used in. Rust macros are actually only [partially " -"hygienic](https://veykril.github.io/tlborm/decl-macros/minutiae/hygiene." -"html)." +"**Prepare for live coding:** The course involves significant live coding. Practice the " +"examples and exercises beforehand to ensure you can type them out smoothly during the " +"class. Have the solutions ready in case you get stuck." msgstr "" -"Les macros étant \"hygiéniques\", elles ne capturent pas accidentellement " -"les identifiants de la portée dans laquelle elles sont utilisées. Les macros " -"Rust ne sont en fait que [partiellement hygiénique](https://veykril.github." -"io/tlborm/decl-macros/minutiae/hygiene.html)." +"**Préparez-vous à la programmation en direct :** Ce cours comprend de nombreuses séances " +"de programmation en direct. Entraînez-vous à l’avance sur les exemples et les exercices " +"afin de pouvoir les retranscrire facilement pendant le cours. Préparez les solutions au " +"cas où vous rencontreriez des difficultés." -#: src/types-and-values/hello-world.md +#: src/running-the-course.md 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)." +"**Familiarize yourself with `mdbook`:** The course is presented using `mdbook`. Knowing " +"how to navigate, search, and use its features will make the presentation smoother." msgstr "" +"**Familiarisez-vous avec `mdbook` :** Ce cours est présenté à l’aide de `mdbook`. Savoir " +"naviguer, effectuer des recherches et utiliser ses fonctionnalités facilitera le " +"déroulement du cours." -#: src/types-and-values/variables.md -#, fuzzy +#: src/running-the-course.md msgid "" -"Rust provides type safety via static typing. Variable bindings are made with " -"`let`:" +"**Slice size helper:** Press Ctrl + Alt + B to toggle a " +"visual guide showing the amount of space available when presenting. Expect any content " +"outside of the red box to be hidden initially. Use this as a guide when editing slides. " +"You can also [enable it via this link](?show-red-box=true)." msgstr "" -"Rust fournit une sécurité de type via le typage statique. Les liaisons " -"variables sont immuables par défaut:" +"**Aide au format des diapositives :** Appuyez sur Ctrl + Alt + B pour afficher un repère " +"visuel indiquant l’espace disponible lors de la présentation. Tout contenu situé en " +"dehors du cadre rouge sera initialement masqué. Utilisez ce repère lors de la " +"modification des diapositives. Vous pouvez également [l’activer via ce lien](?show-red-" +"box=true)." -#: src/types-and-values/variables.md src/control-flow-basics/loops/for.md -#: src/control-flow-basics/blocks-and-scopes.md -msgid "\"x: {x}\"" -msgstr "" +#: src/running-the-course.md +msgid "Creating a Good Learning Environment" +msgstr "Créer un environnement d'apprentissage favorable" -#: src/types-and-values/variables.md +#: src/running-the-course.md msgid "" -"// x = 20;\n" -" // println!(\"x: {x}\");\n" +"**Encourage questions:** Reiterate that there are no \"stupid\" questions. A welcoming " +"atmosphere for questions is crucial for learning." msgstr "" +"**Encouragez les questions :** Rappelez qu’il n’y a pas de questions « stupides ». Un " +"climat propice aux questions est essentiel à l’apprentissage." -#: src/types-and-values/variables.md +#: src/running-the-course.md msgid "" -"Uncomment the `x = 20` to demonstrate that variables are immutable by " -"default. Add the `mut` keyword to allow changes." +"**Manage time effectively:** Keep an eye on the schedule, but be flexible. It's more " +"important that students understand the concepts than sticking rigidly to the timeline." msgstr "" +"**Gérer efficacement son temps :** Respectez l’horaire, mais restez flexible. Il est plus " +"important que les élèves comprennent les concepts que de suivre un calendrier rigide." -#: src/types-and-values/variables.md +#: src/running-the-course.md msgid "" -"The `i32` here is the type of the variable. This must be known at compile " -"time, but type inference (covered later) allows the programmer to omit it in " -"many cases." +"**Facilitate group work:** During exercises, encourage students to work together. This " +"can help them learn from each other and feel less stuck." msgstr "" +"**Faciliter le travail de groupe :** Pendant les exercices, encouragez les élèves à " +"travailler ensemble. Cela peut les aider à apprendre les uns des autres et à se sentir " +"moins bloqués." -#: src/types-and-values/values.md +#: src/running-the-course/course-structure.md +msgid "Rust Fundamentals" +msgstr "Fondamentaux de Rust" + +#: src/running-the-course/course-structure.md msgid "" -"Here are some basic built-in types, and the syntax for literal values of " -"each type." +"The first four days make up [Rust Fundamentals](../welcome-day-1.md). The days are fast-" +"paced and we cover a broad range of topics!" msgstr "" +"Les quatre premiers jours constituent les [Fondamentaux de Rust](../welcome-day-1.md). Le " +"rythme est soutenu et nous couvrons beaucoup de sujets !" -#: src/types-and-values/values.md src/unsafe-rust/exercise.md -#, fuzzy -msgid "Types" -msgstr "Types" +#: src/running-the-course/course-structure.md +msgid "Course schedule:" +msgstr "Structure du cours :" -#: src/types-and-values/values.md -#, fuzzy -msgid "Literals" -msgstr "Littéraux" +#: src/running-the-course/course-structure.md +msgid "Day 1 Morning (2 hours and 10 minutes, including breaks)" +msgstr "Jour 1 Matin (2 heures et 10 minutes, pauses comprises)" + +#: src/running-the-course/course-structure.md src/welcome-day-1.md +#: src/welcome-day-1-afternoon.md src/welcome-day-2.md src/welcome-day-2-afternoon.md +#: src/welcome-day-3.md src/welcome-day-3-afternoon.md src/welcome-day-4.md +#: src/welcome-day-4-afternoon.md src/concurrency/welcome.md +#: src/concurrency/welcome-async.md src/idiomatic/welcome.md +msgid "Segment" +msgstr "Segment" + +#: src/running-the-course/course-structure.md src/welcome-day-1.md src/hello-world.md +#: src/types-and-values.md src/control-flow-basics.md src/welcome-day-1-afternoon.md +#: src/tuples-and-arrays.md src/references.md src/user-defined-types.md src/welcome-day-2.md +#: src/pattern-matching.md src/methods-and-traits.md src/generics.md +#: src/welcome-day-2-afternoon.md src/closures.md src/std-types.md src/std-traits.md +#: src/welcome-day-3.md src/memory-management.md src/smart-pointers.md +#: src/welcome-day-3-afternoon.md src/borrowing.md src/lifetimes.md src/welcome-day-4.md +#: src/iterators.md src/modules.md src/testing.md src/welcome-day-4-afternoon.md +#: src/error-handling.md src/unsafe-rust.md src/concurrency/welcome.md +#: src/concurrency/threads.md src/concurrency/channels.md src/concurrency/send-sync.md +#: src/concurrency/shared-state.md src/concurrency/sync-exercises.md +#: src/concurrency/welcome-async.md src/concurrency/async.md +#: src/concurrency/async-control-flow.md src/concurrency/async-pitfalls.md +#: src/concurrency/async-exercises.md src/idiomatic/welcome.md +#: src/idiomatic/foundations-api-design.md src/idiomatic/leveraging-the-type-system.md +#: src/unsafe-deep-dive/introduction.md src/unsafe-deep-dive/pinning.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "Duration" +msgstr "Durée" + +#: src/running-the-course/course-structure.md src/welcome-day-1.md src/types-and-values.md +#: src/control-flow-basics.md src/tuples-and-arrays.md src/references.md +#: src/user-defined-types.md src/pattern-matching.md src/generics.md src/closures.md +#: src/std-types.md src/std-traits.md src/memory-management.md src/smart-pointers.md +#: src/lifetimes.md src/iterators.md src/modules.md src/testing.md src/error-handling.md +#: src/unsafe-rust.md src/concurrency/shared-state.md src/concurrency/async-control-flow.md +#: src/concurrency/async-pitfalls.md src/idiomatic/leveraging-the-type-system.md +#: src/unsafe-deep-dive/introduction.md src/unsafe-deep-dive/pinning.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "5 minutes" +msgstr "5 minutes" + +#: src/running-the-course/course-structure.md src/welcome-day-1.md src/types-and-values.md +#: src/control-flow-basics.md src/tuples-and-arrays.md src/user-defined-types.md +#: src/pattern-matching.md src/methods-and-traits.md src/modules.md src/unsafe-rust.md +#: src/concurrency/welcome.md src/concurrency/threads.md src/concurrency/shared-state.md +#: src/unsafe-deep-dive/introduction.md src/unsafe-deep-dive/pinning.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "15 minutes" +msgstr "15 minutes" + +#: src/running-the-course/course-structure.md src/welcome-day-1.md src/borrowing.md +#: src/concurrency/welcome-async.md +msgid "40 minutes" +msgstr "40 minutes" + +#: src/running-the-course/course-structure.md src/welcome-day-1.md src/welcome-day-2.md +#: src/welcome-day-4.md +msgid "45 minutes" +msgstr "45 minutes" -#: src/types-and-values/values.md -#, fuzzy -msgid "Signed integers" -msgstr "Entiers signés" +#: src/running-the-course/course-structure.md +msgid "Day 1 Afternoon (2 hours and 45 minutes, including breaks)" +msgstr "Jour 1 Après-midi (2 heures et 45 minutes, pauses comprises)" -#: src/types-and-values/values.md -#, fuzzy -msgid "`i8`, `i16`, `i32`, `i64`, `i128`, `isize`" -msgstr "`i8`, `i16`, `i32`, `i64`, `i128`, `isize`" +#: src/running-the-course/course-structure.md src/welcome-day-1-afternoon.md +msgid "35 minutes" +msgstr "35min" -#: src/types-and-values/values.md -#, fuzzy -msgid "`-10`, `0`, `1_000`, `123_i64`" -msgstr "`-10`, `0`, `1_000`, `123i64`" +#: src/running-the-course/course-structure.md src/welcome-day-1-afternoon.md +#: src/welcome-day-3.md src/welcome-day-4.md src/welcome-day-4-afternoon.md +#: src/concurrency/welcome-async.md +msgid "55 minutes" +msgstr "55min" -#: src/types-and-values/values.md -#, fuzzy -msgid "Unsigned integers" -msgstr "Entiers non signés" +#: src/running-the-course/course-structure.md src/welcome-day-1-afternoon.md +#: src/welcome-day-2-afternoon.md src/welcome-day-3.md +msgid "1 hour" +msgstr "1h" -#: src/types-and-values/values.md -#, fuzzy -msgid "`u8`, `u16`, `u32`, `u64`, `u128`, `usize`" -msgstr "`u8`, `u16`, `u32`, `u64`, `u128`, `usize`" +#: src/running-the-course/course-structure.md +msgid "Day 2 Morning (2 hours and 50 minutes, including breaks)" +msgstr "Jour 2 Matin (2 heures et 50 minutes, pauses comprises)" + +#: src/running-the-course/course-structure.md src/hello-world.md src/types-and-values.md +#: src/control-flow-basics.md src/tuples-and-arrays.md src/references.md +#: src/welcome-day-2.md src/methods-and-traits.md src/closures.md src/std-types.md +#: src/welcome-day-3.md src/borrowing.md src/lifetimes.md src/welcome-day-4.md +#: src/iterators.md src/modules.md src/testing.md src/error-handling.md +#: src/unsafe-deep-dive/introduction.md +msgid "3 minutes" +msgstr "3 minutes" + +#: src/running-the-course/course-structure.md src/welcome-day-2.md +#: src/unsafe-deep-dive/pinning.md src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "50 minutes" +msgstr "50 minutes" -#: src/types-and-values/values.md -#, fuzzy -msgid "`0`, `123`, `10_u16`" -msgstr "`0`, `123`, `10u16`" +#: src/running-the-course/course-structure.md +msgid "Day 2 Afternoon (2 hours and 50 minutes, including breaks)" +msgstr "Jour 2 Après-midi (2 heures et 50 minutes, pauses comprises)" -#: src/types-and-values/values.md -#, fuzzy -msgid "Floating point numbers" -msgstr "Nombres à virgule flottante" +#: src/running-the-course/course-structure.md src/welcome-day-2-afternoon.md +#: src/std-traits.md src/smart-pointers.md src/lifetimes.md src/iterators.md src/testing.md +#: src/unsafe-rust.md src/concurrency/welcome.md src/concurrency/sync-exercises.md +#: src/concurrency/async-exercises.md +msgid "30 minutes" +msgstr "30 minutes" -#: src/types-and-values/values.md -#, fuzzy -msgid "`f32`, `f64`" -msgstr "`f32`, `f64`" +#: src/running-the-course/course-structure.md +msgid "Day 3 Morning (2 hours and 20 minutes, including breaks)" +msgstr "Jour 3 Matin (2 heures et 20 minutes, pauses comprises)" -#: src/types-and-values/values.md -#, fuzzy -msgid "`3.14`, `-10.0e20`, `2_f32`" -msgstr "`3.14`, `-10.0e20`, `2f32`" +#: src/running-the-course/course-structure.md +msgid "Day 3 Afternoon (2 hours and 30 minutes, including breaks)" +msgstr "Jour 3 Après-midi (2 heures et 30 minutes, pauses comprises)" -#: src/types-and-values/values.md -#, fuzzy -msgid "Unicode scalar values" -msgstr "Valeurs scalaires Unicode" +#: src/running-the-course/course-structure.md src/welcome-day-3-afternoon.md +#: src/welcome-day-4-afternoon.md +msgid "1 hour and 15 minutes" +msgstr "1h15" -#: src/types-and-values/values.md src/android/aidl/types/primitives.md -#, fuzzy -msgid "`char`" -msgstr "`car`" +#: src/running-the-course/course-structure.md src/welcome-day-3-afternoon.md +#: src/idiomatic/leveraging-the-type-system.md +msgid "1 hour and 5 minutes" +msgstr "1h05" -#: src/types-and-values/values.md -#, fuzzy -msgid "`'a'`, `'α'`, `'∞'`" -msgstr "`'a'`, `'α'`, `'∞'`" +#: src/running-the-course/course-structure.md +msgid "Day 4 Morning (2 hours and 50 minutes, including breaks)" +msgstr "Jour 4 Matin (2 heures et 50 minutes, pauses comprises)" -#: src/types-and-values/values.md -#, fuzzy -msgid "Booleans" -msgstr "Chaînes d'octets" +#: src/running-the-course/course-structure.md +msgid "Day 4 Afternoon (2 hours and 20 minutes, including breaks)" +msgstr "Jour 4 Après-midi (2 heures et 20 minutes, pauses comprises)" -#: src/types-and-values/values.md src/android/aidl/types/primitives.md -#, fuzzy -msgid "`bool`" -msgstr "`&[u8]`" +#: src/running-the-course/course-structure.md +msgid "Deep Dives" +msgstr "Approfondissements" -#: src/types-and-values/values.md -#, fuzzy -msgid "`true`, `false`" +#: src/running-the-course/course-structure.md +msgid "" +"In addition to the 4-day class on Rust Fundamentals, we cover some more specialized " +"topics:" msgstr "" -"`b\"abc\"`, `br#\" \" \"#`\n" -"\n" -"Booléens\n" -"\n" -"`bool`\n" -"\n" -"'vrai', 'faux'" +"Au delà des quatre jours portant sur les Fondamentaux de Rust, nous couvrons également " +"des sujets spécifiques:" -#: src/types-and-values/values.md -#, fuzzy -msgid "The types have widths as follows:" -msgstr "Les types ont des largeurs comme suit :" +#: src/running-the-course/course-structure.md +msgid "Rust in Android" +msgstr "Rust pour Android" -#: src/types-and-values/values.md -#, fuzzy -msgid "`iN`, `uN`, and `fN` are _N_ bits wide," -msgstr "`iN`, `uN` et `fN` ont une largeur de _N_ bits," +#: src/running-the-course/course-structure.md +msgid "" +"The [Rust in Android](../android.md) deep dive is a half-day course on using Rust for " +"Android platform development. This includes interoperability with C, C++, and Java." +msgstr "" +"[Rust pour Android](../android.md) est un cours d'une demi-journée consacré à " +"l'utilisation de Rust dans le cadre du développement pour la plate-forme Android. Ce " +"cours couvre également l'interopérabilité avec les langages C, C++ et Java." -#: src/types-and-values/values.md -#, fuzzy -msgid "`isize` and `usize` are the width of a pointer," -msgstr "`isize` et `usize` sont la largeur d'un pointeur," +#: src/running-the-course/course-structure.md +msgid "" +"You will need an [AOSP checkout](https://source.android.com/docs/setup/download/" +"downloading). Make a checkout of the [course repository](https://github.com/google/" +"comprehensive-rust) on the same machine and move the `src/android/` directory into the " +"root of your AOSP checkout. This will ensure that the Android build system sees the " +"`Android.bp` files in `src/android/`." +msgstr "" +"Vous aurez besoin d'un [AOSP checkout](https://source.android.com/docs/setup/download/" +"downloading). Effectuez un checkout du [répertoire du cours](https://github.com/google/" +"comprehensive-rust) sur la même machine et déplacez le dossier `src/android/` à la racine " +"de votre checkout AOSP. Cela assurera que le système de construction d'Android a accès " +"aux fichiers `Android.bp` dans `src/android/`." -#: src/types-and-values/values.md -#, fuzzy -msgid "`char` is 32 bits wide," -msgstr "`char` a une largeur de 32 bits," +#: src/running-the-course/course-structure.md +msgid "" +"Ensure that `adb sync` works with your emulator or real device and pre-build all Android " +"examples using `src/android/build_all.sh`. Read the script to see the commands it runs " +"and make sure they work when you run them by hand." +msgstr "" +"Assurez-vous que `adb sync` fonctionne avec votre émulateur ou votre appareil réel et pré-" +"construisez tous les exemples Android en utilisant `src/android/build_all.sh`. Lisez le " +"script pour voir les commandes éxécutées et assurez-vous qu'elles fonctionnent lorsque " +"vous les exécutez à la main." -#: src/types-and-values/values.md -#, fuzzy -msgid "`bool` is 8 bits wide." -msgstr "`bool` a une largeur de 8 bits." +#: src/running-the-course/course-structure.md +msgid "Rust in Chromium" +msgstr "Rust pour Chromium" -#: src/types-and-values/values.md -msgid "There are a few syntaxes which are not shown above:" +#: src/running-the-course/course-structure.md +msgid "" +"The [Rust in Chromium](../chromium.md) deep dive is a half-day course on using Rust as " +"part of the Chromium browser. It includes using Rust in Chromium's `gn` build system, " +"bringing in third-party libraries (\"crates\") and C++ interoperability." msgstr "" +"Le cours [Rust pour Chromium](../chromium.md) dure une demi-journée et explore " +"l'utilisation de Rust pour le navigateur Chromium. Il couvre l'utilisation de Rust au " +"sein du système de compilation `gn` de Chromium, l'intégration de bibliothèques tierces " +"(\"crates\") et l'interopérabilité avec C++." -#: src/types-and-values/values.md +#: src/running-the-course/course-structure.md 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`." +"You will need to be able to build Chromium --- a debug, component build is [recommended]" +"(../chromium/setup.md) for speed but any build will work. Ensure that you can run the " +"Chromium browser that you've built." msgstr "" +"Vous aurez besoin de pouvoir compiler Chromium --- une compilation debug par composant " +"est [recommandée](../chromium/setup.md) pour pouvoir effectuer des itérations de " +"développement plus rapidement. Assurez-vous que vous pouvez lancer le navigateur Chromium " +"que vous avez compilé." -#: src/types-and-values/arithmetic.md -msgid "\"result: {}\"" +#: src/running-the-course/course-structure.md +msgid "Bare-Metal Rust" +msgstr "Bare-Metal Rust" + +#: src/running-the-course/course-structure.md +msgid "" +"The [Bare-Metal Rust](../bare-metal.md) deep dive is a full day class on using Rust for " +"bare-metal (embedded) development. Both microcontrollers and application processors are " +"covered." msgstr "" +"[Bare-metal Rust](../bare-metal.md) est un cours d'une journée consacré à l'utilisation " +"de Rust pour le développement embarqué. Le cours touche à la fois aux microcontrôleurs et " +"aux processeurs d'applications." -#: src/types-and-values/arithmetic.md +#: src/running-the-course/course-structure.md msgid "" -"This is the first time we've seen a function other than `main`, but the " -"meaning should be clear: it takes three integers, and returns an integer. " -"Functions will be covered in more detail later." +"For the microcontroller part, you will need to buy the [BBC micro:bit](https://microbit." +"org/) v2 development board ahead of time. Everybody will need to install a number of " +"packages as described on the [welcome page](../bare-metal.md)." msgstr "" +"Pour la partie microcontrôleurs, vous devrez acheter la carte de développement [BBC micro:" +"bit](https://microbit.org/) v2 avant de commencer.\n" +"Tous les participants à ce cours devront installer les paquets listés sur [la page de " +"bienvenue](../bare-metal.md) du cours." -#: src/types-and-values/arithmetic.md -msgid "Arithmetic is very similar to other languages, with similar precedence." +#: src/running-the-course/course-structure.md +msgid "Concurrency in Rust" +msgstr "Programmation concurrente en Rust" + +#: src/running-the-course/course-structure.md +msgid "" +"The [Concurrency in Rust](../concurrency/welcome.md) deep dive is a full day class on " +"classical as well as `async`/`await` concurrency." msgstr "" +"[La programmation concurrente en Rust](../concurrency/welcome.md) est un cours d'une " +"journée portant sur la programmation concurrente classique ainsi que `async`/`await`." -#: src/types-and-values/arithmetic.md +#: src/running-the-course/course-structure.md msgid "" -"What about integer overflow? In C and C++ overflow of _signed_ integers is " -"actually undefined, and might do different things on different platforms or " -"compilers. In Rust, it's defined." +"You will need a fresh crate set up and the dependencies downloaded and ready to go. You " +"can then copy/paste the examples into `src/main.rs` to experiment with them:" msgstr "" +"Il faudra que vous ayez préparé une crate à jour et que vous ayez téléchargé et installé " +"les dépendances. Vous pourrez ensuite copier/coller les exemples dans `src/main.rs` et " +"les modifier:" -#: src/types-and-values/arithmetic.md +#: src/running-the-course/course-structure.md +msgid "Morning (3 hours and 20 minutes, including breaks)" +msgstr "Matin (3h20, avec les pauses)" + +#: src/running-the-course/course-structure.md src/references.md src/std-types.md +#: src/memory-management.md src/error-handling.md src/concurrency/welcome.md +#: src/concurrency/sync-exercises.md src/concurrency/welcome-async.md +#: src/concurrency/async-pitfalls.md src/concurrency/async-exercises.md +#: src/idiomatic/leveraging-the-type-system.md +msgid "20 minutes" +msgstr "20 minutes" + +#: src/running-the-course/course-structure.md src/concurrency/welcome.md +msgid "Send and Sync" +msgstr "`Send` et `Sync`" + +#: src/running-the-course/course-structure.md src/concurrency/welcome.md +#: src/concurrency/welcome-async.md +msgid "1 hour and 10 minutes" +msgstr "1h10" + +#: src/running-the-course/course-structure.md +msgid "Afternoon (3 hours and 30 minutes, including breaks)" +msgstr "Après-midi (3h30, avec les pauses)" + +#: src/running-the-course/course-structure.md msgid "" -"Change the `i32`'s to `i16` to see an integer overflow, which panics " -"(checked) in a debug build and wraps in a release build. There are other " -"options, such as overflowing, saturating, and carrying. These are accessed " -"with method syntax, e.g., `(a * b).saturating_add(b * c).saturating_add(c * " -"a)`." +"The [Idiomatic Rust](../idiomatic/welcome.md) deep dive is a 2-day class on Rust idioms " +"and patterns." msgstr "" +"Le cours [Idiomatic Rust](../idiomatic/welcome.md) est un approfondissement de 2 jours " +"sur les idiomes et les motifs communs en Rust." -#: src/types-and-values/arithmetic.md +#: src/running-the-course/course-structure.md msgid "" -"In fact, the compiler will detect overflow of constant expressions, which is " -"why the example requires a separate function." +"You should be familiar with the material in [Rust Fundamentals](../welcome-day-1.md) " +"before starting this course." msgstr "" +"Vous devez être familier avec le support dans [Rust Fundamentals](../welcome-day-1.md) " +"avant de commencer ce cours." -#: src/types-and-values/inference.md -#, fuzzy -msgid "Rust will look at how the variable is _used_ to determine the type:" +#: src/running-the-course/course-structure.md +msgid "Morning (14 hours and 25 minutes, including breaks)" msgstr "" -"Rust examinera comment la variable est _utilisée_ pour déterminer le type :" -#: src/types-and-values/inference.md -#, fuzzy -msgid "" -"This slide demonstrates how the Rust compiler infers types based on " -"constraints given by variable declarations and usages." +#: src/running-the-course/course-structure.md src/idiomatic/welcome.md +msgid "3 hours and 30 minutes" msgstr "" -"Cette diapositive montre comment le compilateur Rust déduit les types en " -"fonction des contraintes données par les déclarations et les utilisations " -"des variables." -#: src/types-and-values/inference.md -#, fuzzy -msgid "" -"It is very important to emphasize that variables declared like this are not " -"of some sort of dynamic \"any type\" that can hold any data. The machine " -"code generated by such declaration is identical to the explicit declaration " -"of a type. The compiler does the job for us and helps us write more concise " -"code." +#: src/running-the-course/course-structure.md src/idiomatic/welcome.md +msgid "7 hours and 30 minutes" msgstr "" -"Il est très important de souligner que les variables déclarées de cette " -"manière ne sont pas d'une sorte de \"tout type\" dynamique qui peut détenir " -"des données. Le code machine généré par une telle déclaration est identique " -"à la déclaration explicite d'un type. Le compilateur fait le travail pour " -"nous et nous aide à écrire un code plus concis." -#: src/types-and-values/inference.md -msgid "" -"When nothing constrains the type of an integer literal, Rust defaults to " -"`i32`. This sometimes appears as `{integer}` in error messages. Similarly, " -"floating-point literals default to `f64`." +#: src/running-the-course/course-structure.md src/idiomatic/welcome.md +msgid "3 hours and 5 minutes" msgstr "" -#: src/types-and-values/inference.md -msgid "// ERROR: no implementation for `{float} == {integer}`\n" +#: src/running-the-course/course-structure.md +msgid "Unsafe (Work in Progress)" msgstr "" -#: src/types-and-values/exercise.md +#: src/running-the-course/course-structure.md msgid "" -"The first and second Fibonacci numbers are both `1`. For n>2, the n'th " -"Fibonacci number is calculated recursively as the sum of the n-1'th and " -"n-2'th Fibonacci numbers." +"The [Unsafe](../unsafe-deep-dive/welcome.md) deep dive is a two-day class on the _unsafe_ " +"Rust language. It covers the fundamentals of Rust's safety guarantees, the motivation for " +"`unsafe`, review process for `unsafe` code, FFI basics, and building data structures that " +"the borrow checker would normally reject." msgstr "" -#: src/types-and-values/exercise.md +#: src/running-the-course/course-structure.md +msgid "not found - {{%course outline Unsafe}}" +msgstr "not found - {{%course outline Unsafe}}" + +#: src/running-the-course/course-structure.md +msgid "Format" +msgstr "Format du cours" + +#: src/running-the-course/course-structure.md msgid "" -"Write a function `fib(n)` that calculates the n'th Fibonacci number. When " -"will this function panic?" +"The course is meant to be very interactive and we recommend letting the questions drive " +"the exploration of Rust!" msgstr "" +"Le cours se veut très interactif et nous recommandons de laisser les questions guider " +"l'exploration de Rust !" -#: src/types-and-values/exercise.md -msgid "// The base case.\n" -msgstr "" +#: src/running-the-course/keyboard-shortcuts.md +msgid "There are several useful keyboard shortcuts in mdBook:" +msgstr "Il existe plusieurs raccourcis clavier utiles dans mdBook :" -#: src/types-and-values/exercise.md src/control-flow-basics/exercise.md -#, fuzzy -msgid "\"Implement this\"" -msgstr "Mise en œuvre" +#: src/running-the-course/keyboard-shortcuts.md +msgid "Arrow-Left: Navigate to the previous page." +msgstr "Arrow-Left : Navigue à la page précédente." -#: src/types-and-values/exercise.md -msgid "// The recursive case.\n" -msgstr "" +#: src/running-the-course/keyboard-shortcuts.md +msgid "Arrow-Right: Navigate to the next page." +msgstr "Arrow-Right : Navigue à la page suivante." -#: src/types-and-values/exercise.md src/types-and-values/solution.md -msgid "\"fib({n}) = {}\"" -msgstr "" +#: src/running-the-course/keyboard-shortcuts.md +msgid "Ctrl + Enter: Execute the code sample that has focus." +msgstr "Ctrl + Enter : Exécute l'exemple de code qui a le focus." -#: src/control-flow-basics/if.md -#, fuzzy -msgid "`if` expressions" -msgstr "expressions \"si\"" +#: src/running-the-course/keyboard-shortcuts.md +msgid "s: Activate the search bar." +msgstr "s : Active la barre de recherche." -#: src/control-flow-basics/if.md +#: src/running-the-course/keyboard-shortcuts.md msgid "" -"You use [`if` expressions](https://doc.rust-lang.org/reference/expressions/" -"if-expr.html#if-expressions) exactly like `if` statements in other languages:" -msgstr "" - -#: src/control-flow-basics/if.md -msgid "\"zero!\"" +"Mention that these shortcuts are standard for `mdbook` and can be useful when navigating " +"any `mdbook`\\-generated site." msgstr "" -#: src/control-flow-basics/if.md -msgid "\"biggish\"" +#: src/running-the-course/keyboard-shortcuts.md +msgid "You can demonstrate each shortcut live to the students." msgstr "" -#: src/control-flow-basics/if.md -msgid "\"huge\"" +#: src/running-the-course/keyboard-shortcuts.md +msgid "" +"The s key for search is particularly useful for quickly finding topics that " +"have been discussed earlier." msgstr "" -#: src/control-flow-basics/if.md -#, fuzzy +#: src/running-the-course/keyboard-shortcuts.md msgid "" -"In addition, you can use `if` as an expression. The last expression of each " -"block becomes the value of the `if` expression:" +"Ctrl + Enter will be super important for you since you'll do a lot " +"of live coding." msgstr "" -"De plus, vous pouvez l'utiliser comme expression. Cela fait la même chose " -"que ci-dessus:" -#: src/control-flow-basics/if.md -msgid "\"small\"" +#: src/running-the-course/translations.md +msgid "" +"The course has been translated into other languages by a set of wonderful volunteers:" msgstr "" +"Le cours a été traduit dans d'autres langues par un ensemble de merveilleux bénévoles:" -#: src/control-flow-basics/if.md -msgid "\"large\"" +#: src/running-the-course/translations.md +msgid "" +"[Brazilian Portuguese](https://google.github.io/comprehensive-rust/pt-BR/) by " +"[@rastringer](https://github.com/rastringer), [@hugojacob](https://github.com/hugojacob), " +"[@joaovicmendes](https://github.com/joaovicmendes), and [@henrif75](https://github.com/" +"henrif75)." msgstr "" +"[portugais brésilien](https://google.github.io/comprehensive-rust/pt-BR/) par " +"[@rastringer](https://github.com/rastringer), [@hugojacob](https://github.com/hugojacob), " +"[@joaovicmendes](https://github.com/joaovicmendes), et [@henrif75](https://github.com/" +"henrif75)." -#: src/control-flow-basics/if.md -msgid "\"number size: {}\"" +#: src/running-the-course/translations.md +msgid "" +"[Chinese (Simplified)](https://google.github.io/comprehensive-rust/zh-CN/) by [@suetfei]" +"(https://github.com/suetfei), [@wnghl](https://github.com/wnghl), [@anlunx](https://" +"github.com/anlunx), [@kongy](https://github.com/kongy), [@noahdragon](https://github.com/" +"noahdragon), [@superwhd](https://github.com/superwhd), @SketchK, and [@nodmp](https://" +"github.com/nodmp)." msgstr "" +"[Chinois (simplifié)](https://google.github.io/comprehensive-rust/zh-CN/) par [@suetfei]" +"(https://github.com/suetfei), [@wnghl](https://github.com/wnghl), [@anlunx](https://" +"github.com/anlunx), [@kongy](https://github.com/kongy), [@noahdragon](https://github.com/" +"noahdragon), [@superwhd](https://github.com/superwhd), @SketchK et [@nodmp](https://" +"github.com/nodmp)." -#: src/control-flow-basics/if.md +#: src/running-the-course/translations.md msgid "" -"Because `if` is an expression and must have a particular type, both of its " -"branch blocks must have the same type. Show what happens if you add `;` " -"after `\"small\"` in the second example." +"[Chinese (Traditional)](https://google.github.io/comprehensive-rust/zh-TW/) by [@hueich]" +"(https://github.com/hueich), [@victorhsieh](https://github.com/victorhsieh), [@mingyc]" +"(https://github.com/mingyc), [@kuanhungchen](https://github.com/kuanhungchen), and " +"[@johnathan79717](https://github.com/johnathan79717)." msgstr "" +"[chinois (traditionnel)](https://google.github.io/comprehensive-rust/zh-TW/) par [@hueich]" +"(https://github.com/hueich), [@victorhsieh](https://github.com/victorhsieh), [@mingyc]" +"(https://github.com/mingyc), [@kuanhungchen](https://github.com/kuanhungchen), et " +"[@johnathan79717](https://github.com/johnathan79717)." -#: src/control-flow-basics/if.md +#: src/running-the-course/translations.md msgid "" -"When `if` is used in an expression, the expression must have a `;` to " -"separate it from the next statement. Remove the `;` before `println!` to see " -"the compiler error." +"[Farsi](https://google.github.io/comprehensive-rust/fa/) by [@DannyRavi](https://github." +"com/DannyRavi), [@javad-jafari](https://github.com/javad-jafari), [@Alix1383](https://" +"github.com/alix1383), [@moaminsharifi](https://github.com/moaminsharifi) , [@hamidrezakp]" +"(https://github.com/hamidrezakp) and [@mehrad77](https://github.com/mehrad77)." msgstr "" +"[Farsi](https://google.github.io/comprehensive-rust/fa/) par [@DannyRavi](https://github." +"com/DannyRavi), [@javad-jafari](https://github.com/javad-jafari), [@Alix1383](https://" +"github.com/alix1383), [@moaminsharifi](https://github.com/moaminsharifi) , [@hamidrezakp]" +"(https://github.com/hamidrezakp) et [@mehrad77](https://github.com/mehrad77)." -#: src/control-flow-basics/loops.md -msgid "There are three looping keywords in Rust: `while`, `loop`, and `for`:" +#: src/running-the-course/translations.md +msgid "" +"[Japanese](https://google.github.io/comprehensive-rust/ja/) by [@CoinEZ-JPN](https://" +"github.com/CoinEZ), [@momotaro1105](https://github.com/momotaro1105), [@HidenoriKobayashi]" +"(https://github.com/HidenoriKobayashi) and [@kantasv](https://github.com/kantasv)." msgstr "" +"[Japonais](https://google.github.io/comprehensive-rust/ja/) par [@CoinEZ-JPN](https://" +"github.com/CoinEZ), [@momotaro1105](https://github.com/momotaro1105), [@HidenoriKobayashi]" +"(https://github.com/HidenoriKobayashi) et [@kantasv](https://github.com/kantasv)." -#: src/control-flow-basics/loops.md -#, fuzzy -msgid "`while`" -msgstr "Expressions `while`" - -#: src/control-flow-basics/loops.md -#, fuzzy +#: src/running-the-course/translations.md msgid "" -"The [`while` keyword](https://doc.rust-lang.org/reference/expressions/loop-" -"expr.html#predicate-loops) works much like in other languages, executing the " -"loop body as long as the condition is true." +"[Korean](https://google.github.io/comprehensive-rust/ko/) by [@keispace](https://github." +"com/keispace), [@jiyongp](https://github.com/jiyongp), [@jooyunghan](https://github.com/" +"jooyunghan), and [@namhyung](https://github.com/namhyung)." msgstr "" -"Comme avec `if`, il existe une variante `while let` qui teste à plusieurs " -"reprises une valeur contre un modèle :" +"[coréen](https://google.github.io/comprehensive-rust/ko/) par [@keispace](https://github." +"com/keispace), [@jiyongp](https://github.com/jiyongp), [@jooyunghan](https://github.com/" +"jooyunghan), et [@namhyung](https://github.com/namhyung)." -#: src/control-flow-basics/loops.md -msgid "\"Final x: {x}\"" +#: src/running-the-course/translations.md +msgid "" +"[Spanish](https://google.github.io/comprehensive-rust/es/) by [@deavid](https://github." +"com/deavid)." msgstr "" +"[espagnol](https://google.github.io/comprehensive-rust/es/) by [@deavid](https://github." +"com/deavid)." -#: src/control-flow-basics/loops/for.md -#, fuzzy +#: src/running-the-course/translations.md msgid "" -"The [`for` loop](https://doc.rust-lang.org/std/keyword.for.html) iterates " -"over ranges of values or the items in a collection:" +"[Ukrainian](https://google.github.io/comprehensive-rust/uk/) by [@git-user-cpp](https://" +"github.com/git-user-cpp), [@yaremam](https://github.com/yaremam) and [@reta](https://" +"github.com/reta)." msgstr "" -"[`Drop`](https://doc.rust-lang.org/std/ops/trait.Drop.html) utilisé pour " -"définir les destructeurs." +"[Ukrainien](https://google.github.io/comprehensive-rust/uk/) par [@git-user-cpp](https://" +"github.com/git-user-cpp), [@yaremam](https://github.com/yaremam) et [@reta](https://" +"github.com/reta)." -#: src/control-flow-basics/loops/for.md -msgid "\"elem: {elem}\"" +#: src/running-the-course/translations.md +msgid "Use the language picker in the top-right corner to switch between languages." msgstr "" +"Utilisez le sélecteur de langue dans le coin supérieur droit pour basculer entre les " +"langues." -#: src/control-flow-basics/loops/for.md +#: src/running-the-course/translations.md +msgid "Incomplete Translations" +msgstr "Traductions incomplètes" + +#: src/running-the-course/translations.md msgid "" -"Under the hood `for` loops use a concept called \"iterators\" to handle " -"iterating over different kinds of ranges/collections. Iterators will be " -"discussed in more detail later." +"There is a large number of in-progress translations. We link to the most recently updated " +"translations:" msgstr "" +"Il y a beaucoup de traductions en cours d'élaboration. Nous listons ci-dessous celles " +"ayant été mises à jour le plus récemment:" -#: src/control-flow-basics/loops/for.md +#: src/running-the-course/translations.md msgid "" -"Note that the `for` loop only iterates to `4`. Show the `1..=5` syntax for " -"an inclusive range." +"[Arabic](https://google.github.io/comprehensive-rust/ar/) by [@younies](https://github." +"com/younies)" msgstr "" +"[Arabe](https://google.github.io/comprehensive-rust/ar/) par [@younies](https://github." +"com/younies)" -#: src/control-flow-basics/loops/loop.md -#, fuzzy +#: src/running-the-course/translations.md msgid "" -"The [`loop` statement](https://doc.rust-lang.org/std/keyword.loop.html) just " -"loops forever, until a `break`." +"[Bengali](https://google.github.io/comprehensive-rust/bn/) by [@raselmandol](https://" +"github.com/raselmandol)." msgstr "" -"[`Drop`](https://doc.rust-lang.org/std/ops/trait.Drop.html) utilisé pour " -"définir les destructeurs." +"[bengali](https://google.github.io/comprehensive-rust/bn/) par [@raselmandol](https://" +"github.com/raselmandol)." -#: src/control-flow-basics/loops/loop.md -msgid "\"{i}\"" +#: src/running-the-course/translations.md +msgid "" +"[French](https://google.github.io/comprehensive-rust/fr/) by [@KookaS](https://github.com/" +"KookaS), [@vcaen](https://github.com/vcaen) and [@AdrienBaudemont](https://github.com/" +"AdrienBaudemont)." msgstr "" +"[Français](https://google.github.io/comprehensive-rust/fr/) par [@KookaS](https://github." +"com/KookaS), [@vcaen](https://github.com/vcaen), [@AdrienBaudemont](https://github.com/" +"AdrienBaudemont) et [@asonolet](https://github.com/asonolet)." -#: src/control-flow-basics/break-continue.md +#: src/running-the-course/translations.md msgid "" -"If you want to immediately start the next iteration use [`continue`](https://" -"doc.rust-lang.org/reference/expressions/loop-expr.html#continue-expressions)." +"[German](https://google.github.io/comprehensive-rust/de/) by [@Throvn](https://github.com/" +"Throvn) and [@ronaldfw](https://github.com/ronaldfw)." msgstr "" +"[allemand](https://google.github.io/comprehensive-rust/de/) par [@Throvn](https://github." +"com/Throvn) et [@ronaldfw](https://github.com/ronaldfw)." -#: src/control-flow-basics/break-continue.md +#: src/running-the-course/translations.md msgid "" -"If you want to exit any kind of loop early, use [`break`](https://doc.rust-" -"lang.org/reference/expressions/loop-expr.html#break-expressions). For " -"`loop`, this can take an optional expression that becomes the value of the " -"`loop` expression." +"[Italian](https://google.github.io/comprehensive-rust/it/) by [@henrythebuilder](https://" +"github.com/henrythebuilder) and [@detro](https://github.com/detro)." msgstr "" +"[italien](https://google.github.io/comprehensive-rust/it/) par [@henrythebuilder](https://" +"github.com/henrythebuilder) et [@detro](https://github.com/detro)." -#: src/control-flow-basics/break-continue.md src/std-traits/exercise.md -#: src/std-traits/solution.md src/smart-pointers/trait-objects.md -#: src/modules/exercise.md src/modules/solution.md -#: src/android/build-rules/library.md -#: src/android/interoperability/cpp/rust-bridge.md -#: src/async/pitfalls/cancellation.md -msgid "\"{}\"" +#: src/running-the-course/translations.md +msgid "" +"The full list of translations with their current status is also available either [as of " +"their last update](https://google.github.io/comprehensive-rust/translation-report.html) " +"or [synced to the latest version of the course](https://google.github.io/comprehensive-" +"rust/synced-translation-report.html)." msgstr "" +"La liste complète des traductions avec leur statut actuel est également disponible soit " +"[à partir de leur dernière mise à jour](https://google.github.io/comprehensive-rust/" +"translation-report.html) soit [synchronisée avec la dernière version du cours](https://" +"google.github.io/comprehensive-rust/synced-translation-report.html)." -#: src/control-flow-basics/break-continue/labels.md -#, fuzzy +#: src/running-the-course/translations.md msgid "" -"Both `continue` and `break` can optionally take a label argument which is " -"used to break out of nested loops:" +"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 get going. Translations " +"are coordinated on the [issue tracker](https://github.com/google/comprehensive-rust/" +"issues/282)." msgstr "" -"Si vous voulez quitter une boucle plus tôt, utilisez `break`, si vous voulez " -"commencer immédiatement la prochaine itération utilise `continue`. " -"`continue` et `break` peuvent éventuellement prenez un argument d'étiquette " -"qui est utilisé pour sortir des boucles imbriquées :" +"Si vous souhaitez contribuer à cet effort, veuillez consulter [nos instructions - en " +"anglais](https://github.com/google/comprehensive-rust/blob/main/TRANSLATIONS.md) pour " +"savoir comment se lancer. Les traductions sont coordonnées sur le [suivi de bogues - en " +"anglais](https://github.com/google/comprehensive-rust/issues/282)." -#: src/control-flow-basics/break-continue/labels.md -msgid "\"elements searched: {elements_searched}\"" +#: src/running-the-course/translations.md +msgid "" +"This is a good opportunity to thank the volunteers who have contributed to the " +"translations." msgstr "" +"C’est une bonne occasion de remercier les bénévoles qui ont contribué aux traductions." -#: src/control-flow-basics/break-continue/labels.md +#: src/running-the-course/translations.md msgid "" -"Note that `loop` is the only looping construct which returns a non-trivial " -"value. This is because it's guaranteed to be entered at least once (unlike " -"`while` and `for` loops)." +"If there are students in the class who speak any of the listed languages, you can " +"encourage them to check out the translated versions and even contribute if they find any " +"issues." msgstr "" +"Si des élèves de la classe parlent l'une des langues listées, vous pouvez les encourager " +"à consulter les versions traduites et même à contribuer s'ils rencontrent des problèmes." -#: src/control-flow-basics/blocks-and-scopes.md -msgid "Blocks" -msgstr "Blocs" - -#: src/control-flow-basics/blocks-and-scopes.md -#, fuzzy +#: src/running-the-course/translations.md msgid "" -"A block in Rust contains a sequence of expressions, enclosed by braces `{}`. " -"Each block has a value and a type, which are those of the last expression of " -"the block:" +"Highlight that the project is open source and contributions are welcome, not just for " +"translations but for the course content itself." msgstr "" -"Un bloc en Rust a une valeur et un type : la valeur est la dernière " -"expression du bloc:" +"Soulignez que le projet est open source et que les contributions sont les bienvenues, non " +"seulement pour les traductions, mais aussi pour le contenu du cours lui-même." -#: src/control-flow-basics/blocks-and-scopes.md -msgid "\"y: {y}\"" +#: src/cargo.md +msgid "" +"When you start reading about Rust, you will soon meet [Cargo](https://doc.rust-lang.org/" +"cargo/), the standard tool used in the Rust ecosystem to build and run Rust applications. " +"Here we want to give a brief overview of what Cargo is and how it fits into the wider " +"ecosystem and how it fits into this training." msgstr "" +"Lorsque vous commencerez à vous documenter sur Rust, vous rencontrerez rapidement [Cargo]" +"(https://doc.rust-lang.org/cargo/), l'outil standard utilisé dans l'écosystème Rust pour " +"créer et exécuter des applications Rust. Dans cette section, nous voulons donner un bref " +"aperçu de ce qu'est Cargo, comment il s'intègre dans le large écosystème de Rust et " +"comment il s'inscrit dans cette formation." -#: src/control-flow-basics/blocks-and-scopes.md -msgid "" -"If the last expression ends with `;`, then the resulting value and type is " -"`()`." -msgstr "" +#: src/cargo.md +msgid "Installation" +msgstr "Installation" -#: src/control-flow-basics/blocks-and-scopes.md -#, fuzzy -msgid "" -"You can show how the value of the block changes by changing the last line in " -"the block. For instance, adding/removing a semicolon or using a `return`." -msgstr "" -"Vous pouvez montrer comment la valeur du bloc change en modifiant la " -"dernière ligne du bloc. Par exemple, ajouter/supprimer un point-virgule ou " -"utiliser un \"retour\"." +#: src/cargo.md +msgid "**Please follow the instructions on .**" +msgstr "**Veuillez suivre les instructions sur ** (en anglais)." -#: src/control-flow-basics/blocks-and-scopes/scopes.md -msgid "A variable's scope is limited to the enclosing block." +#: src/cargo.md +msgid "" +"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 different " +"compiler versions." msgstr "" +"Une fois que vous aurez suivi ces instructions, vous disposerez du gestionnaire de " +"dépendances et système de compilation `cargo` et du compilateur `rustc`. `rustup` sera " +"également installé : il s'agit d'un utilitaire en ligne de commande que vous pourrez " +"utiliser pour installer différentes versions du compilateur." -#: src/control-flow-basics/blocks-and-scopes/scopes.md -#, fuzzy +#: src/cargo.md msgid "" -"You can shadow variables, both those from outer scopes and variables from " -"the same scope:" -msgstr "" -"Vous pouvez masquer des variables, à la fois celles des portées externes et " -"celles des même périmètre :" +"After installing Rust, you should configure your editor or IDE to work with Rust. Most " +"editors do this by talking to [rust-analyzer](https://rust-analyzer.github.io/), which " +"provides auto-completion and jump-to-definition functionality for [VS Code](https://code." +"visualstudio.com/), [Emacs](https://rust-analyzer.github.io/manual.html#emacs), [Vim/" +"Neovim](https://rust-analyzer.github.io/manual.html#vimneovim), and many others. There is " +"also a different IDE available called [RustRover](https://www.jetbrains.com/rust/)." +msgstr "" +"Après avoir installé Rust, il vous faudra configurer votre éditeur de texte ou votre IDE " +"(environnement de développement) pour travailler avec Rust. La plupart des éditeurs " +"reposent, pour ce faire, sur le [rust-analyzer](https://rust-analyzer.github.io/), un " +"outil qui fournit les fonctionnalités de complétion automatique et de lien vers les " +"définitions des symboles, notamment pour [VS Code](https://code.visualstudio.com/), " +"[Emacs](https://rust-analyzer.github.io/manual.html#emacs), [Vim/Neovim](https://rust-" +"analyzer.github.io/manual.html#vimneovim), et bien d'autres. Il existe également un IDE " +"appelé [RustRover](https://www.jetbrains.com/rust/)." -#: src/control-flow-basics/blocks-and-scopes/scopes.md -msgid "\"before: {a}\"" -msgstr "" +#: src/cargo.md +msgid "On Debian/Ubuntu, you can install `rustup` via `apt`:" +msgstr "Sur Debian/Ubuntu, vous pouvez installer `rustup` avec `apt`" -#: src/control-flow-basics/blocks-and-scopes/scopes.md src/generics/exercise.md -#: src/generics/solution.md src/std-traits/from-and-into.md -#: src/lifetimes/solution.md -msgid "\"hello\"" +#: src/cargo.md +msgid "" +"On macOS, you can use [Homebrew](https://brew.sh/) to install Rust, but this may provide " +"an outdated version. Therefore, it is recommended to install Rust from the official site." msgstr "" +"Sur macOS, vous pouvez utiliser [Homebrew](https://brew.sh/) pour installer Rust, mais il " +"est possible que la version fournie soit obsolète. Il est donc recommandé d'installer " +"Rust depuis le site officiel." -#: src/control-flow-basics/blocks-and-scopes/scopes.md -msgid "\"inner scope: {a}\"" -msgstr "" +#: src/cargo/rust-ecosystem.md +msgid "The Rust Ecosystem" +msgstr "L'écosystème de Rust" -#: src/control-flow-basics/blocks-and-scopes/scopes.md -msgid "\"shadowed in inner scope: {a}\"" +#: src/cargo/rust-ecosystem.md +msgid "The Rust ecosystem consists of a number of tools, of which the main ones are:" msgstr "" +"L'écosystème de Rust est composé d'un certain nombre d'outils, dont les principaux sont :" -#: src/control-flow-basics/blocks-and-scopes/scopes.md -msgid "\"after: {a}\"" +#: src/cargo/rust-ecosystem.md +msgid "" +"`rustc`: the Rust compiler that turns `.rs` files into binaries and other intermediate " +"formats." msgstr "" +"`rustc` : le compilateur Rust qui transforme les fichiers `.rs` en binaires et autres " +"formats intermédiaires." -#: src/control-flow-basics/blocks-and-scopes/scopes.md +#: src/cargo/rust-ecosystem.md msgid "" -"Show that a variable's scope is limited by adding a `b` in the inner block " -"in the last example, and then trying to access it outside that block." +"`cargo`: the Rust dependency manager and build tool. Cargo knows how to 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 "" +"`cargo` : le gestionnaire de dépendances Rust et l'outil de compilation. Cargo peut " +"télécharger les dépendances, en général hébergées sur , et les rendre " +"disponibles pour `rustc` lors de la compilation de votre projet. Cargo intègre également " +"un outil pour exécuter des tests unitaires." -#: src/control-flow-basics/blocks-and-scopes/scopes.md -#, fuzzy +#: src/cargo/rust-ecosystem.md msgid "" -"Shadowing is different from mutation, because after shadowing both " -"variable's memory locations exist at the same time. Both are available under " -"the same name, depending where you use it in the code." +"`rustup`: the Rust toolchain installer and updater. This tool is used to install and " +"update `rustc` and `cargo` when new versions of Rust are released. In addition, `rustup` " +"can also download documentation for the standard library. You can have multiple versions " +"of Rust installed at once and `rustup` will let you switch between them as needed." msgstr "" -"Définition : l'occultation est différente de la mutation, car après " -"l'occultation, les emplacements de mémoire des deux variables existent en " -"même temps. Les deux sont disponibles sous le même nom, selon l'endroit où " -"vous l'utilisez dans le code." +"`rustup` : le programme d'installation et de mise à jour de la chaîne d'outils Rust. Cet " +"outil sert à installer et mettre à jour `rustc` et `cargo` lorsque de nouvelles versions " +"de Rust sont publiées. De plus, `rustup` peut également télécharger la documentation de " +"la bibliothèque standard. Vous pouvez avoir plusieurs versions de Rust installées à la " +"fois et `rustup` vous permettra de basculer entre elles au besoin." -#: src/control-flow-basics/blocks-and-scopes/scopes.md -#, fuzzy -msgid "A shadowing variable can have a different type." -msgstr "Une variable d'occultation peut avoir un type différent." +#: src/cargo/rust-ecosystem.md src/types-and-values/hello-world.md +#: src/references/exclusive.md src/memory-management/move.md src/error-handling/try.md +#: src/unsafe-rust/unsafe-functions/calling.md src/android/setup.md +#: src/concurrency/async/async-await.md +msgid "Key points:" +msgstr "Points clés :" -#: src/control-flow-basics/blocks-and-scopes/scopes.md -#, fuzzy +#: src/cargo/rust-ecosystem.md msgid "" -"Shadowing looks obscure at first, but is convenient for holding on to values " -"after `.unwrap()`." +"Rust has a rapid release schedule with a new release coming out every six weeks. New " +"releases maintain backwards compatibility with old releases --- plus they enable new " +"functionality." msgstr "" -"L'ombrage semble obscur au début, mais est pratique pour conserver les " -"valeurs après `.unwrap()`." +"Rust a un calendrier de publication rapide : une nouvelle version est disponible toutes " +"les six semaines. Les nouvelles versions maintiennent la rétrocompatibilité avec les " +"anciennes versions --- elles proposent en plus de nouvelles fonctionnalités." -#: src/control-flow-basics/functions.md -msgid "" -"Declaration parameters are followed by a type (the reverse of some " -"programming languages), then a return type." -msgstr "" +#: src/cargo/rust-ecosystem.md +msgid "There are three release channels: \"stable\", \"beta\", and \"nightly\"." +msgstr "Il existe trois types de publication : \"stable\", \"beta\" et \"nightly\"." -#: src/control-flow-basics/functions.md +#: src/cargo/rust-ecosystem.md msgid "" -"The last expression in a function body (or any block) becomes the return " -"value. Simply omit the `;` at the end of the expression. The `return` " -"keyword can be used for early return, but the \"bare value\" form is " -"idiomatic at the end of a function (refactor `gcd` to use a `return`)." +"New features are being tested on \"nightly\", \"beta\" is what becomes \"stable\" every " +"six weeks." msgstr "" +"Les nouvelles fonctionnalités sont testées sur \"nightly\". \"beta\" est ce qui devient " +"\"stable\" toutes les six semaines." -#: src/control-flow-basics/functions.md +#: src/cargo/rust-ecosystem.md msgid "" -"Some functions have no return value, and return the 'unit type', `()`. The " -"compiler will infer this if the `-> ()` return type is omitted." +"Dependencies can also be resolved from alternative [registries](https://doc.rust-lang.org/" +"cargo/reference/registries.html), git, folders, and more." msgstr "" +"Les dépendances peuvent aussi être obtenues sur des [dépôts alternatifs](https://doc.rust-" +"lang.org/cargo/reference/registries.html), via `git`, dans des répertoires système, et " +"autres." -#: src/control-flow-basics/functions.md -#, fuzzy +#: src/cargo/rust-ecosystem.md msgid "" -"Overloading is not supported -- each function has a single implementation." -msgstr "Chaque fonction a une seule implémentation :" +"Rust also has [editions](https://doc.rust-lang.org/edition-guide/): the current edition " +"is Rust 2024. Previous editions were Rust 2015, Rust 2018 and Rust 2021." +msgstr "" +"Rust a également des [éditions](https://doc.rust-lang.org/edition-guide/) : l'édition " +"actuelle est Rust 2024. Les éditions passées étaient Rust 2015, Rust 2018 et Rust 2021." -#: src/control-flow-basics/functions.md -msgid "" -"Always takes a fixed number of parameters. Default arguments are not " -"supported. Macros can be used to support variadic functions." +#: src/cargo/rust-ecosystem.md +msgid "The editions are allowed to make backwards incompatible changes to the language." msgstr "" +"Les éditions sont autorisées à apporter des modifications **non** rétrocompatibles au " +"langage." -#: src/control-flow-basics/functions.md -#, fuzzy +#: src/cargo/rust-ecosystem.md msgid "" -"Always takes a single set of parameter types. These types can be generic, " -"which will be covered later." -msgstr "Prend toujours un seul ensemble de types de paramètres." +"To prevent breaking code, editions are opt-in: you select the edition for your crate via " +"the `Cargo.toml` file." +msgstr "" +"Pour éviter de casser vos dépendances et empêcher la compilation de votre projet, les " +"éditions sont laissées au choix : vous sélectionnez l'édition pour chaque crate via le " +"fichier `Cargo.toml`." -#: src/control-flow-basics/macros.md +#: src/cargo/rust-ecosystem.md msgid "" -"Macros are expanded into Rust code during compilation, and can take a " -"variable number of arguments. They are distinguished by a `!` at the end. " -"The Rust standard library includes an assortment of useful macros." +"To avoid splitting the ecosystem, Rust compilers can mix code written for different " +"editions." msgstr "" +"Pour éviter de diviser l'écosystème, les compilateurs Rust peuvent mélanger du code écrit " +"pour différentes éditions." -#: src/control-flow-basics/macros.md -#, fuzzy +#: src/cargo/rust-ecosystem.md msgid "" -"`println!(format, ..)` prints a line to standard output, applying formatting " -"described in [`std::fmt`](https://doc.rust-lang.org/std/fmt/index.html)." +"Mention that it is quite rare to ever use the compiler directly not through `cargo` (most " +"users never do)." msgstr "" -"La surcharge d'opérateur est implémentée via des traits dans [`std::ops`]" -"(https://doc.rust-lang.org/std/ops/index.html) :" +"Veuillez noter qu'il est assez rare d'utiliser le compilateur directement et non via " +"`cargo` (la plupart des utilisateurs ne le font jamais)." -#: src/control-flow-basics/macros.md +#: src/cargo/rust-ecosystem.md msgid "" -"`format!(format, ..)` works just like `println!` but returns the result as a " -"string." +"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 "" +"Il peut être utile de mentionner que Cargo est un outil extrêmement puissant et complet. " +"Il est fort de nombreuses fonctionnalités avancées, y compris, mais sans s'y limiter :" -#: src/control-flow-basics/macros.md -msgid "`dbg!(expression)` logs the value of the expression and returns it." -msgstr "" +#: src/cargo/rust-ecosystem.md +msgid "Project/package structure" +msgstr "Structure du projet/paquets" -#: src/control-flow-basics/macros.md -msgid "" -"`todo!()` marks a bit of code as not-yet-implemented. If executed, it will " -"panic." -msgstr "" +#: src/cargo/rust-ecosystem.md +msgid "[workspaces](https://doc.rust-lang.org/cargo/reference/workspaces.html)" +msgstr "[Espaces de travail](https://doc.rust-lang.org/cargo/reference/workspaces.html)" -#: src/control-flow-basics/macros.md -msgid "" -"`unreachable!()` marks a bit of code as unreachable. If executed, it will " -"panic." +#: src/cargo/rust-ecosystem.md +msgid "Dev Dependencies and Runtime Dependency management/caching" msgstr "" +"Gestion/mise en cache des dépendances de développement et des dépendances d'exécution" -#: src/control-flow-basics/macros.md -msgid "\"{n}! = {}\"" -msgstr "" +#: src/cargo/rust-ecosystem.md +msgid "[build scripting](https://doc.rust-lang.org/cargo/reference/build-scripts.html)" +msgstr "[Créer des scripts](https://doc.rust-lang.org/cargo/reference/build-scripts.html)" -#: src/control-flow-basics/macros.md -msgid "" -"The takeaway from this section is that these common conveniences exist, and " -"how to use them. Why they are defined as macros, and what they expand to, is " -"not especially critical." -msgstr "" +#: src/cargo/rust-ecosystem.md +msgid "[global installation](https://doc.rust-lang.org/cargo/commands/cargo-install.html)" +msgstr "[Installation globale](https://doc.rust-lang.org/cargo/commands/cargo-install.html)" -#: src/control-flow-basics/macros.md +#: src/cargo/rust-ecosystem.md msgid "" -"The course does not cover defining macros, but a later section will describe " -"use of derive macros." +"It is also extensible with sub command plugins as well (such as [cargo clippy](https://" +"github.com/rust-lang/rust-clippy))." msgstr "" +"Il est également extensible avec des plugins de sous-commande (tels que [cargo clippy]" +"(https://github.com/rust-lang/rust-clippy))." -#: src/control-flow-basics/exercise.md -msgid "" -"The [Collatz Sequence](https://en.wikipedia.org/wiki/Collatz_conjecture) is " -"defined as follows, for an arbitrary n" +#: src/cargo/rust-ecosystem.md +msgid "Read more from the [official Cargo Book](https://doc.rust-lang.org/cargo/)" msgstr "" +"Pour en savoir plus, vous pouvez lire le [livre officiel de Cargo - en anglais](https://" +"doc.rust-lang.org/cargo/)" -#: src/control-flow-basics/exercise.md -#, fuzzy -msgid "1" -msgstr "12" - -#: src/control-flow-basics/exercise.md -msgid " greater than zero:" -msgstr "" +#: src/cargo/code-samples.md +msgid "Code Samples in This Training" +msgstr "Échantillons de code dans cette formation" -#: src/control-flow-basics/exercise.md -msgid "If _n" +#: src/cargo/code-samples.md +msgid "" +"For this training, we will mostly explore the Rust language through examples which can be " +"executed through your browser. This makes the setup much easier and ensures a consistent " +"experience for everyone." msgstr "" +"Pour cette formation, nous allons surtout explorer le langage Rust à travers des exemples " +"qui peuvent être exécutés via votre navigateur. Cela rend la configuration beaucoup plus " +"facile et assure une expérience cohérente pour chacun." -#: src/control-flow-basics/exercise.md -msgid "i" +#: src/cargo/code-samples.md +msgid "" +"Installing Cargo is still encouraged: it will make it easier for you to do the exercises. " +"On the last day, we will do a larger exercise that shows you how to work with " +"dependencies and for that you need Cargo." msgstr "" +"L'installation de Cargo est tout de même encouragée : elle vous facilitera la tâche pour " +"les exercices. Le dernier jour, nous ferons un exercice plus conséquent qui vous montrera " +"comment travailler avec des dépendances et pour cela, vous avez besoin de Cargo." -#: src/control-flow-basics/exercise.md -msgid "_ is 1, then the sequence terminates at _n" -msgstr "" +#: src/cargo/code-samples.md +msgid "The code blocks in this course are fully interactive:" +msgstr "Les blocs de code de ce cours sont entièrement interactifs :" -#: src/control-flow-basics/exercise.md -msgid "_." -msgstr "" +#: src/cargo/code-samples.md src/cargo/running-locally.md +msgid "\"Edit me!\"" +msgstr "\"Edit me!\"" -#: src/control-flow-basics/exercise.md -msgid "_ is even, then _n" +#: src/cargo/code-samples.md +msgid "" +"You can use Ctrl + Enter to execute the code when focus is in the " +"text box." msgstr "" +"Vous pouvez utiliser Ctrl + Enter pour exécuter le code lorsque le " +"focus est dans la zone de texte." -#: src/control-flow-basics/exercise.md -msgid "i+1" +#: src/cargo/code-samples.md +msgid "" +"Most code samples are editable like shown above. A few code samples are not editable for " +"various reasons:" msgstr "" +"La plupart des exemples de code sont modifiables comme indiqué ci-dessus. Quelques " +"exemples de code ne sont pas modifiables pour diverses raisons :" -#: src/control-flow-basics/exercise.md -msgid " = n" +#: src/cargo/code-samples.md +msgid "" +"The embedded playgrounds cannot execute unit tests. Copy-paste the code and open it in " +"the real Playground to demonstrate unit tests." msgstr "" +"Les environnements d'exécution intégrés ne peuvent pas exécuter de tests unitaires. " +"Copiez-collez le code et ouvrez-le dans l'environnement d'exécution complet pour valider " +"les tests unitaires." -#: src/control-flow-basics/exercise.md -msgid " / 2_." +#: src/cargo/code-samples.md +msgid "" +"The embedded playgrounds lose their state the moment you navigate away from the page! " +"This is the reason that the students should solve the exercises using a local Rust " +"installation or via the Playground." msgstr "" +"Les environnements d'exécution intégrés sont réinitialisés dès que vous quittez la page ! " +"C'est la raison pour laquelle les élèves doivent résoudre les exercices en utilisant une " +"installation Rust locale ou via l'environnement d'exécution complet." -#: src/control-flow-basics/exercise.md -msgid "_ is odd, then _n" -msgstr "" +#: src/cargo/running-locally.md +msgid "Running Code Locally with Cargo" +msgstr "Exécuter du code localement avec Cargo" -#: src/control-flow-basics/exercise.md -msgid " = 3 * n" +#: src/cargo/running-locally.md +msgid "" +"If you want to experiment with the code on your own system, then you will need to first " +"install Rust. Do this by following the [instructions in the Rust Book](https://doc.rust-" +"lang.org/book/ch01-01-installation.html). This should give you a working `rustc` and " +"`cargo`. At the time of writing, the latest stable Rust release has these version numbers:" msgstr "" +"Si vous souhaitez expérimenter le code sur votre propre système, il vous faudra d'abord " +"installer Rust. Pour ce faire, suivez les [instructions dans le livre Rust - en anglais]" +"(https://doc.rust-lang.org/book/ch01-01-installation.html). Vous disposerez alors de " +"`rustc` et `cargo`. Au moment de l'écriture, la dernière version stable de Rust a ces " +"numéros de version :" -#: src/control-flow-basics/exercise.md -msgid " + 1_." +#: src/cargo/running-locally.md +msgid "You can use any later version too since Rust maintains backwards compatibility." msgstr "" +"N'importe quelle version plus récente peut également être utilisée, étant donné que les " +"versions de Rust sont rétrocompatibles." -#: src/control-flow-basics/exercise.md -msgid "For example, beginning with _n" +#: src/cargo/running-locally.md +msgid "" +"With this in place, follow these steps to build a Rust binary from one of the examples in " +"this training:" msgstr "" +"Suivez ensuite ces étapes pour créer un binaire Rust à partir d'un des exemples dans " +"cette formation :" -#: src/control-flow-basics/exercise.md -msgid "_ = 3:" +#: src/cargo/running-locally.md +msgid "Click the \"Copy to clipboard\" button on the example you want to copy." msgstr "" +"Cliquez sur le bouton \"Copy to clipboard\" sur l'exemple que vous souhaitez copier." -#: src/control-flow-basics/exercise.md -msgid "3 is odd, so _n" +#: src/cargo/running-locally.md +msgid "Use `cargo new exercise` to create a new `exercise/` directory for your code:" msgstr "" +"Exécutez `cargo new exercise` pour créer un nouveau répertoire `exercise/` pour héberger " +"votre code :" -#: src/control-flow-basics/exercise.md -#, fuzzy -msgid "2" -msgstr "12" - -#: src/control-flow-basics/exercise.md -msgid "_ = 3 * 3 + 1 = 10;" +#: src/cargo/running-locally.md +msgid "Navigate into `exercise/` and use `cargo run` to build and run your binary:" msgstr "" +"Rendez vous dans le répertoire `exercise/` et exécutez `cargo run` pour compiler et " +"exécuter votre binaire :" -#: src/control-flow-basics/exercise.md -msgid "10 is even, so _n" +#: src/cargo/running-locally.md +msgid "" +"Replace the boilerplate 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 "" +"Remplacez le code standard sous `src/main.rs` par votre propre code. Par exemple, en " +"suivant l'exemple de la page précédente, modifiez `src/main.rs` comme ceci :" -#: src/control-flow-basics/exercise.md src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "3" -msgstr "3" +#: src/cargo/running-locally.md +msgid "Use `cargo run` to build and run your updated binary:" +msgstr "Exécutez `cargo run` pour compiler et exécuter votre binaire mis à jour :" -#: src/control-flow-basics/exercise.md -msgid "_ = 10 / 2 = 5;" +#: src/cargo/running-locally.md +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/debug/` for a normal debug " +"build. Use `cargo build --release` to produce an optimized release build in `target/" +"release/`." msgstr "" +"Exécutez `cargo check` afin de rapidement déterminer si votre projet contient des " +"erreurs. Exécutez `cargo build` pour le compiler sans l'exécuter. Pour une compilation " +"normale en mode debug, le résultat se trouvera dans le répertoire `target/debug/`. Enfin, " +"vous pouvez exécuter `cargo build --release` pour générer un binaire optimisé qui se " +"trouvera dans le répertoire `target/release/`." -#: src/control-flow-basics/exercise.md -msgid "5 is odd, so _n" +#: src/cargo/running-locally.md +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 "" +"Vous pouvez déclarer des dépendances pour votre projet dans le fichier `Cargo.toml`. " +"Quand vous lancez des commandes `cargo`, Cargo se charge de télécharger et compiler les " +"dépendances manquantes." -#: src/control-flow-basics/exercise.md src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "4" -msgstr "4" - -#: src/control-flow-basics/exercise.md -msgid "_ = 3 * 5 + 1 = 16;" +#: src/cargo/running-locally.md +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 development environment." msgstr "" +"Essayez d'encourager les participants à installer Cargo et à utiliser un éditeur local. " +"Cela leur facilitera la vie puisqu'ils auront un environnement de développement normal." -#: src/control-flow-basics/exercise.md -msgid "16 is even, so _n" -msgstr "" +#: src/welcome-day-1.md +msgid "Welcome to Day 1" +msgstr "Bienvenue au jour 1" -#: src/control-flow-basics/exercise.md -msgid "5" +#: src/welcome-day-1.md +msgid "" +"This is the first day of Rust Fundamentals. We will cover a broad range of topics today:" msgstr "" +"C'est le premier jour de Comprehensive Rust (le guide complet de Rust). Nous couvrirons " +"beaucoup de sujets aujourd'hui:" -#: src/control-flow-basics/exercise.md -msgid "_ = 16 / 2 = 8;" +#: src/welcome-day-1.md +msgid "" +"Basic Rust syntax: variables, scalar and compound types, enums, structs, references, " +"functions, and methods." msgstr "" +"Syntaxe de base de Rust : variables, types scalaires et composés, énumérations, " +"structures, références, fonctions et méthodes." -#: src/control-flow-basics/exercise.md -msgid "8 is even, so _n" -msgstr "" +#: src/welcome-day-1.md +msgid "Types and type inference." +msgstr "Types et Inférence de type." -#: src/control-flow-basics/exercise.md src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "6" -msgstr "6" +#: src/welcome-day-1.md +msgid "Control flow constructs: loops, conditionals, and so on." +msgstr "Structures de contrôle : boucles, conditionnels, etc." -#: src/control-flow-basics/exercise.md -msgid "_ = 8 / 2 = 4;" -msgstr "" +#: src/welcome-day-1.md +msgid "User-defined types: structs and enums." +msgstr "Types définis par l'utilisateur : structures et énumérations." -#: src/control-flow-basics/exercise.md -msgid "4 is even, so _n" -msgstr "" +#: src/welcome-day-1.md src/welcome-day-2.md src/welcome-day-3.md src/welcome-day-4.md +#: src/concurrency/welcome.md src/concurrency/welcome-async.md src/idiomatic/welcome.md +msgid "Schedule" +msgstr "Programme" -#: src/control-flow-basics/exercise.md -msgid "7" +#: src/welcome-day-1.md +msgid "" +"Including 10 minute breaks, this session should take about 2 hours and 10 minutes. It " +"contains:" msgstr "" +"Avec une pause de 10 minutes, cette session devrait prendre autour de 2h10. Elle " +"contient :" -#: src/control-flow-basics/exercise.md -msgid "_ = 4 / 2 = 2;" -msgstr "" +#: src/welcome-day-1.md +msgid "Please remind the students that:" +msgstr "Veuillez rappeler aux élèves que :" -#: src/control-flow-basics/exercise.md -msgid "2 is even, so _n" +#: src/welcome-day-1.md +msgid "They should ask questions when they get them, don't save them to the end." msgstr "" +"Ils doivent poser des questions au fur et à mesure, ne les gardez pas jusqu'à la fin." -#: src/control-flow-basics/exercise.md src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "8" -msgstr "8" +#: src/welcome-day-1.md +msgid "The class is meant to be interactive and discussions are very much encouraged!" +msgstr "Le cours se veut interactif et les discussions sont vivement encouragées !" -#: src/control-flow-basics/exercise.md -msgid "_ = 1; and" +#: src/welcome-day-1.md +msgid "" +"As an instructor, you should try to keep the discussions relevant, i.e., keep the " +"discussions related to how Rust does things vs. some other language. It can be hard to " +"find the right balance, but err on the side of allowing discussions since they engage " +"people much more than one-way communication." msgstr "" +"En tant qu'instructeur, vous devez essayer de garder les discussions pertinentes, c'est-à-" +"dire, garder le lien avec la façon dont Rust fait les choses par rapport à un autre " +"langage. Ça peut être difficile de trouver le bon équilibre, mais privilégiez les " +"discussions car elles engagent les gens bien plus que la communication à sens unique." -#: src/control-flow-basics/exercise.md -msgid "the sequence terminates." +#: src/welcome-day-1.md +msgid "The questions will likely mean that we talk about things ahead of the slides." msgstr "" +"Les questions signifieront probablement que nous parlons de choses avant les diapositives." -#: src/control-flow-basics/exercise.md +#: src/welcome-day-1.md msgid "" -"Write a function to calculate the length of the collatz sequence for a given " -"initial `n`." +"This is perfectly okay! Repetition is an important part of learning. Remember that the " +"slides are just a support and you are free to skip them as you like." msgstr "" +"C'est tout à fait correct ! La répétition est une partie importante de l'apprentissage. " +"N'oubliez pas que les diapositives ne sont qu'un support et que vous êtes libre de les " +"sauter si vous le souhaitez." -#: src/control-flow-basics/exercise.md src/control-flow-basics/solution.md -msgid "/// Determine the length of the collatz sequence beginning at `n`.\n" +#: src/welcome-day-1.md +msgid "" +"The idea for the first day is to show the \"basic\" things in Rust that should have " +"immediate parallels in other languages. The more advanced parts of Rust come on the " +"subsequent days." msgstr "" +"L'idée de la première journée est de montrer les choses basiques de Rust qui ont des " +"parallèles évidents dans d'autres langages. Les parties avancées de Rust sont vus les " +"jours suivants." -#: src/control-flow-basics/solution.md src/concurrency/scoped-threads.md -msgid "\"Length: {}\"" +#: src/welcome-day-1.md +msgid "" +"If you're teaching this in a classroom, this is a good place to go over the schedule. " +"Note that there is an exercise at the end of each segment, followed by a break. Plan to " +"cover the exercise solution after the break. The times listed here are a suggestion in " +"order to keep the course on schedule. Feel free to be flexible and adjust as necessary!" msgstr "" +"Si vous enseignez ce cours en classe, c'est le moment idéal pour revoir le programme. " +"Notez qu'un exercice est prévu à la fin de chaque segment, suivi d'une pause. Prévoyez de " +"corriger l'exercice après la pause. Les horaires indiqués ici sont une suggestion pour " +"respecter le planning du cours. N'hésitez pas à les adapter selon vos besoins !" -#: src/welcome-day-1-afternoon.md src/welcome-day-2-afternoon.md -#: src/welcome-day-3-afternoon.md src/welcome-day-4-afternoon.md -#, fuzzy -msgid "Welcome Back" -msgstr "Bienvenue" +#: src/hello-world.md src/concurrency/send-sync.md +msgid "This segment should take about 15 minutes. It contains:" +msgstr "Ce segment devrait durer environ 15 minutes. Il contient :" -#: src/tuples-and-arrays/arrays.md -msgid "" -"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. Slices, which have a size determined at runtime, are " -"covered later." -msgstr "" +#: src/hello-world.md src/types-and-values.md src/control-flow-basics.md +#: src/tuples-and-arrays.md src/references.md src/user-defined-types.md +#: src/pattern-matching.md src/methods-and-traits.md src/generics.md src/closures.md +#: src/std-types.md src/std-traits.md src/memory-management.md src/smart-pointers.md +#: src/borrowing.md src/lifetimes.md src/iterators.md src/modules.md src/testing.md +#: src/error-handling.md src/unsafe-rust.md src/concurrency/threads.md +#: src/concurrency/channels.md src/concurrency/send-sync.md src/concurrency/shared-state.md +#: src/concurrency/sync-exercises.md src/concurrency/async.md +#: src/concurrency/async-control-flow.md src/concurrency/async-pitfalls.md +#: src/concurrency/async-exercises.md src/idiomatic/foundations-api-design.md +#: src/idiomatic/leveraging-the-type-system.md src/unsafe-deep-dive/introduction.md +#: src/unsafe-deep-dive/pinning.md src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "Slide" +msgstr "Diapositive" + +#: src/hello-world.md src/references.md src/user-defined-types.md src/pattern-matching.md +#: src/methods-and-traits.md src/generics.md src/closures.md src/std-types.md +#: src/memory-management.md src/smart-pointers.md src/borrowing.md src/modules.md +#: src/unsafe-rust.md src/concurrency/channels.md src/concurrency/send-sync.md +#: src/concurrency/shared-state.md src/concurrency/async.md +#: src/concurrency/async-control-flow.md src/concurrency/async-pitfalls.md +#: src/unsafe-deep-dive/introduction.md +msgid "10 minutes" +msgstr "10 minutes" + +#: src/hello-world.md src/control-flow-basics.md src/user-defined-types.md +#: src/memory-management.md src/concurrency/channels.md src/concurrency/send-sync.md +#: src/idiomatic/foundations-api-design.md +msgid "2 minutes" +msgstr "2 minutes" -#: src/tuples-and-arrays/arrays.md +#: src/hello-world/what-is-rust.md msgid "" -"Try accessing an out-of-bounds array element. Array accesses are checked at " -"runtime. Rust can usually optimize these checks away, and they can be " -"avoided using unsafe Rust." +"Rust is a new programming language that had its [1.0 release in 2015](https://blog.rust-" +"lang.org/2015/05/15/Rust-1.0.html):" msgstr "" +"Rust est un nouveau langage de programmation qui a eu sa [version 1.0 en 2015](https://" +"blog.rust-lang.org/2015/05/15/Rust-1.0.html) :" -#: src/tuples-and-arrays/arrays.md -msgid "We can use literals to assign values to arrays." -msgstr "" +#: src/hello-world/what-is-rust.md +msgid "Rust is a statically compiled language in a similar role as C++" +msgstr "Rust est un langage compilé statiquement dans un rôle similaire à C++" -#: src/tuples-and-arrays/arrays.md +#: src/hello-world/what-is-rust.md +msgid "`rustc` uses LLVM as its backend." +msgstr "`rustc` utilise LLVM comme backend." + +#: src/hello-world/what-is-rust.md msgid "" -"The `println!` macro asks for the debug implementation with the `?` format " -"parameter: `{}` gives the default output, `{:?}` gives the debug output. " -"Types such as integers and strings implement the default output, but arrays " -"only implement the debug output. This means that we must use debug output " -"here." +"Rust supports many [platforms and architectures](https://doc.rust-lang.org/nightly/rustc/" +"platform-support.html):" msgstr "" +"Rust prend en charge de nombreuses [plates-formes et architectures](https://doc.rust-lang." +"org/nightly/rustc/platform-support.html):" + +#: src/hello-world/what-is-rust.md +msgid "x86, ARM, WebAssembly, ..." +msgstr "x86, ARM, WebAssembly, ..." + +#: src/hello-world/what-is-rust.md +msgid "Linux, Mac, Windows, ..." +msgstr "Linux, Mac, Windows, ..." + +#: src/hello-world/what-is-rust.md +msgid "Rust is used for a wide range of devices:" +msgstr "Rust est utilisé sur une large gamme d'appareils :" + +#: src/hello-world/what-is-rust.md +msgid "firmware and boot loaders," +msgstr "firmware et boot loaders," + +#: src/hello-world/what-is-rust.md +msgid "smart displays," +msgstr "TV connectées," + +#: src/hello-world/what-is-rust.md +msgid "mobile phones," +msgstr "téléphones portables," + +#: src/hello-world/what-is-rust.md +msgid "desktops," +msgstr "ordinateurs," + +#: src/hello-world/what-is-rust.md +msgid "servers." +msgstr "serveurs." + +#: src/hello-world/what-is-rust.md +msgid "Rust fits in the same area as C++:" +msgstr "Rust s'inscrit dans le même domaine que C++ :" + +#: src/hello-world/what-is-rust.md +msgid "High flexibility." +msgstr "Grande flexibilité." + +#: src/hello-world/what-is-rust.md +msgid "High level of control." +msgstr "Haut niveau de contrôle." + +#: src/hello-world/what-is-rust.md +msgid "Can be scaled down to very constrained devices such as microcontrollers." +msgstr "Peut être réduit à des appareils très limités comme les microcontrôleurs." + +#: src/hello-world/what-is-rust.md +msgid "Has no runtime or garbage collection." +msgstr "N'a pas de temps d'exécution ou de `garbage collection`." + +#: src/hello-world/what-is-rust.md +msgid "Focuses on reliability and safety without sacrificing performance." +msgstr "Se concentre sur la fiabilité et la sécurité sans sacrifier les performances." + +#: src/hello-world/benefits.md +msgid "Some unique selling points of Rust:" +msgstr "Quelques points forts uniques au Rust :" + +#: src/hello-world/benefits.md +msgid "" +"_Compile time memory safety_ - whole classes of memory bugs are prevented at compile time" +msgstr "" +"_Sécurité mémoire à la compilation_ - des catégories entières de bogues de mémoire sont " +"évitées lors de la compilation" + +#: src/hello-world/benefits.md +msgid "No uninitialized variables." +msgstr "Aucune variable non initialisée." + +#: src/hello-world/benefits.md +msgid "No double-frees." +msgstr "Pas de double libération de mémoire." + +#: src/hello-world/benefits.md +msgid "No use-after-free." +msgstr "Aucune utilisation après la libération." + +#: src/hello-world/benefits.md +msgid "No `NULL` pointers." +msgstr "Pas de pointeurs `NULL`." + +#: src/hello-world/benefits.md +msgid "No forgotten locked mutexes." +msgstr "Pas de mutex verrouillés oubliés." + +#: src/hello-world/benefits.md +msgid "No data races between threads." +msgstr "Pas de `data races` entre les threads." + +#: src/hello-world/benefits.md +msgid "No iterator invalidation." +msgstr "Aucune invalidation d'itérateur." + +#: src/hello-world/benefits.md +msgid "" +"_No undefined runtime behavior_ - what a Rust statement does is never left unspecified" +msgstr "" +"_Aucun comportement d'exécution indéfini_ - le comportement d'une instruction Rust n'est " +"jamais laissé sans spécification." + +#: src/hello-world/benefits.md +msgid "Array access is bounds checked." +msgstr "L'accès à un tableau est vérifié dans les limites de celui-ci." + +#: src/hello-world/benefits.md +msgid "Integer overflow is defined (panic or wrap-around)." +msgstr "Le débordement d'entier est défini (panic ou comportement par défaut)." + +#: src/hello-world/benefits.md +msgid "_Modern language features_ - as expressive and ergonomic as higher-level languages" +msgstr "" +"_Caractéristiques des langues modernes_ - aussi expressives et ergonomiques que les " +"langues de niveau supérieur" + +#: src/hello-world/benefits.md +msgid "Enums and pattern matching." +msgstr "Énumérations et correspondance par motif." + +#: src/hello-world/benefits.md +msgid "Generics." +msgstr "Génériques." + +#: src/hello-world/benefits.md +msgid "No overhead FFI." +msgstr "Pas de surcoût FFI." + +#: src/hello-world/benefits.md +msgid "Zero-cost abstractions." +msgstr "Abstractions sans surcoût." + +#: src/hello-world/benefits.md +msgid "Great compiler errors." +msgstr "Excellentes erreurs de compilation." + +#: src/hello-world/benefits.md +msgid "Built-in dependency manager." +msgstr "Gestionnaire de dépendances intégré." + +#: src/hello-world/benefits.md +msgid "Built-in support for testing." +msgstr "Support intégré pour les tests." + +#: src/hello-world/benefits.md +msgid "Excellent Language Server Protocol support." +msgstr "Excellente prise en charge du protocole de serveur de langue." + +#: src/hello-world/benefits.md +msgid "" +"Do not spend much time here. All of these points will be covered in more depth later." +msgstr "" +"Ne vous attardez pas trop ici. Tous ces points seront abordés plus en détail " +"ultérieurement." + +#: src/hello-world/benefits.md +msgid "" +"Make sure to ask the class which languages they have experience with. Depending on the " +"answer you can highlight different features of Rust:" +msgstr "" +"Assurez-vous de demander à la classe dans quels langages ils ont de l'expérience. Selon " +"la réponse, vous pouvez mettre en évidence différentes fonctionnalités de Rust :" + +#: src/hello-world/benefits.md +msgid "" +"Experience with C or C++: Rust eliminates a whole class of _runtime errors_ via the " +"borrow checker. You get performance like in C and C++, but you don't have the memory " +"unsafety issues. In addition, you get a modern language with constructs like pattern " +"matching and built-in dependency management." +msgstr "" +"Expérience avec C ou C++ : Rust élimine toute une classe d'_erreurs d'exécution_ via le " +"`borroz checker`. On obtient des performances comme en C et C++, mais sans " +"problèmes d'insécurité mémoire. De plus, Rust est un langage moderne avec des " +"constructions telles que le filtrage par motif et la gestion intégrée des dépendances." + +#: src/hello-world/benefits.md +msgid "" +"Experience with Java, Go, Python, JavaScript...: You get the same memory safety as in " +"those languages, plus a similar high-level language feeling. In addition you get fast and " +"predictable performance like C and C++ (no garbage collector) as well as access to low-" +"level hardware (should you need it)." +msgstr "" +"Expérience avec Java, Go, Python, JavaScript... : On bénéficie de la même sécurité " +"mémoire que dans ces langages, plus une prise en main similaire à un langage de haut niveau. " +"En outre on obtient des performances rapides et prévisibles comme C et C++ (pas de `garbage " +"collection`) ainsi que l'accès bas niveau au matériel (si l'on en a besoin)." + +#: src/hello-world/playground.md +msgid "" +"The [Rust Playground](https://play.rust-lang.org/) provides an easy way to run short Rust " +"programs, and is the basis for the examples and exercises in this course. Try running the " +"\"hello-world\" program it starts with. It comes with a few handy features:" +msgstr "" +"L'environnement de jeu Rust (https://play.rust-lang.org/) permet d'exécuter facilement de " +"courts programmes Rust et sert de base aux exemples et exercices de ce cours. Essayez " +"d'exécuter le programme « hello-world » fourni. Il propose quelques fonctionnalités " +"pratiques :" + +#: src/hello-world/playground.md +msgid "" +"Under \"Tools\", use the `rustfmt` option to format your code in the \"standard\" way." +msgstr "" +"Sous « Outils », utilisez l’option `rustfmt` pour formater votre code de manière " +"« standard »." + +#: src/hello-world/playground.md +msgid "" +"Rust has two main \"profiles\" for generating code: Debug (extra runtime checks, less " +"optimization) and Release (fewer runtime checks, lots of optimization). These are " +"accessible under \"Debug\" at the top." +msgstr "" +"Rust propose deux profils principaux de génération de code : Debug (vérifications " +"d'exécution supplémentaires, optimisation réduite) et Release (vérifications d'exécution " +"réduites, optimisation importante). Ces profils sont accessibles via l'onglet « Debug » " +"en haut de la page." + +#: src/hello-world/playground.md +msgid "If you're interested, use \"ASM\" under \"...\" to see the generated assembly code." +msgstr "" +"Si cela vous intéresse, utilisez « ASM » sous « ... » pour voir le code assembleur généré." + +#: src/hello-world/playground.md +msgid "" +"As students head into the break, encourage them to open up the playground and experiment " +"a little. Encourage them to keep the tab open and try things out during the rest of the " +"course. This is particularly helpful for advanced students who want to know more about " +"Rust's optimizations or generated assembly." +msgstr "" +"À l'approche de la pause, encouragez les étudiants à explorer l'environnement de " +"développement et à expérimenter. Incitez-les à le laisser ouvert et à tester différentes " +"fonctionnalités pendant le reste du cours. Cela sera particulièrement utile aux étudiants " +"avancés qui souhaitent approfondir leurs connaissances sur les optimisations de Rust ou " +"le code assembleur généré." + +#: src/types-and-values.md src/concurrency/async.md +msgid "This segment should take about 40 minutes. It contains:" +msgstr "Ce segment devrait durer environ 40 minutes. Il contient :" + +#: src/types-and-values/hello-world.md +msgid "Let us jump into the simplest possible Rust program, a classic Hello World program:" +msgstr "" +"Passons au programme Rust le plus simple possible, un Bonjour Monde classique programme:" + +#: src/types-and-values/hello-world.md +msgid "\"Hello 🌍!\"" +msgstr "\"Hello 🌍!\"" + +#: src/types-and-values/hello-world.md +msgid "What you see:" +msgstr "Ce que vous voyez :" + +#: src/types-and-values/hello-world.md +msgid "Functions are introduced with `fn`." +msgstr "Les fonctions sont introduites avec `fn`." + +#: src/types-and-values/hello-world.md +msgid "The `main` function is the entry point of the program." +msgstr "La fonction `main` est le point d'entrée du programme." + +#: src/types-and-values/hello-world.md +msgid "Blocks are delimited by curly braces like in C and C++." +msgstr "Les blocs sont délimités par des accolades comme en C et C++." + +#: src/types-and-values/hello-world.md +msgid "Statements end with `;`." +msgstr "Les instructions se terminent par `;`." + +#: src/types-and-values/hello-world.md +msgid "`println` is a macro, indicated by the `!` in the invocation." +msgstr "`println` est une macro, indiquée par le `!` dans l'appel." + +#: src/types-and-values/hello-world.md +msgid "Rust strings are UTF-8 encoded and can contain any Unicode character." +msgstr "" +"Les strings Rust sont encodées en UTF-8 et peuvent contenir n'importe quel caractère " +"Unicode." + +#: src/types-and-values/hello-world.md +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 familiar." +msgstr "" +"Cette diapositive tente de mettre les étudiants à l'aise avec le code Rust. Ils en " +"verront une tonne durant les quatre prochains jours, alors nous commençons petit avec " +"quelque chose de familier." + +#: src/types-and-values/hello-world.md +msgid "" +"Rust is very much like other languages in the C/C++/Java tradition. It is imperative and " +"it doesn't try to reinvent things unless absolutely necessary." +msgstr "" +"Rust ressemble beaucoup aux autres langages traditionnels C/C++/Java. Il est impératif " +"(non fonctionnel) et il n'essaie pas de réinventer les choses à moins que ce soit " +"absolument nécessaire." + +#: src/types-and-values/hello-world.md +msgid "Rust is modern with full support for Unicode." +msgstr "Rust est moderne avec un support complet pour l'Unicode." + +#: src/types-and-values/hello-world.md +msgid "" +"Rust uses macros for situations where you want to have a variable number of arguments (no " +"function [overloading](../control-flow-basics/functions.md))." +msgstr "" +"Rust utilise des macros pour les situations où vous souhaitez avoir un nombre variable " +"d'arguments (pas de fonction [surchargées](../control-flow-basics/functions.md))." + +#: src/types-and-values/hello-world.md +msgid "" +"`println!` is a macro because it needs to handle an arbitrary number of arguments based " +"on the format string, which can't be done with a regular function. Otherwise it can be " +"treated like a regular function." +msgstr "" +"`println!` est une macro car elle doit gérer un nombre quelconque d'arguments en fonction " +"de la chaîne formattée, ce qu'une fonction classique ne peut pas faire. Autrement, elle " +"peut être utilisée comme une fonction classique." + +#: src/types-and-values/hello-world.md +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 "" +"Rust est multi-paradigme. Par exemple, il possède de puissantes [fonctionnalités de " +"programmation orientée objet](https://doc.rust-lang.org/book/ch17-00-oop.html), et, bien " +"qu'il ne soit pas un langage fonctionnel, il inclut un éventail de [concepts fonctionnels]" +"(https://doc.rust-lang.org/book/ch13-00-functional-features.html)." + +#: src/types-and-values/variables.md +msgid "Rust provides type safety via static typing. Variable bindings are made with `let`:" +msgstr "" +"Rust assure la sécurité des types grâce au typage statique. Les liaisons de variables " +"sont effectuées avec `let`." + +#: src/types-and-values/variables.md +msgid "\"x: {x}\"" +msgstr "\"x: {x}\"" + +#: src/types-and-values/variables.md +msgid "" +"// x = 20;\n" +" // println!(\"x: {x}\");\n" +msgstr "" +"// x = 20;\n" +" // println!(\"x: {x}\");\n" + +#: src/types-and-values/variables.md +msgid "" +"Uncomment the `x = 20` to demonstrate that variables are immutable by default. Add the " +"`mut` keyword to allow changes." +msgstr "" +"Décommentez la ligne `x = 20` pour montrer que les variables sont immuables par défaut. " +"Ajoutez le mot-clé `mut` pour autoriser les modifications." + +#: src/types-and-values/variables.md +msgid "" +"Warnings are enabled for this slide, such as for unused variables or unnecessary `mut`. " +"These are omitted in most slides to avoid distracting warnings. Try removing the mutation " +"but leaving the `mut` keyword in place." +msgstr "" +"Des avertissements sont activés pour cette diapositive, notamment concernant les " +"variables inutilisées ou les mutations inutiles. Ces avertissements sont généralement " +"omis afin d'éviter toute distraction. Essayez de supprimer la mutation tout en conservant " +"le mot-clé `mut`." + +#: src/types-and-values/variables.md +msgid "" +"The `i32` here is the type of the variable. This must be known at compile time, but type " +"inference (covered later) allows the programmer to omit it in many cases." +msgstr "" +"Le type `i32` est ici indiqué. Il doit être connu à la compilation, mais l'inférence de " +"type (traitée plus loin) permet au programmeur de l'omettre dans de nombreux cas." + +#: src/types-and-values/values.md +msgid "Here are some basic built-in types, and the syntax for literal values of each type." +msgstr "" +"Voici quelques types intégrés de base, ainsi que la syntaxe des valeurs littérales de " +"chaque type." + +#: src/types-and-values/values.md src/unsafe-rust/exercise.md +msgid "Types" +msgstr "Types" + +#: src/types-and-values/values.md +msgid "Literals" +msgstr "Littéraux" + +#: src/types-and-values/values.md +msgid "Signed integers" +msgstr "Entiers signés" + +#: src/types-and-values/values.md +msgid "`i8`, `i16`, `i32`, `i64`, `i128`, `isize`" +msgstr "`i8`, `i16`, `i32`, `i64`, `i128`, `isize`" + +#: src/types-and-values/values.md +msgid "`-10`, `0`, `1_000`, `123_i64`" +msgstr "`-10`, `0`, `1_000`, `123i64`" + +#: src/types-and-values/values.md +msgid "Unsigned integers" +msgstr "Entiers non signés" + +#: src/types-and-values/values.md +msgid "`u8`, `u16`, `u32`, `u64`, `u128`, `usize`" +msgstr "`u8`, `u16`, `u32`, `u64`, `u128`, `usize`" + +#: src/types-and-values/values.md +msgid "`0`, `123`, `10_u16`" +msgstr "`0`, `123`, `10u16`" + +#: src/types-and-values/values.md +msgid "Floating point numbers" +msgstr "Nombres à virgule flottante" + +#: src/types-and-values/values.md +msgid "`f32`, `f64`" +msgstr "`f32`, `f64`" + +#: src/types-and-values/values.md +msgid "`3.14`, `-10.0e20`, `2_f32`" +msgstr "`3.14`, `-10.0e20`, `2f32`" + +#: src/types-and-values/values.md +msgid "Unicode scalar values" +msgstr "Valeurs scalaires Unicode" + +#: src/types-and-values/values.md src/android/aidl/types/primitives.md +msgid "`char`" +msgstr "`char`" + +#: src/types-and-values/values.md +msgid "`'a'`, `'α'`, `'∞'`" +msgstr "`'a'`, `'α'`, `'∞'`" + +#: src/types-and-values/values.md +msgid "Booleans" +msgstr "Chaînes d'octets" + +#: src/types-and-values/values.md src/android/aidl/types/primitives.md +msgid "`bool`" +msgstr "`&[u8]`" + +#: src/types-and-values/values.md +msgid "`true`, `false`" +msgstr "`true`, `false`" + +#: src/types-and-values/values.md +msgid "The types have widths as follows:" +msgstr "La largeur des types est la suivante :" + +#: src/types-and-values/values.md +msgid "`iN`, `uN`, and `fN` are _N_ bits wide," +msgstr "`iN`, `uN` et `fN` ont une largeur de _N_ bits," + +#: src/types-and-values/values.md +msgid "`isize` and `usize` are the width of a pointer," +msgstr "`isize` et `usize` sont la largeur d'un pointeur," + +#: src/types-and-values/values.md +msgid "`char` is 32 bits wide," +msgstr "`char` a une largeur de 32 bits," + +#: src/types-and-values/values.md +msgid "`bool` is 8 bits wide." +msgstr "`bool` a une largeur de 8 bits." + +#: src/types-and-values/values.md +msgid "There are a few syntaxes that are not shown above:" +msgstr "Il existe quelques syntaxes qui ne sont pas présentées ci-dessus :" + +#: src/types-and-values/values.md +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 "" +"Les tirets bas dans les nombres sont facultatifs ; ils servent uniquement à faciliter la " +"lecture. Ainsi, `1_000` peut s'écrire `1000` (ou `10_00`), et `123_i64` peut s'écrire " +"`123i64`." + +#: src/types-and-values/arithmetic.md +msgid "\"result: {}\"" +msgstr "\"result: {}\"" + +#: src/types-and-values/arithmetic.md +msgid "" +"This is the first time we've seen a function other than `main`, but the meaning should be " +"clear: it takes three integers, and returns an integer. Functions will be covered in more " +"detail later." +msgstr "" +"C'est la première fois que nous voyons une fonction autre que `main`, mais son " +"fonctionnement est assez clair : elle prend trois entiers en argument et renvoie un " +"entier. Les fonctions seront abordées plus en détail ultérieurement." + +#: src/types-and-values/arithmetic.md +msgid "Arithmetic is very similar to other languages, with similar precedence." +msgstr "" +"L'arithmétique est très similaire à celle des autres langages, avec une priorité des " +"opérations comparable." + +#: src/types-and-values/arithmetic.md +msgid "" +"What about integer overflow? In C and C++ overflow of _signed_ integers is actually " +"undefined, and might do unknown things at runtime. In Rust, it's defined." +msgstr "" +"Qu'en est-il du dépassement de capacité des entiers ? En C et C++, le dépassement de " +"capacité des entiers _signés_ est indéfini et peut entraîner des comportements " +"imprévisibles à l'exécution. En Rust, il est défini." + +#: src/types-and-values/arithmetic.md +msgid "" +"Change the `i32`'s to `i16` to see an integer overflow, which panics (checked) in a debug " +"build and wraps in a release build. There are other options, such as overflowing, " +"saturating, and carrying. These are accessed with method syntax, e.g., `(a * b)." +"saturating_add(b * c).saturating_add(c * a)`." +msgstr "" +"Remplacez `i32` par `i16` pour observer un dépassement de capacité d'entier, qui provoque " +"une erreur critique (testé) en mode débogage et un retour à la ligne en mode production. " +"D'autres options sont disponibles, telles que le dépassement de capacité, la saturation " +"et la retenue. Elles sont accessibles via la syntaxe des méthodes, par exemple : `(a * b)." +"saturating_add(b * c).saturating_add(c * a)`." + +#: src/types-and-values/arithmetic.md +msgid "" +"In fact, the compiler will detect overflow of constant expressions, which is why the " +"example requires a separate function." +msgstr "" +"En fait, le compilateur détectera le dépassement de capacité des expressions constantes, " +"c'est pourquoi l'exemple nécessite une fonction séparée." + +#: src/types-and-values/inference.md +msgid "Rust will look at how the variable is _used_ to determine the type:" +msgstr "Rust examinera comment la variable est _utilisée_ pour déterminer le type :" + +#: src/types-and-values/inference.md +msgid "" +"This slide demonstrates how the Rust compiler infers types based on constraints given by " +"variable declarations and usages." +msgstr "" +"Cette diapositive montre comment le compilateur Rust déduit les types en fonction des " +"contraintes données par les déclarations et les utilisations des variables." + +#: src/types-and-values/inference.md +msgid "" +"It is very important to emphasize that variables declared like this are not of some sort " +"of dynamic \"any type\" that can hold any data. The machine code generated by such " +"declaration is identical to the explicit declaration of a type. The compiler does the job " +"for us and helps us write more concise code." +msgstr "" +"Il est très important de souligner que les variables déclarées de cette manière ne sont " +"pas d'une sorte de \"type any\" dynamique qui peut détenir des données. Le code machine " +"généré par une telle déclaration est identique à la déclaration explicite d'un type. Le " +"compilateur fait le travail pour nous et nous aide à écrire un code plus concis." + +#: src/types-and-values/inference.md +msgid "" +"When nothing constrains the type of an integer literal, Rust defaults to `i32`. This " +"sometimes appears as `{integer}` in error messages. Similarly, floating-point literals " +"default to `f64`." +msgstr "" +"En l'absence de contrainte sur le type d'un entier littéral, Rust utilise par défaut le " +"type `i32`. Ceci apparaît parfois sous la forme `{integer}` dans les messages d'erreur. " +"De même, les nombres à virgule flottante littéraux utilisent par défaut le type `f64`." + +#: src/types-and-values/inference.md +msgid "// ERROR: no implementation for `{float} == {integer}`\n" +msgstr "// ERROR: no implementation for `{float} == {integer}`\n" + +#: src/types-and-values/exercise.md +msgid "" +"The Fibonacci sequence begins with `[0, 1]`. For `n > 1`, the next number is the sum of " +"the previous two." +msgstr "" +"La suite de Fibonacci commence par `[0, 1]`. Pour `n > 1`, le nombre suivant est la somme " +"des deux précédents." + +#: src/types-and-values/exercise.md +msgid "" +"Write a function `fib(n)` that calculates the nth Fibonacci number. When will this " +"function panic?" +msgstr "" +"Écrivez une fonction `fib(n)` qui calcule le n-ième nombre de Fibonacci. Quand cette " +"fonction provoquera-t-elle une erreur ?" + +#: src/types-and-values/exercise.md +msgid "// The base case.\n" +msgstr "// The base case.\n" + +#: src/types-and-values/exercise.md src/control-flow-basics/exercise.md +msgid "\"Implement this\"" +msgstr "\"Implement this\"" + +#: src/types-and-values/exercise.md +msgid "// The recursive case.\n" +msgstr "// The recursive case.\n" + +#: src/types-and-values/exercise.md src/types-and-values/solution.md +msgid "\"fib({n}) = {}\"" +msgstr "\"fib({n}) = {}\"" + +#: src/types-and-values/exercise.md +msgid "This exercise is a classic introduction to recursion." +msgstr "Cet exercice est une introduction classique à la récursivité." + +#: src/types-and-values/exercise.md +msgid "Encourage students to think about the base cases and the recursive step." +msgstr "Encouragez les élèves à réfléchir aux cas de base et à l'étape récursive." + +#: src/types-and-values/exercise.md +msgid "" +"The question \"When will this function panic?\" is a hint to think about integer " +"overflow. The Fibonacci sequence grows quickly!" +msgstr "" +"La question « Quand cette fonction va-t-elle planter ?» nous incite à réfléchir au " +"dépassement de capacité des entiers. La suite de Fibonacci croît rapidement !" + +#: src/types-and-values/exercise.md +msgid "" +"Students might come up with an iterative solution as well, which is a great opportunity " +"to discuss the trade-offs between recursion and iteration (e.g., performance, stack " +"overflow for deep recursion)." +msgstr "" +"Les étudiants pourraient également proposer une solution itérative, ce qui constitue une " +"excellente occasion de discuter des compromis entre récursivité et itération (par " +"exemple, les performances, le débordement de la pile pour la récursivité profonde)." + +#: src/types-and-values/solution.md +msgid "" +"We use the `return` syntax here to return values from the function. Later in the course, " +"we will see that the last expression in a block is automatically returned, allowing us to " +"omit the `return` keyword for a more concise style." +msgstr "" +"Nous utilisons ici la syntaxe `return` pour renvoyer des valeurs depuis la fonction. Plus " +"tard dans ce cours, nous verrons que la dernière expression d'un bloc est automatiquement " +"renvoyée, ce qui nous permettra d'omettre le mot-clé `return` pour un style plus concis." + +#: src/types-and-values/solution.md +msgid "The `if` condition `n < 2` does not need parentheses, which is standard Rust style." +msgstr "" +"La condition `if` `n < 2` n'a pas besoin de parenthèses, ce qui est le style standard de " +"Rust." + +#: src/types-and-values/solution.md +msgid "Panic" +msgstr "Paniques" + +#: src/types-and-values/solution.md +msgid "" +"The exercise asks when this function will panic. The Fibonacci sequence grows very " +"rapidly. With `u32`, the calculated values will overflow the 32-bit integer limit " +"(4,294,967,295) when `n` reaches 48." +msgstr "" +"L'exercice demande à quel moment cette fonction va planter. La suite de Fibonacci croît " +"très rapidement. Avec `u32`, les valeurs calculées dépasseront la limite des entiers 32 " +"bits (4 294 967 295) lorsque `n` atteindra 48." + +#: src/types-and-values/solution.md +msgid "" +"In Rust, integer arithmetic checks for overflow in _debug mode_ (which is the default " +"when using `cargo run`). If an overflow occurs, the program will panic (crash with an " +"error message). In _release mode_ (`cargo run --release`), overflow checks are disabled " +"by default, and the number will wrap around (modular arithmetic), producing incorrect " +"results." +msgstr "" +"En Rust, les opérations arithmétiques sur les entiers sont contrôlées en mode débogage " +"(mode par défaut avec `cargo run`). En cas de dépassement de capacité, le programme " +"plante et affiche un message d'erreur. En mode release (`cargo run --release`), ces " +"contrôles sont désactivés par défaut et le nombre est alors incrémenté (arithmétique " +"modulaire), ce qui peut entraîner des résultats incorrects." + +#: src/types-and-values/solution.md +msgid "Walk through the solution step-by-step." +msgstr "Présentez la solution étape par étape." + +#: src/types-and-values/solution.md +msgid "Explain the recursive calls and how they lead to the final result." +msgstr "Expliquez les appels récursifs et comment ils mènent au résultat final." + +#: src/types-and-values/solution.md +msgid "" +"Discuss the integer overflow issue. With `u32`, the function will panic for `n` around " +"47. You can demonstrate this by changing the input to `main`." +msgstr "" +"Discutez du problème de dépassement de capacité des entiers. Avec `u32`, la fonction " +"générera une erreur critique pour `n` aux alentours de 47. Vous pouvez le démontrer en " +"remplaçant l'entrée par `main`." + +#: src/types-and-values/solution.md +msgid "" +"Show an iterative solution as an alternative and compare its performance and memory usage " +"with the recursive one. An iterative solution will be much more efficient." +msgstr "" +"Proposez une solution itérative comme alternative et comparez ses performances et son " +"utilisation de la mémoire avec celles de la solution récursive. La solution itérative " +"sera beaucoup plus efficace." + +#: src/types-and-values/solution.md src/control-flow-basics/match.md +#: src/references/dangling.md src/user-defined-types/named-structs.md +#: src/user-defined-types/enums.md src/user-defined-types/static.md +#: src/pattern-matching/infallible.md src/pattern-matching/destructuring-structs.md +#: src/pattern-matching/let-control-flow/let-else.md src/closures/syntax.md +#: src/memory-management/review.md src/memory-management/move.md +#: src/memory-management/copy-types.md src/borrowing/shared.md src/borrowing/borrowck.md +#: src/borrowing/interior-mutability/refcell.md src/lifetimes/borrow-one.md +#: src/iterators/motivation.md src/iterators/iterator.md src/iterators/helpers.md +#: src/iterators/collect.md src/modules/encapsulation.md src/error-handling/result.md +#: src/error-handling/anyhow.md src/concurrency/async/state-machine.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +#: src/idiomatic/leveraging-the-type-system/raii.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "More to Explore" +msgstr "Pour plus d'exploration" + +#: src/types-and-values/solution.md +msgid "" +"For a more advanced discussion, you can introduce memoization or dynamic programming to " +"optimize the recursive Fibonacci calculation, although this is beyond the scope of the " +"current topic." +msgstr "" +"Pour une discussion plus approfondie, vous pouvez introduire la mémoïsation ou la " +"programmation dynamique pour optimiser le calcul récursif de Fibonacci, bien que cela " +"dépasse le cadre du sujet actuel." + +#: src/control-flow-basics.md src/methods-and-traits.md src/modules.md src/testing.md +msgid "This segment should take about 45 minutes. It contains:" +msgstr "Ce segment devrait durer environ 45 minutes. Il contient :" + +#: src/control-flow-basics.md +msgid "if Expressions" +msgstr "expressions \"f\"" + +#: src/control-flow-basics.md src/pattern-matching.md src/concurrency/async.md +#: src/concurrency/async-control-flow.md +msgid "4 minutes" +msgstr "4 minutes" + +#: src/control-flow-basics.md +msgid "match Expressions" +msgstr "Expressions `match`" + +#: src/control-flow-basics.md +msgid "break and continue" +msgstr "`break` et `continue`" + +#: src/control-flow-basics.md +msgid "We will now cover the many kinds of flow control found in Rust." +msgstr "" +"Nous allons maintenant aborder les différents types de contrôle de flux présents dans " +"Rust." + +#: src/control-flow-basics.md +msgid "" +"Most of this will be very familiar to what you have seen in other programming languages." +msgstr "" +"La plupart de ces éléments vous sembleront très familiers si vous les avez déjà vus dans " +"d'autres langages de programmation." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "A block in Rust contains a sequence of expressions, enclosed by braces `{}`." +msgstr "" +"Un bloc en Rust contient une séquence d'expressions, encadrées par des accolades `{}`." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "The final expression of a block determines the value and type of the whole block." +msgstr "L'expression finale d'un bloc détermine la valeur et le type de l'ensemble du bloc." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "// dbg!(y);\n" +msgstr "// dbg!(y);\n" + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "If the last expression ends with `;`, then the resulting value and type is `()`." +msgstr "" +"Si la dernière expression se termine par `;`, alors la valeur et le type résultants sont " +"`()`." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "A variable's scope is limited to the enclosing block." +msgstr "La portée d'une variable est limitée au bloc qui la contient." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "" +"You can explain that dbg! is a Rust macro that prints and returns the value of a given " +"expression for quick and dirty debugging." +msgstr "" +"Vous pouvez expliquer que dbg! est une macro Rust qui affiche et renvoie la valeur d'une " +"expression donnée pour un débogage rapide et simple." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "" +"You can show how the value of the block changes by changing the last line in the block. " +"For instance, adding/removing a semicolon or using a `return`." +msgstr "" +"Vous pouvez montrer comment la valeur du bloc change en modifiant la dernière ligne du " +"bloc. Par exemple, ajouter/supprimer un point-virgule ou utiliser un `return`." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "Demonstrate that attempting to access `y` outside of its scope won't compile." +msgstr "" +"Démontrer que toute tentative d'accès à `y` en dehors de sa portée ne compilera pas." + +#: src/control-flow-basics/blocks-and-scopes.md +msgid "" +"Values are effectively \"deallocated\" when they go out of their scope, even if their " +"data on the stack is still there." +msgstr "" +"Les valeurs sont effectivement « désallouées » lorsqu'elles sortent de leur portée, même " +"si leurs données sur la pile sont toujours présentes." + +#: src/control-flow-basics/if.md +msgid "`if` expressions" +msgstr "les expressions `if`" + +#: src/control-flow-basics/if.md +msgid "" +"You use [`if` expressions](https://doc.rust-lang.org/reference/expressions/if-expr." +"html#if-expressions) exactly like `if` statements in other languages:" +msgstr "" +"Vous utilisez les [expressions `if`](https://doc.rust-lang.org/reference/expressions/if-" +"expr.html#if-expressions) exactement comme les instructions `if` dans d'autres langages :" + +#: src/control-flow-basics/if.md +msgid "\"zero!\"" +msgstr "\"zero!\"" + +#: src/control-flow-basics/if.md +msgid "\"biggish\"" +msgstr "\"biggish\"" + +#: src/control-flow-basics/if.md +msgid "\"huge\"" +msgstr "\"huge\"" + +#: src/control-flow-basics/if.md +msgid "" +"In addition, you can use `if` as an expression. The last expression of each block becomes " +"the value of the `if` expression:" +msgstr "" +"De plus, vous pouvez l'utiliser comme expression. Cela fait la même chose que ci-dessus:" + +#: src/control-flow-basics/if.md +msgid "\"small\"" +msgstr "\"small\"" + +#: src/control-flow-basics/if.md +msgid "\"large\"" +msgstr "\"large\"" + +#: src/control-flow-basics/if.md +msgid "\"number size: {}\"" +msgstr "\"number size: {}\"" + +#: src/control-flow-basics/if.md +msgid "" +"Because `if` is an expression and must have a particular type, both of its branch blocks " +"must have the same type. Show what happens if you add `;` after `\"small\"` in the second " +"example." +msgstr "" +"Puisque `if` est une expression et doit avoir un type particulier, ses deux blocs de " +"branchement doivent avoir le même type. Montrez ce qui se passe si vous ajoutez `;` après " +"`\"small\"` dans le deuxième exemple." + +#: src/control-flow-basics/if.md +msgid "" +"An `if` expression should be used in the same way as the other expressions. For example, " +"when it is used in a `let` statement, the statement must be terminated with a `;` as " +"well. Remove the `;` before `println!` to see the compiler error." +msgstr "" +"L'expression `if` doit être utilisée de la même manière que les autres expressions. Par " +"exemple, lorsqu'elle est utilisée dans une instruction `let`, cette dernière doit " +"également se terminer par un point-virgule (;). Supprimez le point-virgule avant `println!" +"` pour observer l'erreur du compilateur." + +#: src/control-flow-basics/match.md +msgid "`match` can be used to check a value against one or more options:" +msgstr "`match` permet de comparer une valeur à une ou plusieurs options :" + +#: src/control-flow-basics/match.md +msgid "\"one\"" +msgstr "\"one\"" + +#: src/control-flow-basics/match.md +msgid "\"ten\"" +msgstr "\"ten\"" + +#: src/control-flow-basics/match.md +msgid "\"one hundred\"" +msgstr "\"one hundred\"" + +#: src/control-flow-basics/match.md +msgid "\"something else\"" +msgstr "\"something else\"" + +#: src/control-flow-basics/match.md +msgid "Like `if` expressions, `match` can also return a value;" +msgstr "Tout comme les expressions `if`, `match` peut également renvoyer une valeur ;" + +#: src/control-flow-basics/match.md +msgid "\"The value of {flag} is {val}\"" +msgstr "\"La valeur de {flag} est {val}\"" + +#: src/control-flow-basics/match.md +msgid "" +"`match` arms are evaluated from top to bottom, and the first one that matches has its " +"corresponding body executed." +msgstr "" +"Les bras `match` sont évalués de haut en bas, et le premier qui correspond voit son corps " +"correspondant exécuté." + +#: src/control-flow-basics/match.md +msgid "" +"There is no fall-through between cases the way that `switch` works in other languages." +msgstr "" +"Il n'y a pas de transition automatique entre les cas, contrairement à ce qui se passe " +"avec `switch` dans d'autres langages." + +#: src/control-flow-basics/match.md +msgid "" +"The body of a `match` arm can be a single expression or a block. Technically this is the " +"same thing, since blocks are also expressions, but students may not fully understand that " +"symmetry at this point." +msgstr "" +"Le corps d'un bras de correspondance (`match`) peut être une expression unique ou un bloc. " +"Techniquement, c'est la même chose, puisque les blocs sont aussi des expressions, mais " +"les étudiants ne saisissent peut-être pas encore pleinement cette symétrie." + +#: src/control-flow-basics/match.md +msgid "" +"`match` expressions need to be exhaustive, meaning they either need to cover all possible " +"values or they need to have a default case such as `_`. Exhaustiveness is easiest to " +"demonstrate with enums, but enums haven't been introduced yet. Instead we demonstrate " +"matching on a `bool`, which is the simplest primitive type." +msgstr "" +"Les expressions `match` doivent être exhaustives, c'est-à-dire qu'elles doivent couvrir " +"toutes les valeurs possibles ou comporter un cas par défaut comme `_`. L'exhaustivité est " +"plus facile à démontrer avec les énumérations (`enum`), mais celles-ci n'ont pas encore été " +"introduites. Nous allons donc illustrer la correspondance avec un `bool`, qui est le type " +"primitif le plus simple." + +#: src/control-flow-basics/match.md +msgid "" +"This slide introduces `match` without talking about pattern matching, giving students a " +"chance to get familiar with the syntax without front-loading too much information. We'll " +"be talking about pattern matching in more detail tomorrow, so try not to go into too much " +"detail here." +msgstr "" +"Cette diapositive présente la fonction `match` sans aborder la correspondance de motifs, " +"ce qui permet aux étudiants de se familiariser avec sa syntaxe sans être submergés " +"d'informations dès le départ. Nous parlerons plus en détail de la correspondance de " +"motifs demain ; il est donc préférable de ne pas trop s'étendre sur le sujet ici." + +#: src/control-flow-basics/match.md +msgid "" +"To further motivate the usage of `match`, you can compare the examples to their " +"equivalents written with `if`. In the second case, matching on a `bool`, an `if {} else {}" +"` block is pretty similar. But in the first example that checks multiple cases, a `match` " +"expression can be more concise than `if {} else if {} else if {} else`." +msgstr "" +"Pour mieux comprendre l'intérêt de `match`, comparez les exemples à leurs équivalents " +"écrits avec `if`. Dans le second cas, la vérification d'un booléen (`if {} else {}`) est " +"assez similaire. En revanche, dans le premier exemple, qui teste plusieurs cas, une " +"expression `match` peut être plus concise que `if {} else if {} else if {} else`." + +#: src/control-flow-basics/match.md +msgid "" +"`match` also supports match guards, which allow you to add an arbitrary logical condition " +"that will get evaluated to determine if the match arm should be taken. However talking " +"about match guards requires explaining about pattern matching, which we're trying to " +"avoid on this slide." +msgstr "" +"`match` prend également en charge les gardes de correspondance, qui permettent d'ajouter " +"une condition logique arbitraire qui sera évaluée pour déterminer si la branche de " +"correspondance doit être utilisée. Cependant, aborder les gardes de correspondance " +"implique d'expliquer la correspondance de motifs, ce que nous cherchons à éviter dans " +"cette diapositive." + +#: src/control-flow-basics/loops.md +msgid "There are three looping keywords in Rust: `while`, `loop`, and `for`:" +msgstr "En Rust, il existe trois mots-clés pour les boucles : `while`, `loop` et `for`." + +#: src/control-flow-basics/loops.md +msgid "`while`" +msgstr "Expressions `while`" + +#: src/control-flow-basics/loops.md +msgid "" +"The [`while` keyword](https://doc.rust-lang.org/reference/expressions/loop-expr." +"html#predicate-loops) works much like in other languages, executing the loop body as long " +"as the condition is true." +msgstr "" +"Le mot-clé [`while`](https://doc.rust-lang.org/reference/expressions/loop-expr." +"html#predicate-loops) fonctionne de la même manière que dans d'autres langages, en " +"exécutant le corps de la boucle tant que la condition est vraie." + +#: src/control-flow-basics/loops/for.md +msgid "" +"The [`for` loop](https://doc.rust-lang.org/std/keyword.for.html) iterates over ranges of " +"values or the items in a collection:" +msgstr "" +"La boucle [`for`](https://doc.rust-lang.org/std/keyword.for.html) itère sur des plages de " +"valeurs ou sur les éléments d'une collection :" + +#: src/control-flow-basics/loops/for.md +msgid "" +"Under the hood `for` loops use a concept called \"iterators\" to handle iterating over " +"different kinds of ranges/collections. Iterators will be discussed in more detail later." +msgstr "" +"En interne, les boucles `for` utilisent un concept appelé « itérateurs » pour gérer " +"l'itération sur différents types d'intervalles/collections. Les itérateurs seront abordés " +"plus en détail ultérieurement." + +#: src/control-flow-basics/loops/for.md +msgid "" +"Note that the first `for` loop only iterates to `4`. Show the `1..=5` syntax for an " +"inclusive range." +msgstr "" +"Notez que la première boucle `for` ne s'exécute que jusqu'à `4`. Montrez la syntaxe `1.." +"=5` pour une plage inclusive." + +#: src/control-flow-basics/loops/loop.md +msgid "" +"The [`loop` statement](https://doc.rust-lang.org/std/keyword.loop.html) just loops " +"forever, until a `break`." +msgstr "" +"L'instruction [`loop`](https://doc.rust-lang.org/std/keyword.loop.html) boucle simplement " +"indéfiniment, jusqu'à un `break`." + +#: src/control-flow-basics/loops/loop.md +msgid "" +"The `loop` statement works like a `while true` loop. Use it for things like servers that " +"will serve connections forever." +msgstr "" +"L'instruction `loop` fonctionne comme une boucle `while true`. Utilisez-la pour des " +"applications telles que les serveurs qui maintiennent les connexions indéfiniment." + +#: src/control-flow-basics/break-continue.md +msgid "" +"If you want to immediately start the next iteration use [`continue`](https://doc.rust-" +"lang.org/reference/expressions/loop-expr.html#continue-expressions)." +msgstr "" +"Si vous souhaitez démarrer immédiatement l'itération suivante, utilisez [`continue`]" +"(https://doc.rust-lang.org/reference/expressions/loop-expr.html#continue-expressions)." + +#: src/control-flow-basics/break-continue.md +msgid "" +"If you want to exit any kind of loop early, use [`break`](https://doc.rust-lang.org/" +"reference/expressions/loop-expr.html#break-expressions). With `loop`, this can take an " +"optional expression that becomes the value of the `loop` expression." +msgstr "" +"Pour sortir prématurément d'une boucle, utilisez `break`. Avec `loop`, cette fonction " +"peut accepter une expression optionnelle qui devient la valeur de l'expression `loop`." + +#: src/control-flow-basics/break-continue.md +msgid "" +"Note that `loop` is the only looping construct that can return a non-trivial value. This " +"is because it's guaranteed to only return at a `break` statement (unlike `while` and " +"`for` loops, which can also return when the condition fails)." +msgstr "" +"Notez que `loop` est la seule boucle pouvant renvoyer une valeur non triviale. En effet, " +"elle ne renvoie une valeur qu'à l'issue d'une instruction `break` (contrairement aux " +"boucles `while` et `for`, qui peuvent également renvoyer une valeur même lorsque la " +"condition n'est pas remplie)." + +#: src/control-flow-basics/break-continue/labels.md +msgid "" +"Both `continue` and `break` can optionally take a label argument that is used to break " +"out of nested loops:" +msgstr "" +"Les fonctions `continue` et `break` peuvent toutes deux accepter, en option, un argument " +"label permettant de sortir des boucles imbriquées :" + +#: src/control-flow-basics/break-continue/labels.md +msgid "Labeled break also works on arbitrary blocks, e.g." +msgstr "" +"La fonction `break` étiquetée fonctionne également sur des blocs arbitraires, par " +"exemple :" + +#: src/control-flow-basics/break-continue/labels.md +msgid "\"This line gets skipped\"" +msgstr "\"Cette ligne est sautée\"" + +#: src/control-flow-basics/functions.md +msgid "" +"Declaration parameters are followed by a type (the reverse of some programming " +"languages), then a return type." +msgstr "" +"Les paramètres de déclaration sont suivis d'un type (l'inverse de certains langages de " +"programmation), puis d'un type de retour." + +#: src/control-flow-basics/functions.md +msgid "" +"The last expression in a function body (or any block) becomes the return value. Simply " +"omit the `;` at the end of the expression. The `return` keyword can be used for early " +"return, but the \"bare value\" form is idiomatic at the end of a function (refactor `gcd` " +"to use a `return`)." +msgstr "" +"La dernière expression du corps d'une fonction (ou de tout bloc) devient la valeur de " +"retour. Il suffit d'omettre le point-virgule à la fin de l'expression. Le mot-clé " +"`return` peut être utilisé pour un retour anticipé, mais la forme « valeur nue » est " +"idiomatique à la fin d'une fonction (refactorisez `gcd` pour utiliser `return`)." + +#: src/control-flow-basics/functions.md +msgid "" +"Some functions have no return value, and return the 'unit type', `()`. The compiler will " +"infer this if the return type is omitted." +msgstr "" +"Certaines fonctions ne renvoient aucune valeur et retournent le type unitaire `()`. Le " +"compilateur le déduira si le type de retour est omis." + +#: src/control-flow-basics/functions.md +msgid "Overloading is not supported -- each function has a single implementation." +msgstr "" +"La surcharge n'est pas prise en charge ; chaque fonction possède une seule implémentation." + +#: src/control-flow-basics/functions.md +msgid "" +"Always takes a fixed number of parameters. Default arguments are not supported. Macros " +"can be used to support variadic functions." +msgstr "" +"Cette fonction prend toujours un nombre fixe de paramètres. Les arguments par défaut ne " +"sont pas pris en charge. Des macros peuvent être utilisées pour les fonctions variadiques." + +#: src/control-flow-basics/functions.md +msgid "" +"Always takes a single set of parameter types. These types can be generic, which will be " +"covered later." +msgstr "" +"Cette fonction accepte toujours un seul ensemble de types de paramètres. Ces types " +"peuvent être génériques, ce qui sera abordé ultérieurement." + +#: src/control-flow-basics/macros.md +msgid "" +"Macros are expanded into Rust code during compilation, and can take a variable number of " +"arguments. They are distinguished by a `!` at the end. The Rust standard library includes " +"an assortment of useful macros." +msgstr "" +"Les macros sont transformées en code Rust lors de la compilation et peuvent accepter un " +"nombre variable d'arguments. Elles se distinguent par un point d'exclamation (!) à la " +"fin. La bibliothèque standard de Rust comprend un ensemble de macros utiles." + +#: src/control-flow-basics/macros.md +msgid "" +"`println!(format, ..)` prints a line to standard output, applying formatting described in " +"[`std::fmt`](https://doc.rust-lang.org/std/fmt/index.html)." +msgstr "" +"`println!(format, ..)` imprime une ligne sur la sortie standard, en appliquant la mise en " +"forme décrite dans [`std::fmt`](https://doc.rust-lang.org/std/fmt/index.html)." + +#: src/control-flow-basics/macros.md +msgid "`format!(format, ..)` works just like `println!` but returns the result as a string." +msgstr "" +"`format!(format, ..)` fonctionne exactement comme `println!` mais renvoie le résultat " +"sous forme de chaîne de caractères." + +#: src/control-flow-basics/macros.md +msgid "`dbg!(expression)` logs the value of the expression and returns it." +msgstr "`dbg!(expression)` enregistre la valeur de l'expression et la renvoie." + +#: src/control-flow-basics/macros.md +msgid "`todo!()` marks a bit of code as not-yet-implemented. If executed, it will panic." +msgstr "" +"La fonction `todo!()` signale une portion de code comme non encore implémentée. Son " +"exécution provoquera une erreur critique." + +#: src/control-flow-basics/macros.md +msgid "\"{n}! = {}\"" +msgstr "\"{n}! = {}\"" + +#: src/control-flow-basics/macros.md +msgid "" +"The takeaway from this section is that these common conveniences exist, and how to use " +"them. Why they are defined as macros, and what they expand to, is not especially critical." +msgstr "" +"L'essentiel à retenir de cette section est que ces fonctionnalités pratiques existent et " +"qu'il est possible de les utiliser. La raison pour laquelle elles sont définies comme des " +"macros, et ce qu'elles représentent, n'est pas particulièrement important." + +#: src/control-flow-basics/macros.md +msgid "" +"The course does not cover defining macros, but a later section will describe use of " +"derive macros." +msgstr "" +"Ce cours n'aborde pas la définition des macros, mais une section ultérieure décrira " +"l'utilisation des macros dérivées." + +#: src/control-flow-basics/macros.md src/pattern-matching/match.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "More To Explore" +msgstr "À découvrir plus en détail" + +#: src/control-flow-basics/macros.md +msgid "" +"There are a number of other useful macros provided by the standard library. Some other " +"examples you can share with students if they want to know more:" +msgstr "" +"La bibliothèque standard propose plusieurs autres macros utiles. Voici quelques exemples " +"supplémentaires que vous pouvez partager avec vos étudiants s'ils souhaitent en savoir " +"plus :" + +#: src/control-flow-basics/macros.md +msgid "" +"[`assert!`](https://doc.rust-lang.org/stable/std/macro.assert.html) and related macros " +"can be used to add assertions to your code. These are used heavily in writing tests." +msgstr "" +"La macro `assert!` (https://doc.rust-lang.org/stable/std/macro.assert.html) et les macros " +"apparentées permettent d'ajouter des assertions à votre code. Elles sont largement " +"utilisées dans l'écriture de tests." + +#: src/control-flow-basics/macros.md +msgid "" +"[`unreachable!`](https://doc.rust-lang.org/stable/std/macro.unreachable.html) is used to " +"mark a branch of control flow that should never be hit." +msgstr "" +"[`unreachable!`](https://doc.rust-lang.org/stable/std/macro.unreachable.html) est utilisé " +"pour marquer une branche du flux de contrôle qui ne devrait jamais être atteinte." + +#: src/control-flow-basics/macros.md +msgid "" +"[`eprintln!`](https://doc.rust-lang.org/stable/std/macro.eprintln.html) allows you to " +"print to stderr." +msgstr "" +"[`eprintln!`](https://doc.rust-lang.org/stable/std/macro.eprintln.html) vous permet " +"d'imprimer sur stderr." + +#: src/control-flow-basics/exercise.md +msgid "" +"The [Collatz Sequence](https://en.wikipedia.org/wiki/Collatz_conjecture) is defined as " +"follows, for an arbitrary n1 greater than zero:" +msgstr "" +"La [suite de Collatz](https://en.wikipedia.org/wiki/Collatz_conjecture) est définie comme " +"suit, pour un n1 arbitraire supérieur à zéro :" + +#: src/control-flow-basics/exercise.md +msgid "If _ni_ is 1, then the sequence terminates at _ni_." +msgstr "Si _ni_ vaut 1, alors la séquence se termine à _ni_." + +#: src/control-flow-basics/exercise.md +msgid "If _ni_ is even, then _ni+1 = ni / 2_." +msgstr "Si _ni_ est pair, alors _ni+1 = ni / 2_." + +#: src/control-flow-basics/exercise.md +msgid "If _ni_ is odd, then _ni+1 = 3 * ni + 1_." +msgstr "Si _ni_ est impair, alors _ni+1 = 3 * ni + 1_." + +#: src/control-flow-basics/exercise.md +msgid "For example, beginning with _n1_ = 3:" +msgstr "Par exemple, en commençant par _n1_ = 3 :" + +#: src/control-flow-basics/exercise.md +msgid "3 is odd, so _n2_ = 3 * 3 + 1 = 10;" +msgstr "3 est impair, donc _n2_ = 3 * 3 + 1 = 10 ;" + +#: src/control-flow-basics/exercise.md +msgid "10 is even, so _n3_ = 10 / 2 = 5;" +msgstr "10 est pair, donc _n3_ = 10 / 2 = 5;" + +#: src/control-flow-basics/exercise.md +msgid "5 is odd, so _n4_ = 3 * 5 + 1 = 16;" +msgstr "5 est impair, donc _n4_ = 3 * 5 + 1 = 16 ;" + +#: src/control-flow-basics/exercise.md +msgid "16 is even, so _n5_ = 16 / 2 = 8;" +msgstr "16 est pair, donc _n5_ = 16 / 2 = 8;" + +#: src/control-flow-basics/exercise.md +msgid "8 is even, so _n6_ = 8 / 2 = 4;" +msgstr "8 est pair, donc _n6_ = 8 / 2 = 4;" + +#: src/control-flow-basics/exercise.md +msgid "4 is even, so _n7_ = 4 / 2 = 2;" +msgstr "4 est pair, donc _n7_ = 4 / 2 = 2 ;" + +#: src/control-flow-basics/exercise.md +msgid "2 is even, so _n8_ = 1; and" +msgstr "2 est pair, donc _n8_ = 1; et" + +#: src/control-flow-basics/exercise.md +msgid "the sequence terminates." +msgstr "La séquence se termine." + +#: src/control-flow-basics/exercise.md +msgid "" +"Write a function to calculate the length of the Collatz sequence for a given initial `n`." +msgstr "" +"Écrivez une fonction pour calculer la longueur de la suite de Collatz pour une valeur " +"initiale donnée de `n`." + +#: src/control-flow-basics/exercise.md src/control-flow-basics/solution.md +msgid "/// Determine the length of the collatz sequence beginning at `n`.\n" +msgstr "/// Déterminez la longueur de la séquence de Collatz commençant a `n`.\n" + +#: src/control-flow-basics/exercise.md src/control-flow-basics/solution.md +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +msgid "\"Length: {}\"" +msgstr "\"Length: {}\"" + +#: src/control-flow-basics/exercise.md src/control-flow-basics/solution.md +msgid "// should be 15\n" +msgstr "// devrait être 15\n" + +#: src/control-flow-basics/solution.md +msgid "This solution demonstrates a few key Rust features:" +msgstr "Cette solution illustre quelques fonctionnalités clés de Rust :" + +#: src/control-flow-basics/solution.md +msgid "" +"**`mut` arguments:** The `n` argument is declared as `mut n`. This makes the local " +"variable `n` mutable within the function scope. It does _not_ affect the caller's value, " +"as integers are `Copy` types passed by value." +msgstr "" +"**Arguments `mut` :** L’argument `n` est déclaré comme `mut n`. Cela rend la variable " +"locale `n` mutable dans la portée de la fonction. Cela n’affecte _pas_ la valeur de " +"l’appelant, car les entiers sont des types `Copy` passés par valeur." + +#: src/control-flow-basics/solution.md +msgid "" +"**`if` expressions:** Rust's `if` is an expression, meaning it produces a value. We " +"assign the result of the `if`/`else` block directly to `n`. This is more concise than " +"writing `n = ...` inside each branch." +msgstr "" +"**Expressions `if` :** En Rust, `if` est une expression, c’est-à-dire qu’elle produit une " +"valeur. On assigne directement le résultat du bloc `if`/`else` à `n`. C’est plus concis " +"que d’écrire `n = ...` dans chaque branche." + +#: src/control-flow-basics/solution.md +msgid "" +"**Implicit return:** The function ends with `len` (without a semicolon), which is " +"automatically returned." +msgstr "" +"**Retour implicite :** La fonction se termine par `len` (sans point-virgule), qui est " +"automatiquement renvoyé." + +#: src/control-flow-basics/solution.md +msgid "" +"Note that `n` must be strictly greater than 0 for the Collatz sequence to be valid. The " +"function signature takes `i32`, but the problem description implies positive integers. A " +"more robust implementation might use `u32` or return an `Option` or `Result` to handle " +"invalid inputs (0 or negative numbers), but panic or infinite loops are potential " +"outcomes here if `n <= 0`." +msgstr "" +"Notez que `n` doit être strictement supérieur à 0 pour que la suite de Collatz soit " +"valide. La signature de la fonction prend `i32`, mais l'énoncé du problème suppose des " +"entiers positifs. Une implémentation plus robuste pourrait utiliser `u32` ou renvoyer une " +"`Option` ou `Result` pour gérer les entrées invalides (0 ou nombres négatifs), mais des " +"erreurs critiques ou des boucles infinies sont possibles si `n <= 0`." + +#: src/control-flow-basics/solution.md +msgid "" +"The overflow is a potential issue if `n` grows too large, similar to the Fibonacci " +"exercise." +msgstr "" +"Le dépassement de capacité est un problème potentiel si `n` devient trop grand, similaire " +"à l'exercice de Fibonacci." + +#: src/welcome-day-1-afternoon.md src/welcome-day-2-afternoon.md +#: src/welcome-day-3-afternoon.md src/welcome-day-4-afternoon.md +msgid "Welcome Back" +msgstr "Bienvenue" + +#: src/welcome-day-1-afternoon.md +msgid "" +"Including 10 minute breaks, this session should take about 2 hours and 45 minutes. It " +"contains:" +msgstr "" +"En comptant les pauses de 10 minutes, cette session devrait durer environ 2 heures et 45 " +"minutes. Elle comprend :" + +#: src/tuples-and-arrays.md +msgid "This segment should take about 35 minutes. It contains:" +msgstr "Ce segment devrait durer environ 35 minutes. Il contient :" + +#: src/tuples-and-arrays.md +msgid "" +"We have seen how primitive types work in Rust. Now it's time for you to start building " +"new composite types." +msgstr "" +"Nous avons vu comment fonctionnent les types primitifs en Rust. Il est maintenant temps " +"pour vous de commencer à créer de nouveaux types composites." + +#: src/tuples-and-arrays/arrays.md +msgid "" +"Arrays can also be initialized using the shorthand syntax, e.g. `[0; 1024]`. This can be " +"useful when you want to initialize all elements to the same value, or if you have a large " +"array that would be hard to initialize manually." +msgstr "" +"Les tableaux peuvent également être initialisés à l'aide de la syntaxe abrégée, par " +"exemple `[0; 1024]`. Cela peut s'avérer utile lorsque vous souhaitez initialiser tous les " +"éléments à la même valeur, ou si vous avez un grand tableau qu'il serait difficile " +"d'initialiser manuellement." + +#: src/tuples-and-arrays/arrays.md +msgid "" +"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. Slices, which have a size " +"determined at runtime, are covered later." +msgstr "" +"Une valeur de type tableau `[T; N]` contient `N` (une constante de compilation) éléments " +"du même type `T`. Notez que la longueur du tableau fait partie de son type, ce qui " +"signifie que `[u8; 3]` et `[u8; 4]` sont considérés comme deux types différents. Les " +"tranches, dont la taille est déterminée à l'exécution, seront abordées ultérieurement." + +#: src/tuples-and-arrays/arrays.md +msgid "" +"Try accessing an out-of-bounds array element. The compiler is able to determine that the " +"index is unsafe, and will not compile the code:" +msgstr "" +"Tentez d'accéder à un élément de tableau situé en dehors des limites. Le compilateur " +"détecte que l'index est non sécurisé et ne compilera pas le code." + +#: src/tuples-and-arrays/arrays.md +msgid "\"a: {a:?}\"" +msgstr "\"a: {a:?}\"" + +#: src/tuples-and-arrays/arrays.md +msgid "" +"Array accesses are checked at runtime. Rust optimizes these checks away when possible; " +"meaning if the compiler can prove the access is safe, it removes the runtime check for " +"better performance. They can be avoided using unsafe Rust. The optimization is so good " +"that it's hard to give an example of runtime checks failing. The following code will " +"compile but panic at runtime:" +msgstr "" +"L'accès aux tableaux est vérifié à l'exécution. Rust optimise ces vérifications autant " +"que possible ; autrement dit, si le compilateur peut garantir la sécurité de l'accès, il " +"supprime la vérification à l'exécution pour de meilleures performances. Ces vérifications " +"peuvent être évitées en utilisant Rust non sécurisé. L'optimisation est si performante " +"qu'il est difficile de trouver un exemple d'échec des vérifications à l'exécution. Le " +"code suivant compilera, mais provoquera une erreur à l'exécution :" + +#: src/tuples-and-arrays/arrays.md +msgid "We can use literals to assign values to arrays." +msgstr "Nous pouvons utiliser des littéraux pour assigner des valeurs aux tableaux." + +#: src/tuples-and-arrays/arrays.md +msgid "" +"Arrays are not heap-allocated. They are regular values with a fixed size known at compile " +"time, meaning they go on the stack. This can be different from what students expect if " +"they come from a garbage-collected language, where arrays may be heap allocated by " +"default." +msgstr "" +"Les tableaux ne sont pas alloués sur le tas. Ce sont des valeurs classiques de taille " +"fixe, connue à la compilation, et donc stockées sur la pile. Cela peut différer des " +"attentes des étudiants venant d'un langage `garbage collecté`, où les tableaux sont " +"alloués sur le tas par défaut." + +#: src/tuples-and-arrays/arrays.md +msgid "" +"There is no way to remove elements from an array, nor add elements to an array. The " +"length of an array is fixed at compile-time, and so its length cannot change at runtime." +msgstr "" +"Il est impossible de supprimer ou d'ajouter des éléments à un tableau. La longueur d'un " +"tableau est fixée à la compilation et ne peut donc pas changer à l'exécution." #: src/tuples-and-arrays/arrays.md +msgid "Debug Printing" +msgstr "Débogage par print" + +#: src/tuples-and-arrays/arrays.md +msgid "" +"The `println!` macro asks for the debug implementation with the `?` format parameter: `{}" +"` gives the default output, `{:?}` gives the debug output. Types such as integers and " +"strings implement the default output, but arrays only implement the debug output. This " +"means that we must use debug output here." +msgstr "" +"La macro `println!` demande le mode débogage avec le paramètre de format `?` : `{}` " +"affiche l'affichage par défaut, `{:?}` affiche l'affichage de débogage. Les types tels " +"que les entiers et les chaînes de caractères affichent l'affichage par défaut, tandis que " +"les tableaux n'affichent que l'affichage de débogage. Il est donc impératif d'utiliser " +"l'affichage de débogage." + +#: src/tuples-and-arrays/arrays.md +msgid "" +"Adding `#`, eg `{a:#?}`, invokes a \"pretty printing\" format, which can be easier to " +"read." +msgstr "" +"L'ajout de `#`, par exemple `{a:#?}`, invoque un format d'« impression soignée », qui " +"peut être plus facile à lire." + +#: src/tuples-and-arrays/tuples.md +msgid "Like arrays, tuples have a fixed length." +msgstr "Comme les tableaux, les tuples ont une longueur fixe." + +#: src/tuples-and-arrays/tuples.md +msgid "Tuples group together values of different types into a compound type." +msgstr "Les tuples regroupent des valeurs de différents types dans un type composé." + +#: src/tuples-and-arrays/tuples.md +msgid "" +"Fields of a tuple can be accessed by the period and the index of the value, e.g. `t.0`, " +"`t.1`." +msgstr "" +"Les champs d'un tuple sont accessibles par le point et l'index de la valeur, par ex. " +"`t.0`, `t.1`." + +#: src/tuples-and-arrays/tuples.md +msgid "" +"The empty tuple `()` is referred to as the \"unit type\" and signifies absence of a " +"return value, akin to `void` in other languages." +msgstr "" +"Le tuple vide `()` est appelé « type unitaire » et signifie l'absence de valeur de " +"retour, semblable à `void` dans d'autres langages." + +#: src/tuples-and-arrays/tuples.md +msgid "" +"Unlike arrays, tuples cannot be used in a `for` loop. This is because a `for` loop " +"requires all the elements to have the same type, which may not be the case for a tuple." +msgstr "" +"Contrairement aux tableaux, les tuples ne peuvent pas être utilisés dans une boucle " +"`for`. En effet, une boucle `for` exige que tous les éléments soient du même type, ce qui " +"n'est pas toujours le cas pour un tuple." + +#: src/tuples-and-arrays/tuples.md +msgid "" +"There is no way to add or remove elements from a tuple. The number of elements and their " +"types are fixed at compile time and cannot be changed at runtime." +msgstr "" +"Il est impossible d'ajouter ou de supprimer des éléments d'un tuple. Le nombre d'éléments " +"et leurs types sont fixés à la compilation et ne peuvent être modifiés à l'exécution." + +#: src/tuples-and-arrays/iteration.md +msgid "The `for` statement supports iterating over arrays (but not tuples)." +msgstr "L'instruction `for` permet d'itérer sur des tableaux (mais pas sur des tuples)." + +#: src/tuples-and-arrays/iteration.md +msgid "This functionality uses the `IntoIterator` trait, but we haven't covered that yet." +msgstr "" +"Cette fonctionnalité utilise le trait `IntoIterator`, mais nous ne l'avons pas encore " +"abordé." + +#: src/tuples-and-arrays/iteration.md +msgid "" +"The `assert_ne!` macro is new here. There are also `assert_eq!` and `assert!` macros. " +"These are always checked, while debug-only variants like `debug_assert!` compile to " +"nothing in release builds." +msgstr "" +"La macro `assert_ne!` est nouvelle. Il existe également les macros `assert_eq!` et " +"`assert!`. Celles-ci sont toujours vérifiées, tandis que les variantes réservées au " +"débogage, comme `debug_assert!`, ne produisent aucun résultat lors de la compilation en " +"mode production." + +#: src/tuples-and-arrays/destructuring.md +msgid "" +"Rust supports using pattern matching to destructure a larger value like a tuple into its " +"constituent parts:" +msgstr "" +"Rust permet d'utiliser la correspondance de modèles pour déstructurer une valeur plus " +"grande, comme un tuple, en ses éléments constitutifs :" + +#: src/tuples-and-arrays/destructuring.md +msgid "\"{tuple:?}: {}\"" +msgstr "\"{tuple:?}: {}\"" + +#: src/tuples-and-arrays/destructuring.md +msgid "\"ordered\"" +msgstr "\"ordonné\"" + +#: src/tuples-and-arrays/destructuring.md +msgid "\"unordered\"" +msgstr "\"non-ordonné\"" + +#: src/tuples-and-arrays/destructuring.md +msgid "" +"The patterns used here are \"irrefutable\", meaning that the compiler can statically " +"verify that the value on the right of `=` has the same structure as the pattern." +msgstr "" +"Les modèles utilisés ici sont « irréfutables », ce qui signifie que le compilateur peut " +"vérifier statiquement que la valeur à droite de `=` a la même structure que le modèle." + +#: src/tuples-and-arrays/destructuring.md +msgid "" +"A variable name is an irrefutable pattern that always matches any value, hence why we can " +"also use `let` to declare a single variable." +msgstr "" +"Un nom de variable est un modèle irréfutable qui correspond toujours à n'importe quelle " +"valeur, c'est pourquoi nous pouvons également utiliser `let` pour déclarer une seule " +"variable." + +#: src/tuples-and-arrays/destructuring.md +msgid "" +"Rust also supports using patterns in conditionals, allowing for equality comparison and " +"destructuring to happen at the same time. This form of pattern matching will be discussed " +"in more detail later." +msgstr "" +"Rust prend également en charge l'utilisation de motifs dans les conditions, permettant " +"ainsi d'effectuer simultanément une comparaison d'égalité et une déstructuration. Cette " +"forme de correspondance de motifs sera abordée plus en détail ultérieurement." + +#: src/tuples-and-arrays/destructuring.md +msgid "" +"Edit the examples above to show the compiler error when the pattern doesn't match the " +"value being matched on." +msgstr "" +"Modifiez les exemples ci-dessus pour afficher l'erreur du compilateur lorsque le modèle " +"ne correspond pas à la valeur sur laquelle la correspondance est effectuée." + +#: src/tuples-and-arrays/exercise.md +msgid "Arrays can contain other arrays:" +msgstr "Les tableaux peuvent contenir d'autres tableaux :" + +#: src/tuples-and-arrays/exercise.md +msgid "What is the type of this variable?" +msgstr "Quel est le type de cette variable ?" + +#: src/tuples-and-arrays/exercise.md +msgid "" +"Use an array such as the above to write a function `transpose` that transposes a matrix " +"(turns rows into columns):" +msgstr "" +"Utilisez un tableau comme celui ci-dessus pour écrire une fonction `transpose` qui " +"transpose une matrice (transforme les lignes en colonnes) :" + +#: src/tuples-and-arrays/exercise.md +msgid "" +"Copy the code below to and implement the function. This " +"function only operates on 3×3 matrices." +msgstr "" +"Copiez le code ci-dessous dans et implémentez la fonction. " +"Cette fonction ne fonctionne qu'avec des matrices 3×3." + +#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md +msgid "// <-- the comment makes rustfmt add a newline\n" +msgstr "// <-- the comment makes rustfmt add a newline\n" + +#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md +msgid "\"Original:\"" +msgstr "\"Original:\"" + +#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md +msgid "\"{row:?}\"" +msgstr "\"{row:?}\"" + +#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md +msgid "\"\\nTransposed:\"" +msgstr "\"\\nTransposée:\"" + +#: src/tuples-and-arrays/solution.md +msgid "" +"**Array Types:** The type `[[i32; 3]; 3]` represents an array of size 3, where each " +"element is itself an array of 3 `i32`s. This is how multi-dimensional arrays are " +"typically represented in Rust." +msgstr "" +"**Types de tableaux :** Le type `[[i32; 3]; 3]` représente un tableau de taille 3, où " +"chaque élément est lui-même un tableau de 3 `i32`. C’est ainsi que les tableaux " +"multidimensionnels sont généralement représentés en Rust." + +#: src/tuples-and-arrays/solution.md +msgid "" +"**Initialization:** We initialize `result` with zeros (`[[0; 3]; 3]`) before filling it. " +"Rust requires all variables to be initialized before use; there is no concept of " +"\"uninitialized memory\" in safe Rust." +msgstr "" +"**Initialisation :** On initialise `result` avec des zéros (`[[0; 3]; 3]`) avant de la " +"remplir. Rust exige que toutes les variables soient initialisées avant utilisation ; la " +"notion de « mémoire non initialisée » n’existe pas en Rust sécurisé." + +#: src/tuples-and-arrays/solution.md +msgid "" +"**Copy Semantics:** Arrays of `Copy` types (like `i32`) are themselves `Copy`. When we " +"pass `matrix` to the function, it is copied by value. The `result` variable is a new, " +"separate array." +msgstr "" +"**Sémantique de la copie :** Les tableaux de types `Copy` (comme `i32`) sont eux-mêmes " +"des `Copy`. Lorsqu'on passe `matrix` à la fonction, elle est copiée par valeur. La " +"variable `result` est un nouveau tableau distinct." + +#: src/tuples-and-arrays/solution.md +msgid "" +"**Iteration:** We use standard `for` loops with ranges (`0..3`) to iterate over indices. " +"Rust also has powerful iterators, which we will see later, but indexing is " +"straightforward for this matrix transposition." +msgstr "" +"**Itération :** Nous utilisons des boucles `for` standard avec des intervalles (`0..3`) " +"pour parcourir les indices. Rust propose également des itérateurs puissants, que nous " +"verrons plus tard, mais l’indexation est simple pour cette transposition de matrice." + +#: src/tuples-and-arrays/solution.md +msgid "" +"Mention that `[i32; 3]` is a distinct type from `[i32; 4]`. Array sizes are part of the " +"type signature." +msgstr "" +"Précisez que `[i32; 3]` est un type distinct de `[i32; 4]`. La taille des tableaux fait " +"partie de la signature du type." + +#: src/tuples-and-arrays/solution.md +msgid "" +"Ask students what would happen if they tried to return `matrix` directly after modifying " +"it (if they changed the signature to `mut matrix`). (Answer: It would work, but it would " +"return a modified _copy_, leaving the original in `main` unchanged)." +msgstr "" +"Demandez aux étudiants ce qui se passerait s'ils essayaient de renvoyer directement " +"`matrix` après l'avoir modifié (en changeant la signature en `mut matrix`). (Réponse : " +"Cela fonctionnerait, mais cela renverrait une copie modifiée, laissant l'original dans " +"`main` inchangé)." + +#: src/references.md src/smart-pointers.md src/iterators.md src/error-handling.md +#: src/concurrency/async-pitfalls.md +msgid "This segment should take about 55 minutes. It contains:" +msgstr "Ce segment devrait durer environ 55 minutes. Il contient :" + +#: src/references/shared.md +msgid "" +"A reference provides a way to access another value without taking ownership of the value, " +"and is also called \"borrowing\". Shared references are read-only, and the referenced " +"data cannot change." +msgstr "" +"Une référence permet d'accéder à une autre valeur sans en prendre possession ; on parle " +"alors d'« emprunt ». Les références partagées sont en lecture seule et les données " +"référencées ne peuvent pas être modifiées." + +#: src/references/shared.md src/std-traits/solution.md +msgid "'A'" +msgstr "'A'" + +#: src/references/shared.md +msgid "'B'" +msgstr "'B'" + +#: src/references/shared.md +msgid "" +"A shared reference to a type `T` has type `&T`. A reference value is made with the `&` " +"operator. The `*` operator \"dereferences\" a reference, yielding its value." +msgstr "" +"Une référence partagée à un type `T` est de type `&T`. Une valeur de référence est créée " +"avec l'opérateur `&`. L'opérateur `*` déréférence une référence, renvoyant sa valeur." + +#: src/references/shared.md +msgid "References can never be null in Rust, so null checking is not necessary." +msgstr "" +"En Rust, les références ne peuvent jamais être nulles, la vérification de valeur nulle " +"n'est donc pas nécessaire." + +#: src/references/shared.md +msgid "" +"A reference is said to \"borrow\" the value it refers to, and this is a good model for " +"students not familiar with pointers: code can use the reference to access the value, but " +"is still \"owned\" by the original variable. The course will get into more detail on " +"ownership in day 3." +msgstr "" +"On dit qu'une référence « emprunte » la valeur à laquelle elle fait référence. C'est un " +"bon modèle pour les étudiants qui ne connaissent pas les pointeurs : le code peut " +"utiliser la référence pour accéder à la valeur, mais celle-ci reste « appartenant » à la " +"variable d'origine. La notion de propriété sera abordée plus en détail le troisième jour " +"du cours." + +#: src/references/shared.md +msgid "" +"References are implemented as pointers, and a key advantage is that they can be much " +"smaller than the thing they point to. Students familiar with C or C++ will recognize " +"references as pointers. Later parts of the course will cover how Rust prevents the memory-" +"safety bugs that come from using raw pointers." +msgstr "" +"Les références sont implémentées sous forme de pointeurs, et leur principal avantage " +"réside dans leur taille, bien inférieure à celle de l'objet pointé. Les étudiants " +"connaissant le C ou le C++ reconnaîtront les références comme des pointeurs. La suite du " +"cours expliquera comment Rust prévient les failles de sécurité mémoire liées à " +"l'utilisation de pointeurs bruts." + +#: src/references/shared.md +msgid "" +"Explicit referencing with `&` is required, except when invoking methods, where Rust " +"performs automatic referencing and dereferencing." +msgstr "" +"Un référencement explicite avec `&` est requis, sauf lors de l'appel de méthodes, où Rust " +"effectue un référencement et un déréférencement automatiques." + +#: src/references/shared.md +msgid "" +"Rust will auto-dereference in some cases, in particular when invoking methods (try `r." +"is_ascii()`). There is no need for an `->` operator like in C++." +msgstr "" +"Rust déréférence automatiquement les références dans certains cas, notamment lors de " +"l'appel de méthodes (essayez `r.is_ascii()`). Il n'est pas nécessaire d'utiliser " +"l'opérateur `->` comme en C++." + +#: src/references/shared.md +msgid "" +"In this example, `r` is mutable so that it can be reassigned (`r = &b`). Note that this " +"re-binds `r`, so that it refers to something else. This is different from C++, where " +"assignment to a reference changes the referenced value." +msgstr "" +"Dans cet exemple, `r` est mutable et peut donc être réassigné (`r = &b`). Notez que cela " +"modifie la référence de `r`, qui pointe désormais vers une autre valeur. Ceci diffère du " +"C++, où l'affectation à une référence modifie la valeur référencée." + +#: src/references/shared.md +msgid "" +"A shared reference does not allow modifying the value it refers to, even if that value " +"was mutable. Try `*r = 'X'`." +msgstr "" +"Une référence partagée ne permet pas de modifier la valeur à laquelle elle fait " +"référence, même si cette valeur était modifiable. Essayez `*r = 'X'`." + +#: src/references/shared.md +msgid "" +"Rust is tracking the lifetimes of all references to ensure they live long enough. " +"Dangling references cannot occur in safe Rust." +msgstr "" +"Rust surveille la durée de vie de toutes les références pour s'assurer qu'elles " +"persistent suffisamment longtemps. Les références orphelines sont impossibles dans un " +"environnement Rust sécurisé." + +#: src/references/shared.md +msgid "" +"We will talk more about borrowing and preventing dangling references when we get to " +"ownership." +msgstr "" +"Nous reparlerons des emprunts et de la prévention des références pendantes lorsque nous " +"aborderons la question de la propriété." + +#: src/references/exclusive.md +msgid "" +"Exclusive references, also known as mutable references, allow changing the value they " +"refer to. They have type `&mut T`." +msgstr "" +"Les références exclusives, également appelées références mutables, permettent de modifier " +"la valeur à laquelle elles font référence. Elles sont de type `&mut T`." + +#: src/references/exclusive.md +msgid "" +"\"Exclusive\" means that only this reference can be used to access the value. No other " +"references (shared or exclusive) can exist at the same time, and the referenced value " +"cannot be accessed while the exclusive reference exists. Try making an `&point.0` or " +"changing `point.0` while `x_coord` is alive." +msgstr "" +"« Exclusive » signifie que seule cette référence permet d'accéder à la valeur. Aucune " +"autre référence (partagée ou exclusive) ne peut exister simultanément, et la valeur " +"référencée est inaccessible tant que la référence exclusive est active. Essayez de créer " +"un `&point.0` ou de modifier `point.0` pendant que `x_coord` est actif." + +#: src/references/exclusive.md +msgid "" +"Be sure to note the difference between `let mut x_coord: &i32` and `let x_coord: &mut " +"i32`. The first one is a shared reference that can be bound to different values, while " +"the second is an exclusive reference to a mutable value." +msgstr "" +"Il est important de noter la différence entre `let mut x_coord: &i32` et `let x_coord: " +"&mut i32`. La première est une référence partagée qui peut être liée à différentes " +"valeurs, tandis que la seconde est une référence exclusive à une valeur mutable." + +#: src/references/slices.md +msgid "A slice gives you a view into a larger collection:" +msgstr "Une tranche vous donne une vue dans une plus grande collection :" + +#: src/references/slices.md +msgid "Slices borrow data from the sliced type." +msgstr "Les tranches empruntent des données au type tranché." + +#: src/references/slices.md +msgid "" +"We create a slice by borrowing `a` and specifying the starting and ending indexes in " +"brackets." +msgstr "" +"Nous créons une tranche en empruntant `a` et en spécifiant les indices de début et de fin " +"entre parenthèses." + +#: src/references/slices.md +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 "" +"Si la tranche commence à l’index 0, la syntaxe de plage de Rust nous permet de supprimer " +"l’index de départ, ce qui signifie que `&a[0..a.len()]` et `&a[..a.len()]` sont " +"identiques." + +#: src/references/slices.md +msgid "" +"The same is true for the last index, so `&a[2..a.len()]` and `&a[2..]` are identical." +msgstr "" +"Il en va de même pour le dernier index, donc `&a[2..a.len()]` et `&a[2..]` sont " +"identiques." + +#: src/references/slices.md +msgid "To easily create a slice of the full array, we can therefore use `&a[..]`." +msgstr "" +"Pour créer facilement une tranche du tableau complet, nous pouvons donc utiliser `&a[..]`." + +#: src/references/slices.md +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 "" +"`s` est une référence à une tranche de `i32`s. Notez que le type de `s` (`&[i32]`) ne " +"mentionne plus la longueur du tableau. Cela nous permet d'effectuer des calculs sur des " +"tranches de tailles différentes." + +#: src/references/slices.md +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 "" +"Les tranches empruntent toujours à un autre objet. Dans cet exemple, \"a\" doit rester " +"\"vivant\" (dans la portée) au moins aussi longtemps que notre tranche." + +#: src/references/slices.md +msgid "You can't \"grow\" a slice once it's created:" +msgstr "On ne peut pas « agrandir » une tranche une fois qu'elle a été créée :" + +#: src/references/slices.md +msgid "You can't append elements of the slice, since it doesn't own the backing buffer." +msgstr "" +"Vous ne pouvez pas ajouter d'éléments à la tranche, car celle-ci ne possède pas le tampon " +"sous-jacent." + +#: src/references/slices.md +msgid "" +"You can't grow a slice to point to a larger section of the backing buffer. A slice does " +"not have information about the length of the underlying buffer and so you can't know how " +"large the slice can be grown." +msgstr "" +"Il est impossible d'agrandir une tranche pour qu'elle pointe vers une section plus large " +"du tampon sous-jacent. Une tranche ne contient aucune information sur la longueur du " +"tampon sous-jacent ; par conséquent, il est impossible de déterminer sa taille maximale." + +#: src/references/slices.md +msgid "" +"To get a larger slice you have to go back to the original buffer and create a larger " +"slice from there." +msgstr "" +"Pour obtenir une tranche plus grande, il faut retourner au tampon d'origine et créer une " +"tranche plus grande à partir de là." + +#: src/references/strings.md +msgid "We can now understand the two string types in Rust:" +msgstr "" +"Nous pouvons maintenant comprendre les deux types de chaînes de caractères en Rust :" + +#: src/references/strings.md +msgid "`&str` is a slice of UTF-8 encoded bytes, similar to `&[u8]`." +msgstr "`&str` est une tranche d'octets encodés en UTF-8, similaire à `&[u8]`." + +#: src/references/strings.md +msgid "`String` is an owned buffer of UTF-8 encoded bytes, similar to `Vec`." +msgstr "`String` est un tampon `owned` (possédé) d'octets encodés en UTF-8, similaire à `Vec`." + +#: src/references/strings.md src/std-traits/read-and-write.md +msgid "\"World\"" +msgstr "\"Monde\"" + +#: src/references/strings.md +msgid "\"s1: {s1}\"" +msgstr "\"s1: {s1}\"" + +#: src/references/strings.md +msgid "\"Hello \"" +msgstr "\"Hello \"" + +#: src/references/strings.md +msgid "\"s2: {s2}\"" +msgstr "\"s2: {s2}\"" + +#: src/references/strings.md +msgid "\"s3: {s3}\"" +msgstr "\"s3: {s3}\"" + +#: src/references/strings.md +msgid "" +"`&str` introduces a string slice, which is an immutable reference to UTF-8 encoded string " +"data stored in a block of memory. String literals (`\"Hello\"`), are stored in the " +"program’s binary." +msgstr "" +"`&str` introduit une tranche de chaîne, qui est une référence immutable à des données de " +"chaîne encodées en UTF-8 et stockées dans un bloc de mémoire. Les littéraux de chaîne " +"(« Hello ») sont stockés dans le binaire du programme." + +#: src/references/strings.md +msgid "" +"Rust's `String` type is a wrapper around a vector of bytes. As with a `Vec`, it is " +"owned." +msgstr "" +"Le type `String` de Rust est un wrapper autour d'un vecteur d'octets. Comme pour un " +"`Vec`, il est `owned` (possédé)." + +#: src/references/strings.md +msgid "" +"As with many other types `String::from()` creates a string from a string literal; " +"`String::new()` creates a new empty string, to which string data can be added using the " +"`push()` and `push_str()` methods." +msgstr "" +"Comme pour de nombreux autres types, `String::from()` crée une chaîne à partir d'une " +"chaîne littérale ; `String::new()` crée une nouvelle chaîne vide, à laquelle des données " +"de chaîne peuvent être ajoutées à l'aide des méthodes `push()` et `push_str()`." + +#: src/references/strings.md +msgid "" +"The `format!()` macro is a convenient way to generate an owned string from dynamic " +"values. It accepts the same format specification as `println!()`." +msgstr "" +"La macro `format!()` permet de générer facilement une chaîne de caractères personnalisée " +"à partir de valeurs dynamiques. Elle accepte les mêmes spécifications de format que " +"`println!()`." + +#: src/references/strings.md +msgid "" +"You can borrow `&str` slices from `String` via `&` and optionally range selection. If you " +"select a byte range that is not aligned to character boundaries, the expression will " +"panic. The `chars` iterator iterates over characters and is preferred over trying to get " +"character boundaries right." +msgstr "" +"Vous pouvez emprunter des tranches `&str` à `String` via `&` et éventuellement " +"sélectionner une plage. Si vous sélectionnez une plage d'octets non alignée sur les " +"limites des caractères, l'expression générera une erreur. L'itérateur `chars` parcourt " +"les caractères et est préférable à la tentative de définir précisément les limites des " +"caractères." + +#: src/references/strings.md +msgid "" +"For C++ programmers: think of `&str` as `std::string_view` from C++, but the one that " +"always points to a valid string in memory. Rust `String` is a rough equivalent of `std::" +"string` from C++ (main difference: it can only contain UTF-8 encoded bytes and will never " +"use a small-string optimization)." +msgstr "" +"Pour les programmeurs C++ : considérez `&str` comme l’équivalent de `std::string_view` en " +"C++, mais pointant toujours vers une chaîne valide en mémoire. La classe `String` de Rust " +"est un équivalent approximatif de `std::string` en C++ (la principale différence étant " +"qu’elle ne peut contenir que des octets encodés en UTF-8 et n’utilise jamais " +"l’optimisation pour les chaînes courtes)." + +#: src/references/strings.md +msgid "Byte strings literals allow you to create a `&[u8]` value directly:" +msgstr "" +"Les chaînes littérales d'octets vous permettent de créer directement une valeur `&[u8]` :" + +#: src/references/strings.md +msgid "" +"Raw strings allow you to create a `&str` value with escapes disabled: `r\"\\n\" == \"\\" +"\\n\"`. You can embed double-quotes by using an equal amount of `#` on either side of the " +"quotes:" +msgstr "" +"Les chaînes brutes permettent de créer une valeur `&str` sans échappement : `r\"\\n\" == " +"\"\\\\n\"`. Vous pouvez insérer des guillemets doubles en utilisant un nombre égal de `#` " +"de chaque côté des guillemets :" + +#: src/references/dangling.md +msgid "" +"Rust enforces a number of rules for references that make them always safe to use. One " +"rule is that references can never be `null`, making them safe to use without `null` " +"checks. The other rule we'll look at for now is that references can't _outlive_ the data " +"they point to." +msgstr "" +"Rust impose plusieurs règles aux références afin de garantir leur sécurité d'utilisation. " +"L'une d'elles stipule qu'une référence ne peut jamais être nulle, ce qui permet de " +"l'utiliser sans vérification de valeur nulle. L'autre règle que nous aborderons ici est " +"que les références ne peuvent pas survivre aux données qu'elles référencent." + +#: src/references/dangling.md +msgid "" +"This slide gets students thinking about references as not simply being pointers, since " +"Rust has different rules for references than other languages." +msgstr "" +"Cette diapositive amène les étudiants à considérer les références comme ne se limitant " +"pas à de simples pointeurs, car les règles relatives aux références en Rust diffèrent " +"d'autres langages." + +#: src/references/dangling.md +msgid "" +"We'll look at the rest of Rust's borrowing rules on day 3 when we talk about Rust's " +"ownership system." +msgstr "" +"Nous examinerons le reste des règles d'emprunt de Rust le troisième jour, lorsque nous " +"parlerons du système de propriété de Rust." + +#: src/references/dangling.md +msgid "" +"Rust's equivalent of nullability is the `Option` type, which can be used to make any type " +"\"nullable\" (not just references/pointers). We haven't yet introduced enums or pattern " +"matching, though, so try not to go into too much detail about this here." +msgstr "" +"En Rust, l'équivalent de la nullabilité est le type `Option`, qui permet de rendre " +"n'importe quel type « nullable » (et pas seulement les références et les pointeurs). " +"Cependant, nous n'avons pas encore introduit les énumérations ni le filtrage par motif ; " +"il est donc préférable de ne pas trop s'étendre sur ce sujet ici." + +#: src/references/exercise.md +msgid "" +"We will create a few utility functions for 3-dimensional geometry, representing a point " +"as `[f64;3]`. It is up to you to determine the function signatures." +msgstr "" +"Nous allons créer un certain nombre de fonctions utilitaires pour la géométrie tridimensionnelle, " +"représentant un point par `[f64;3]`. Il vous appartient de déterminer les signatures de " +"ces fonctions." + +#: src/references/exercise.md +msgid "" +"// Calculate the magnitude of a vector by summing the squares of its coordinates\n" +"// and taking the square root. Use the `sqrt()` method to calculate the square\n" +"// root, like `v.sqrt()`.\n" +msgstr "" +"// Calculez la magnitude d'un vecteur en faisant la somme des carrés de ses\n" +"// coordonnées et en extrayant la racine carrée de cette somme. Uilisez la\n" +"// méthode `sqrt()` pour calculer la racine carrée : `v.sqrt()`.\n" + +#: src/references/exercise.md +msgid "" +"// Normalize a vector by calculating its magnitude and dividing all of its\n" +"// coordinates by that magnitude.\n" +msgstr "" +"// Normalisez un vecteur en calculant sa magnitude et en divisant chacune de\n" +"// ses coordonnées par cette magnitude.\n" + +#: src/references/exercise.md +msgid "// Use the following `main` to test your work.\n" +msgstr "// Utilisez ce `main` pour tester votre travail.\n" + +#: src/references/exercise.md src/references/solution.md +msgid "\"Magnitude of a unit vector: {}\"" +msgstr "\"Magnitude d'un vecteur unitaire : {}\"" + +#: src/references/exercise.md src/references/solution.md +msgid "\"Magnitude of {v:?}: {}\"" +msgstr "\"Magnitude de {v:?}: {}\"" + +#: src/references/exercise.md src/references/solution.md +msgid "\"Magnitude of {v:?} after normalization: {}\"" +msgstr "\"Magnitude de {v:?} après normalisation : {}\"" + +#: src/references/solution.md +msgid "/// Calculate the magnitude of the given vector.\n" +msgstr "/// Calculez la magnitude d'un vecteur donné.\n" + +#: src/references/solution.md +msgid "/// Change the magnitude of the vector to 1.0 without changing its direction.\n" +msgstr "/// Changez la magnitude du vecteur à 1.0 sans changer sa direction.\n" + +#: src/references/solution.md +msgid "" +"Note that in `normalize` we were able to do `*item /= mag` to modify each element. This " +"is because we're iterating using a mutable reference to an array, which causes the `for` " +"loop to give mutable references to each element." +msgstr "" +"Notez que dans `normalize`, nous avons pu utiliser `*item /= mag` pour modifier chaque " +"élément. Cela s'explique par le fait que nous itérons sur une référence mutable à un " +"tableau, ce qui permet à la boucle `for` de fournir des références mutables à chaque " +"élément." + +#: src/references/solution.md +msgid "" +"It is also possible to take slice references here, e.g., `fn magnitude(vector: &[f64]) -> " +"f64`. This makes the function more general, at the cost of a runtime length check." +msgstr "" +"Il est également possible de prendre ici des références de tranches, par exemple : `fn " +"magnitude(vector: &[f64]) -> f64`. Cela rend la fonction plus générale, au prix d'une " +"vérification de longueur à l'exécution." + +#: src/user-defined-types.md src/std-types.md src/std-traits.md src/memory-management.md +msgid "This segment should take about 1 hour. It contains:" +msgstr "Ce segment devrait durer environ 1 heure. Il contient :" + +#: src/user-defined-types/named-structs.md +msgid "Like C and C++, Rust has support for custom structs:" +msgstr "À l'instar de C et C++, Rust prend en charge les structures personnalisées :" + +#: src/user-defined-types/named-structs.md +msgid "\"{} is {} years old\"" +msgstr "\"{} is {} years old\"" + +#: src/user-defined-types/named-structs.md src/android/interoperability/with-c/bindgen.md +msgid "\"Peter\"" +msgstr "\"Peter\"" + +#: src/user-defined-types/named-structs.md +msgid "\"Avery\"" +msgstr "\"Avery\"" + +#: src/user-defined-types/named-structs.md src/user-defined-types/enums.md +#: src/pattern-matching/match.md src/methods-and-traits/methods.md +msgid "Key Points:" +msgstr "Points clés:" + +#: src/user-defined-types/named-structs.md +msgid "Structs work like in C or C++." +msgstr "Les structures fonctionnent comme en C ou C++." + +#: src/user-defined-types/named-structs.md +msgid "Like in C++, and unlike in C, no typedef is needed to define a type." +msgstr "" +"Comme en C++, et contrairement au C, aucun typedef n'est nécessaire pour définir un type." + +#: src/user-defined-types/named-structs.md +msgid "Unlike in C++, there is no inheritance between structs." +msgstr "Contrairement au C++, il n'y a pas d'héritage entre les structures." + +#: src/user-defined-types/named-structs.md +msgid "This may be a good time to let people know there are different types of structs." +msgstr "" +"C’est peut-être le bon moment pour informer les gens qu’il existe différents types de " +"structures." + +#: src/user-defined-types/named-structs.md +msgid "" +"Zero-sized structs (e.g. `struct Foo;`) might be used when implementing a trait on some " +"type but don’t have any data that you want to store in the value itself." +msgstr "" +"Les structures de taille nulle (par exemple `struct Foo;`) peuvent être utilisées lors de " +"l'implémentation d'un trait sur un type, mais ne contiennent aucune donnée que vous " +"souhaitez stocker dans la valeur elle-même." + +#: src/user-defined-types/named-structs.md +msgid "" +"The next slide will introduce Tuple structs, used when the field names are not important." +msgstr "" +"La diapositive suivante présentera les structures Tuple, utilisées lorsque les noms des " +"champs ne sont pas importants." + +#: src/user-defined-types/named-structs.md +msgid "" +"If you already have variables with the right names, then you can create the struct using " +"a shorthand." +msgstr "" +"Si vous disposez déjà de variables portant les noms appropriés, vous pouvez créer la " +"structure en utilisant une syntaxe abrégée." + +#: src/user-defined-types/named-structs.md +msgid "" +"Struct fields do not support default values. Default values are specified by implementing " +"the `Default` trait which we will cover later." +msgstr "" +"Les champs des `Strcut` ne peuvent pas avoir de valeur par défaut. Les valeurs par défaut " +"sont spécifiées en implémnetant le trait `Default` que nous aborderons plus tard." + +#: src/user-defined-types/named-structs.md +msgid "You can also demonstrate the struct update syntax here:" +msgstr "Vous pouvez également illustrer la syntaxe de mise à jour de structure ici :" + +#: src/user-defined-types/named-structs.md +msgid "\"Jackie\"" +msgstr "\"Jackie\"" + +#: src/user-defined-types/named-structs.md +msgid "" +"It allows us to copy the majority of the fields from the old struct without having to " +"explicitly type it all out. It must always be the last element." +msgstr "" +"Cela nous permet de copier la plupart des champs de l'ancienne structure sans avoir à " +"tout saisir explicitement. Il doit toujours s'agir du dernier élément." + +#: src/user-defined-types/named-structs.md +msgid "" +"It is mainly used in combination with the `Default` trait. We will talk about struct " +"update syntax in more detail on the slide on the `Default` trait, so we don't need to " +"talk about it here unless students ask about it." +msgstr "" +"Il est principalement utilisé en combinaison avec le trait `Default`. Nous aborderons " +"plus en détail la syntaxe de mise à jour des structures dans la diapositive consacrée au " +"trait `Default`, il n'est donc pas nécessaire d'en parler ici, sauf si les étudiants " +"posent des questions à ce sujet." + +#: src/user-defined-types/tuple-structs.md +msgid "If the field names are unimportant, you can use a tuple struct:" +msgstr "" +"Si les noms des champs n'ont pas d'importance, vous pouvez utiliser une structure de " +"tuple :" + +#: src/user-defined-types/tuple-structs.md +msgid "\"({}, {})\"" +msgstr "\"({}, {})\"" + +#: src/user-defined-types/tuple-structs.md +msgid "This is often used for single-field wrappers (called newtypes):" +msgstr "Ceci est souvent utilisé pour les wrappers à champ unique (appelés newtypes) :" + +#: src/user-defined-types/tuple-structs.md +msgid "\"Ask a rocket scientist at NASA\"" +msgstr "\"Interrogez un chercheur de la NASA\"" + +#: src/user-defined-types/tuple-structs.md src/android/interoperability/cpp/cpp-bridge.md +#: src/bare-metal/microcontrollers/type-state.md +#: src/concurrency/async-pitfalls/cancellation.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "// ...\n" +msgstr "// ...\n" + +#: src/user-defined-types/tuple-structs.md +msgid "" +"Newtypes are a great way to encode additional information about the value in a primitive " +"type, for example:" +msgstr "" +"Les newtypes sont un excellent moyen d'encoder des informations supplémentaires sur la " +"valeur d'un type primitif, par exemple :" + +#: src/user-defined-types/tuple-structs.md +msgid "The number is measured in some units: `Newtons` in the example above." +msgstr "" +"Ce nombre est mesuré dans certaines unités : le « newton » dans l’exemple ci-dessus." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"The value passed some validation when it was created, so you no longer have to validate " +"it again at every use: `PhoneNumber(String)` or `OddNumber(u32)`." +msgstr "" +"La valeur a passé une certaine validation lors de sa création, vous n'avez donc plus " +"besoin de la valider à nouveau à chaque utilisation : `PhoneNumber(String)` ou " +"`OddNumber(u32)`." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"The newtype pattern is covered extensively in the [\"Idiomatic Rust\" module](../" +"idiomatic/leveraging-the-type-system/newtype-pattern.md)." +msgstr "" +"Le modèle newtype est largement traité dans le module [\"Idiomatic Rust\"](../idiomatic/" +"leveraging-the-type-system/newtype-pattern.md)." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"Demonstrate how to add a `f64` value to a `Newtons` type by accessing the single field in " +"the newtype." +msgstr "" +"Démontrer comment ajouter une valeur `f64` à un type `Newtons` en accédant au champ " +"unique dans le type Newton." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"Rust generally avoids implicit conversions, like automatic unwrapping or using booleans " +"as integers." +msgstr "" +"Rust évite généralement les conversions implicites, comme l'`unwrapping` automatique ou " +"l'utilisation de booléens comme des entiers." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"Operator overloading is discussed on Day 2 ([Standard Library Traits](../std-traits.md))." +msgstr "" +"La surcharge d'opérateurs est abordée le jour 2 ([Standard Library Traits](../std-traits." +"md))." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"When a tuple struct has zero fields, the `()` can be omitted. The result is a zero-sized " +"type (ZST), of which there is only one value (the name of the type)." +msgstr "" +"Lorsqu'une structure de tuple ne comporte aucun champ, les parenthèses `()` peuvent être " +"omises. On obtient alors un type de taille nulle (ZST), qui ne contient qu'une seule " +"valeur (le nom du type)." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"This is common for types that implement some behavior but have no data (imagine a " +"`NullReader` that implements some reader behavior by always returning EOF)." +msgstr "" +"Ceci est courant pour les types qui implémentent un certain comportement mais ne " +"possèdent aucune donnée (imaginez un `NullReader` qui implémente un comportement de " +"lecteur en renvoyant toujours EOF)." + +#: src/user-defined-types/tuple-structs.md +msgid "" +"The example is a subtle reference to the [Mars Climate Orbiter](https://en.wikipedia.org/" +"wiki/Mars_Climate_Orbiter) failure." +msgstr "" +"L'exemple est une référence subtile à l'échec de la [Mars Climate Orbiter](https://en." +"wikipedia.org/wiki/Mars_Climate_Orbiter)." + +#: src/user-defined-types/enums.md +msgid "The `enum` keyword allows the creation of a type which has a few different variants:" +msgstr "Le mot-clé `enum` permet la création d'un type qui possède plusieurs variantes :" + +#: src/user-defined-types/enums.md +msgid "// Simple variant\n" +msgstr "// Variant simple\n" + +#: src/user-defined-types/enums.md +msgid "// Tuple variant\n" +msgstr "// Variant Tuple\n" + +#: src/user-defined-types/enums.md +msgid "// Struct variant\n" +msgstr "// Variant Struct\n" + +#: src/user-defined-types/enums.md +msgid "\"On this turn: {player_move:?}\"" +msgstr "\"Sur ce tour : {player_move:?}\"" + +#: src/user-defined-types/enums.md +msgid "Enumerations allow you to collect a set of values under one type." +msgstr "Les énumérations permettent de regrouper un ensemble de valeurs sous un même type." + +#: src/user-defined-types/enums.md +msgid "" +"`Direction` is a type with variants. There are two values of `Direction`: `Direction::" +"Left` and `Direction::Right`." +msgstr "" +"`Direction` est un type possédant des variantes. Il existe deux valeurs pour " +"`Direction` : `Direction::Left` et `Direction::Right`." + +#: src/user-defined-types/enums.md +msgid "" +"`PlayerMove` is a type with three variants. In addition to the payloads, Rust will store " +"a discriminant so that it knows at runtime which variant is in a `PlayerMove` value." +msgstr "" +"`PlayerMove` est un type possédant trois variantes. Outre les données utiles, Rust stocke " +"un discriminant afin de déterminer lors de l'exécution, la variante présente dans une " +"valeur `PlayerMove`." + +#: src/user-defined-types/enums.md +msgid "This might be a good time to compare structs and enums:" +msgstr "" +"Le moment est peut-être bien choisi pour comparer les structures et les énumérations :" + +#: src/user-defined-types/enums.md +msgid "" +"In both, you can have a simple version without fields (unit struct) or one with different " +"types of fields (variant payloads)." +msgstr "" +"Dans les deux cas, vous pouvez avoir une version simple sans champs (structure unitaire) " +"ou une version avec différents types de champs (charges utiles variantes)." + +#: src/user-defined-types/enums.md +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 all defined in an enum." +msgstr "" +"Vous pourriez même implémenter les différentes variantes d'une énumération avec des " +"structures séparées, mais elles ne seraient alors pas du même type que si elles étaient " +"toutes définies dans une énumération." + +#: src/user-defined-types/enums.md +msgid "Rust uses minimal space to store the discriminant." +msgstr "Rust utilise un espace minimal pour stocker le discriminant." + +#: src/user-defined-types/enums.md +msgid "If necessary, it stores an integer of the smallest required size" +msgstr "Si nécessaire, il stocke un entier de la plus petite taille requise." + +#: src/user-defined-types/enums.md +msgid "" +"If the allowed variant values do not cover all bit patterns, it will use invalid bit " +"patterns to encode the discriminant (the \"niche optimization\"). For example, " +"`Option<&u8>` stores either a pointer to an integer or `NULL` for the `None` variant." +msgstr "" +"Si les valeurs de variantes autorisées ne couvrent pas tous les motifs binaires, des " +"motifs binaires invalides seront utilisés pour encoder le discriminant (optimisation de " +"niche). Par exemple, `Option<&u8>` stocke soit un pointeur vers un entier, soit `NULL` " +"pour la variante `None`." + +#: src/user-defined-types/enums.md +msgid "You can control the discriminant if needed (e.g., for compatibility with C):" +msgstr "" +"Vous pouvez contrôler le discriminant si nécessaire (par exemple, pour la compatibilité " +"avec C) :" + +#: src/user-defined-types/enums.md +msgid "Without `repr`, the discriminant type takes 2 bytes, because 10001 fits 2 bytes." +msgstr "Sans `repr`, le type discriminant prend 2 octets, car 10001 tient sur 2 octets." + +#: src/user-defined-types/enums.md +msgid "Rust has several optimizations it can employ to make enums take up less space." +msgstr "" +"Rust dispose de plusieurs optimisations permettant de réduire l'espace occupé par les " +"énumérations." + +#: src/user-defined-types/enums.md +msgid "" +"Null pointer optimization: For [some types](https://doc.rust-lang.org/std/option/" +"#representation), Rust guarantees that `size_of::()` equals `size_of::>()`." +msgstr "" +"Optimisation des pointeurs nuls : pour [certains types](https://doc.rust-lang.org/std/" +"option/#representation), Rust garantit que `size_of::()` est égal à `size_of::" +">()`." + +#: src/user-defined-types/enums.md +msgid "" +"Example code if you want to show how the bitwise representation _may_ look like in " +"practice. It's important to note that the compiler provides no guarantees regarding this " +"representation, therefore this is totally unsafe." +msgstr "" +"Voici un exemple de code illustrant à quoi peut ressembler la représentation bit à bit en " +"pratique. Il est important de noter que le compilateur n'offre aucune garantie concernant " +"cette représentation ; par conséquent, son utilisation est très dangereuse." + +#: src/user-defined-types/aliases.md +msgid "" +"A type alias creates a name for another type. The two types can be used interchangeably." +msgstr "" +"Un alias de type crée un nom pour un autre type. Les deux types peuvent être utilisés " +"indifféremment." + +#: src/user-defined-types/aliases.md +msgid "// Aliases are more useful with long, complex types:\n" +msgstr "// Les alias sont plus utils pour les types longs et complexes :\n" + +#: src/user-defined-types/aliases.md +msgid "" +"A [newtype](tuple-structs.html) is often a better alternative since it creates a distinct " +"type. Prefer `struct InventoryCount(usize)` to `type InventoryCount = usize`." +msgstr "" +"L'utilisation de [newtype](tuple-structs.html) est souvent préférable car elle crée un " +"type distinct. Il est préférable d'utiliser `struct InventoryCount(usize)` plutôt que " +"`type InventoryCount = usize`." + +#: src/user-defined-types/aliases.md +msgid "C programmers will recognize this as similar to a `typedef`." +msgstr "Les programmeurs C reconnaîtront en cela une similitude avec un `typedef`." + +#: src/user-defined-types/const.md +msgid "`const`" +msgstr "`const`" + +#: src/user-defined-types/const.md +msgid "" +"Constants are evaluated at compile time and their values are [inlined](https://rust-lang." +"github.io/rfcs/0246-const-vs-static.html) wherever they are used:" +msgstr "" +"Les constantes sont évaluées au moment de la compilation et leurs valeurs sont [intégrées]" +"(https://rust-lang.github.io/rfcs/0246-const-vs-static.html) partout où elles sont " +"utilisées :" + +#: src/user-defined-types/const.md +msgid "" +"Only functions marked `const` can be called at compile time to generate `const` values. " +"`const` functions can however be called at runtime." +msgstr "" +"Seules les fonctions marquées `const` peuvent être appelées à la compilation pour générer " +"des valeurs `const`. Les fonctions `const` peuvent cependant être appelées à l'exécution." + +#: src/user-defined-types/const.md +msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`" +msgstr "" +"Il convient de noter que `const` se comporte de manière similaire sémantiquement à " +"`constexpr` en C++." + +#: src/user-defined-types/static.md +msgid "`static`" +msgstr "`static`" + +#: src/user-defined-types/static.md +msgid "" +"Static variables will live during the whole execution of the program, and therefore will " +"not move:" +msgstr "" +"Les variables statiques resteront valides pendant toute la durée d'exécution du programme " +"et ne seront donc pas modifiées :" + +#: src/user-defined-types/static.md +msgid "\"Welcome to RustOS 3.14\"" +msgstr "\"Bienvenue dans RustOS 3.14\"" + +#: src/user-defined-types/static.md +msgid "\"{BANNER}\"" +msgstr "\"{BANNER}\"" + +#: src/user-defined-types/static.md +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. When a globally-scoped value does not have a reason to need object " +"identity, `const` is generally preferred." +msgstr "" +"Comme indiqué dans le [livre RFC de Rust](https://rust-lang.github.io/rfcs/0246-const-vs-" +"static.html), les variables `const` et `static` ne sont pas inlinées lors de leur " +"utilisation et possèdent une adresse mémoire associée. Ceci est utile pour le code non " +"sécurisé et embarqué, et la variable est conservée pendant toute la durée d'exécution du " +"programme. Lorsqu'une valeur globale n'a pas besoin d'une identité d'objet, le type " +"`const` est généralement préféré." + +#: src/user-defined-types/static.md +msgid "`static` is similar to mutable global variables in C++." +msgstr "`static` est similaire aux variables globales mutables en C++." + +#: src/user-defined-types/static.md +msgid "" +"`static` provides object identity: an address in memory and state as required by types " +"with interior mutability such as `Mutex`." +msgstr "" +"`static` fournit l'identité de l'objet : une adresse en mémoire et un état comme requis " +"par les types avec mutabilité interne tels que `Mutex`." + +#: src/user-defined-types/static.md +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." +msgstr "" +"Les variables `static` étant accessibles depuis n'importe quel thread, elles doivent être " +"`Sync`. La mutabilité interne est possible via un [`Mutex`](https://doc.rust-lang.org/std/" +"sync/struct.Mutex.html), atomique ou similaire." + +#: src/user-defined-types/static.md +msgid "" +"It is common to use `OnceLock` in a static as a way to support initialization on first " +"use. `OnceCell` is not `Sync` and thus cannot be used in this context." +msgstr "" +"Il est courant d'utiliser `OnceLock` dans une variable statique pour permettre " +"l'initialisation lors de la première utilisation. `OnceCell` n'est pas de type `Sync` et " +"ne peut donc pas être utilisé dans ce contexte." + +#: src/user-defined-types/static.md +msgid "Thread-local data can be created with the macro `std::thread_local`." +msgstr "" +"Les données locales au thread peuvent être créées avec la macro `std::thread_local`." + +#: src/user-defined-types/exercise.md +msgid "" +"We will create a data structure to represent an event in an elevator control system. It " +"is up to you to define the types and functions to construct various events. Use " +"`#[derive(Debug)]` to allow the types to be formatted with `{:?}`." +msgstr "" +"Nous allons créer une structure de données pour représenter un événement dans un système " +"de contrôle d'ascenseur. Il vous appartient de définir les types et les fonctions " +"permettant de construire différents événements. Utilisez `#[derive(Debug)]` pour " +"permettre le formatage des types avec `{:?}`." + +#: src/user-defined-types/exercise.md +msgid "" +"This exercise only requires creating and populating data structures so that `main` runs " +"without errors. The next part of the course will cover getting data out of these " +"structures." +msgstr "" +"Cet exercice consiste uniquement à créer et à remplir des structures de données afin que " +"la fonction `main` s'exécute sans erreur. La partie suivante du cours portera sur " +"l'extraction des données de ces structures." + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "/// An event in the elevator system that the controller must react to.\n" +msgstr "/// Un événement dans le système de l'ascenseur auquel le contrôleur doit réagir.\n" + +#: src/user-defined-types/exercise.md +msgid "// TODO: add required variants\n" +msgstr "// TODO: ajoutez les variants requis\n" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "/// A direction of travel.\n" +msgstr "/// Une direction de voyage.\n" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "/// The car has arrived on the given floor.\n" +msgstr "/// La cabine est arrivée à l'étage donné.\n" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "/// The car doors have opened.\n" +msgstr "/// Les portes de la cabine se sont ouvertes.\n" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "/// The car doors have closed.\n" +msgstr "/// Les portes de la cabine se sont fermées.\n" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "/// A directional button was pressed in an elevator lobby on the given floor.\n" +msgstr "/// Un bouton de direction a été pressé dans un hall d'ascenseur à l'étage donné.\n" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "/// A floor button was pressed in the elevator car.\n" +msgstr "/// Un bouton d'étage a été pressé dans la cabine d'ascenseur.\n" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "\"A ground floor passenger has pressed the up button: {:?}\"" +msgstr "\"Un usager du RDC a pressé le bouton haut : {:?}\"" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "\"The car has arrived on the ground floor: {:?}\"" +msgstr "\"La cabine est arrivée au rez-de-chaussée : {:?}\"" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "\"The car door opened: {:?}\"" +msgstr "\"Les portes de la cabine se sont ouvertes : {:?}\"" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "\"A passenger has pressed the 3rd floor button: {:?}\"" +msgstr "\"Un usager a pressé le bouton du 3ème étage : {:?}\"" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "\"The car door closed: {:?}\"" +msgstr "\"La porte de la cabine est fermée : {:?}\"" + +#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +msgid "\"The car has arrived on the 3rd floor: {:?}\"" +msgstr "\"La porte est arrivée au troisième étage : {:?}\"" + +#: src/user-defined-types/exercise.md +msgid "" +"If students ask about `#![allow(dead_code)]` at the top of the exercise, it's necessary " +"because the only thing we do with the `Event` type is print it out. Due to a nuance of " +"how the compiler checks for dead code this causes it to think the code is unused. They " +"can ignore it for the purpose of this exercise." +msgstr "" +"Si les étudiants s'interrogent sur `#![allow(dead_code)]` au début de l'exercice, c'est " +"parce que cette directive est nécessaire : le type `Event` est uniquement utilisé pour " +"l'afficher. En raison d'une subtilité dans la façon dont le compilateur vérifie le code " +"mort, cette directive peut l'interpréter comme un code inutilisé. Les étudiants peuvent " +"donc l'ignorer pour cet exercice." + +#: src/user-defined-types/solution.md +msgid "/// A button was pressed.\n" +msgstr "/// Un bouton a été pressé.\n" + +#: src/user-defined-types/solution.md +msgid "/// The car has arrived at the given floor.\n" +msgstr "/// La cabine est arrivée à l'étage donné.\n" + +#: src/user-defined-types/solution.md +msgid "/// The car's doors have opened.\n" +msgstr "/// The car's doors have opened.\n" + +#: src/user-defined-types/solution.md +msgid "/// The car's doors have closed.\n" +msgstr "/// Les portes de la cabine se sont fermées.\n" + +#: src/user-defined-types/solution.md +msgid "/// A floor is represented as an integer.\n" +msgstr "/// Un étage est représenté par un entier.\n" + +#: src/user-defined-types/solution.md +msgid "/// A user-accessible button.\n" +msgstr "/// Un bouton accessible à l'utilisateur.\n" + +#: src/user-defined-types/solution.md +msgid "/// A button in the elevator lobby on the given floor.\n" +msgstr "/// Un bouton dans le hall d'ascenseur à l'étage donné.\n" + +#: src/user-defined-types/solution.md +msgid "/// A floor button within the car.\n" +msgstr "/// Un bouton d'étage dans la cabine.\n" + +#: src/user-defined-types/solution.md +msgid "" +"**Enums with Data:** Rust `enum` variants can carry data. `CarArrived(Floor)` carries an " +"integer, and `ButtonPressed(Button)` carries a nested `Button` enum. This allows `Event` " +"to represent a rich set of states in a type-safe way." +msgstr "" +"**Énumérations avec données :** Les variantes d’énumération de Rust peuvent contenir des " +"données. `CarArrived(Floor)` contient un entier, et `ButtonPressed(Button)` contient une " +"énumération `Button` imbriquée. Cela permet à `Event` de représenter un large éventail " +"d’états de manière sûre." + +#: src/user-defined-types/solution.md +msgid "" +"**Type Aliases:** `type Floor = i32` gives a semantic name to `i32`. This improves " +"readability, but `Floor` is still just an `i32` to the compiler." +msgstr "" +"**Alias ​​de type :** `type Floor = i32` attribue un nom sémantique à `i32`. Cela améliore " +"la lisibilité, mais pour le compilateur, `Floor` reste simplement un `i32`." + +#: src/user-defined-types/solution.md +msgid "" +"**`#[derive(Debug)]`:** We use this attribute to automatically generate code to format " +"the enums for printing with `{:?}`. Without this, we would have to manually implement the " +"`fmt::Debug` trait." +msgstr "" +"**`#[derive(Debug)]`:** Cet attribut permet de générer automatiquement le code de " +"formatage des énumérations pour l'affichage avec `{:?}`. Sans lui, il faudrait " +"implémenter manuellement le trait `fmt::Debug`." + +#: src/user-defined-types/solution.md +msgid "" +"**Nested Enums:** The `Button` enum is nested inside `Event::ButtonPressed`. This " +"hierarchical structure is common in Rust for modeling complex domains." +msgstr "" +"**Énumérations imbriquées :** L’énumération `Button` est imbriquée dans `Event::" +"ButtonPressed`. Cette structure hiérarchique est courante en Rust pour la modélisation de " +"domaines complexes." + +#: src/user-defined-types/solution.md +msgid "" +"Note that `Event::CarDoorOpened` is a \"unit variant\" (it carries no data), while " +"`Event::CarArrived` is a \"tuple variant\"." +msgstr "" +"Notez que `Event::CarDoorOpened` est une « variante unitaire » (elle ne contient aucune " +"donnée), tandis que `Event::CarArrived` est une « variante tuple »." + +#: src/user-defined-types/solution.md +msgid "" +"You might discuss why `Button` is a separate enum rather than just having " +"`LobbyCallButtonPressed` and `CarFloorButtonPressed` variants on `Event`. Both are valid, " +"but grouping related concepts (like buttons) can make the code cleaner." +msgstr "" +"Il serait pertinent d'expliquer pourquoi `Button` est une énumération distincte plutôt " +"que d'avoir simplement les variantes `LobbyCallButtonPressed` et `CarFloorButtonPressed` " +"dans `Event`. Les deux approches sont valides, mais regrouper les concepts apparentés " +"(comme les boutons) permet d'obtenir un code plus clair." + +#: src/welcome-day-2.md +msgid "Welcome to Day 2" +msgstr "Bienvenue au Jour 2" + +#: src/welcome-day-2.md +msgid "We have covered the foundations of Rust:" +msgstr "Nous avons abordé les bases de Rust :" + +#: src/welcome-day-2.md +msgid "**Basic Types:** Integers, booleans, characters, tuples, and arrays." +msgstr "**Types de base :** Entiers, booléens, caractères, tuples et tableaux." + +#: src/welcome-day-2.md +msgid "**Control Flow:** `if` expressions, loops, and `match` expressions." +msgstr "**Flux de contrôle :** expressions `if`, boucles et expressions `match`." + +#: src/welcome-day-2.md +msgid "**Functions:** How to define and call functions." +msgstr "**Fonctions :** Comment définir et appeler des fonctions." + +#: src/welcome-day-2.md +msgid "**User-Defined Types:** Model data with `struct` and `enum`." +msgstr "" +"**Types définis par l'utilisateur :** Modélisez les données avec `struct` et `enum`." + +#: src/welcome-day-2.md +msgid "**References:** Basic borrowing with `&` and `&mut`." +msgstr "**Références :** Emprunt de base avec `&` et `&mut`." + +#: src/welcome-day-2.md +msgid "You can now construct any type in Rust and implement basic logic!" +msgstr "" +"Vous pouvez désormais construire n'importe quel type en Rust et implémenter une logique " +"de base !" + +#: src/welcome-day-2.md src/welcome-day-2-afternoon.md src/welcome-day-4.md +msgid "" +"Including 10 minute breaks, this session should take about 2 hours and 50 minutes. It " +"contains:" +msgstr "" +"En comptant les pauses de 10 minutes, cette session devrait durer environ 2 heures et 50 " +"minutes. Elle comprend :" + +#: src/pattern-matching.md src/generics.md +msgid "This segment should take about 50 minutes. It contains:" +msgstr "Ce segment devrait durer environ 50 minutes. Il contient :" + +#: src/pattern-matching/infallible.md +msgid "" +"In day 1 we briefly saw how patterns can be used to _destructure_ compound values. Let's " +"review that and talk about a few other things patterns can express:" +msgstr "" +"Lors de la première journée, nous avons brièvement vu comment les motifs peuvent servir à " +"déstructurer les valeurs composées. Revenons sur ce point et abordons quelques autres " +"notions que les motifs peuvent exprimer :" + +#: src/pattern-matching/infallible.md +msgid "// This does the same thing as above.\n" +msgstr "// Ce code fait la même chose que ci-dessus.\n" + +#: src/pattern-matching/infallible.md +msgid "// Ignore the first element, only bind the second and third.\n" +msgstr "// On ignore uniquement le premier élément.\n" + +#: src/pattern-matching/infallible.md +msgid "// Ignore everything but the last element.\n" +msgstr "// On ignore tout sauf le dernier élément.\n" + +#: src/pattern-matching/infallible.md src/pattern-matching/match.md src/generics/exercise.md +#: src/generics/solution.md src/std-traits/solution.md +msgid "'a'" +msgstr "'a'" + +#: src/pattern-matching/infallible.md +msgid "" +"All of the demonstrated patterns are _irrefutable_, meaning that they will always match " +"the value on the right hand side." +msgstr "" +"Tous les modèles présentés sont _irréfutables_, ce qui signifie qu'ils correspondront " +"toujours à la valeur située à droite." + +#: src/pattern-matching/infallible.md +msgid "" +"Patterns are type-specific, including irrefutable patterns. Try adding or removing an " +"element to the tuple and look at the resulting compiler errors." +msgstr "" +"Les motifs sont spécifiques à un type, y compris les motifs irréfutables. Essayez " +"d'ajouter ou de supprimer un élément du tuple et observez les erreurs de compilation qui " +"en résultent." + +#: src/pattern-matching/infallible.md +msgid "" +"Variable names are patterns that always match and bind the matched value into a new " +"variable with that name." +msgstr "" +"Les noms de variables sont des modèles qui correspondent toujours et lient la valeur " +"correspondante à une nouvelle variable portant ce nom." + +#: src/pattern-matching/infallible.md +msgid "`_` is a pattern that always matches any value, discarding the matched value." +msgstr "" +"`_` est un motif qui correspond toujours à n'importe quelle valeur, en ignorant la valeur " +"correspondante." + +#: src/pattern-matching/infallible.md +msgid "`..` allows you to ignore multiple values at once." +msgstr "`..` vous permet d'ignorer plusieurs valeurs à la fois." + +#: src/pattern-matching/infallible.md +msgid "" +"You can also demonstrate more advanced usages of `..`, such as ignoring the middle " +"elements of a tuple." +msgstr "" +"Vous pouvez également démontrer des utilisations plus avancées de `..`, comme ignorer les " +"éléments du milieu d'un tuple." + +#: src/pattern-matching/infallible.md +msgid "All of these patterns work with arrays as well:" +msgstr "Tous ces modèles fonctionnent également avec les tableaux :" + +#: src/pattern-matching/match.md +msgid "" +"The `match` keyword lets you match a value against one or more _patterns_. The patterns " +"can be simple values, similarly to `switch` in C and C++, but they can also be used to " +"express more complex conditions:" +msgstr "" +"Le mot-clé `match` permet de comparer une valeur à un ou plusieurs _modèles_. Ces modèles " +"peuvent être des valeurs simples, comme avec `switch` en C et C++, mais ils peuvent aussi " +"servir à exprimer des conditions plus complexes :" + +#: src/pattern-matching/match.md +msgid "'x'" +msgstr "'x'" + +#: src/pattern-matching/match.md +msgid "'q'" +msgstr "'q'" + +#: src/pattern-matching/match.md +msgid "\"Quitting\"" +msgstr "\"Quitter\"" + +#: src/pattern-matching/match.md +msgid "'s'" +msgstr "'s'" + +#: src/pattern-matching/match.md +msgid "'w'" +msgstr "'w'" + +#: src/pattern-matching/match.md +msgid "'d'" +msgstr "'d'" + +#: src/pattern-matching/match.md +msgid "\"Moving around\"" +msgstr "\"Se déplacer\"" + +#: src/pattern-matching/match.md +msgid "'0'" +msgstr "'0'" + +#: src/pattern-matching/match.md +msgid "'9'" +msgstr "'9'" + +#: src/pattern-matching/match.md +msgid "\"Number input\"" +msgstr "\"Entrer un nombre\"" + +#: src/pattern-matching/match.md +msgid "\"Lowercase: {key}\"" +msgstr "\"petite casse: {key}\"" + +#: src/pattern-matching/match.md +msgid "\"Something else\"" +msgstr "\"Quelque chose d'autre\"" + +#: src/pattern-matching/match.md +msgid "" +"A variable in the pattern (`key` in this example) will create a binding that can be used " +"within the match arm. We will learn more about this on the next slide." +msgstr "" +"Une variable dans le modèle (« key » dans cet exemple) créera une liaison utilisable dans " +"la branche de correspondance. Nous en apprendrons davantage à ce sujet dans la " +"diapositive suivante." + +#: src/pattern-matching/match.md +msgid "" +"A match guard causes the arm to match only if the condition is true. If the condition is " +"false the match will continue checking later cases." +msgstr "" +"Un dispositif de protection empêche la correspondance du bras de se faire si la condition " +"est vraie. Si la condition est fausse, la correspondance se poursuit et vérifie les cas " +"suivants." + +#: src/pattern-matching/match.md +msgid "You might point out how some specific characters are being used when in a pattern" +msgstr "" +"Vous pourriez souligner comment certains caractères spécifiques sont utilisés dans un " +"motif." + +#: src/pattern-matching/match.md +msgid "`|` as an `or`" +msgstr "`|` comme un `or`" + +#: src/pattern-matching/match.md +msgid "`..` matches any number of items" +msgstr "`..` correspond à un nombre quelconque d'éléments" + +#: src/pattern-matching/match.md +msgid "`1..=5` represents an inclusive range" +msgstr "`1..=5` représente une plage inclusive" + +#: src/pattern-matching/match.md +msgid "`_` is a wild card" +msgstr "`_` est un joker" + +#: src/pattern-matching/match.md +msgid "" +"Match guards as a separate syntax feature are important and necessary when we wish to " +"concisely express more complex ideas than patterns alone would allow." +msgstr "" +"Les gardes de correspondance, en tant que fonctionnalité syntaxique distincte, sont " +"importantes et nécessaires lorsque nous souhaitons exprimer de manière concise des idées " +"plus complexes que ne le permettraient les seuls modèles." + +#: src/pattern-matching/match.md +msgid "" +"Match guards are different from `if` expressions after the `=>`. An `if` expression is " +"evaluated after the match arm is selected. Failing the `if` condition inside of that " +"block won't result in other arms of the original `match` expression being considered. In " +"the following example, the wildcard pattern `_ =>` is never even attempted." +msgstr "" +"Les gardes de correspondance diffèrent des expressions `if` après `=>`. Une expression " +"`if` est évaluée après la sélection du bras de correspondance. Si la condition `if` à " +"l'intérieur de ce bloc n'est pas vérifiée, les autres bras de l'expression `match` " +"d'origine ne seront pas pris en compte. Dans l'exemple suivant, le modèle générique `_ " +"=>` n'est même pas testé." + +#: src/pattern-matching/match.md +msgid "\"Uppercase\"" +msgstr "\"Grande casse\"" + +#: src/pattern-matching/match.md +msgid "\"Bug: this is never printed\"" +msgstr "\"Bogue : ceci n'est jamais affiché\"" + +#: src/pattern-matching/match.md +msgid "" +"The condition defined in the guard applies to every expression in a pattern with an `|`." +msgstr "" +"La condition définie dans la garde s'applique à chaque expression dans un modèle avec un " +"`|`." + +#: src/pattern-matching/match.md +msgid "" +"Note that you can't use an existing variable as the condition in a match arm, as it will " +"instead be interpreted as a variable name pattern, which creates a new variable that will " +"shadow the existing one. For example:" +msgstr "" +"Notez que vous ne pouvez pas utiliser une variable existante comme condition dans une " +"boucle de correspondance, car elle sera interprétée comme un modèle de nom de variable, " +"ce qui créera une nouvelle variable qui masquera l'existante. Par exemple :" + +#: src/pattern-matching/match.md +msgid "\"Expected value is 5, actual is {expected}\"" +msgstr "\"La valeur attendue est 5, la valeur actuelle est {expected}\"" + +#: src/pattern-matching/match.md +msgid "\"Value was something else\"" +msgstr "\"La valeur était autre chose\"" + +#: src/pattern-matching/match.md +msgid "" +"Here we're trying to match on the number 123, where we want the first case to check if " +"the value is 5. The naive expectation is that the first case won't match because the " +"value isn't 5, but instead this is interpreted as a variable pattern which always " +"matches, meaning the first branch will always be taken. If a constant is used instead " +"this will then work as expected." +msgstr "" +"Ici, nous cherchons à identifier le nombre 123, et nous voulons que le premier test " +"vérifie si sa valeur est 5. On pourrait s'attendre à ce que ce premier test ne " +"corresponde pas, car la valeur n'est pas 5. Or, il est interprété comme un motif variable " +"qui correspond toujours, ce qui signifie que la première branche sera systématiquement " +"empruntée. Si une constante est utilisée à la place, le comportement sera alors conforme " +"aux attentes." + +#: src/pattern-matching/match.md +msgid "" +"Another piece of pattern syntax you can show students is the `@` syntax which binds a " +"part of a pattern to a variable. For example:" +msgstr "" +"Un autre élément de syntaxe de motif que vous pouvez montrer aux apprenants est la syntaxe " +"`@` qui lie une partie d'un motif à une variable. Par exemple :" + +#: src/pattern-matching/match.md +msgid "\"outer: {outer:?}, inner: {inner}\"" +msgstr "\"outer: {outer:?}, inner: {inner}\"" + +#: src/pattern-matching/match.md +msgid "" +"In this example `inner` has the value 123 which it pulled from the `Option` via " +"destructuring, `outer` captures the entire `Some(inner)` expression, so it contains the " +"full `Option::Some(123)`. This is rarely used but can be useful in more complex patterns." +msgstr "" +"Dans cet exemple, `inner` a la valeur 123, extraite de `Option` par déstructuration. " +"`outer` capture l'intégralité de l'expression `Some(inner)`, contenant ainsi `Option::" +"Some(123)`. Cette approche est rarement utilisée, mais peut s'avérer utile dans des cas " +"plus complexes." + +#: src/pattern-matching/destructuring-structs.md +msgid "Structs" +msgstr "Structures" + +#: src/pattern-matching/destructuring-structs.md +msgid "Like tuples, structs can also be destructured by matching:" +msgstr "" +"Comme les tuples, les structures peuvent également être déstructurées par correspondance :" + +#: src/pattern-matching/destructuring-structs.md +msgid "\"Standing still\"" +msgstr "\"Rester immobile\"" + +#: src/pattern-matching/destructuring-structs.md +msgid "\"{repeat} step x: {x}\"" +msgstr "\"{repeat} pas x: {x}\"" + +#: src/pattern-matching/destructuring-structs.md +msgid "\"Single step y: {y}\"" +msgstr "\"Single pas y: {y}\"" + +#: src/pattern-matching/destructuring-structs.md +msgid "\"Other move\"" +msgstr "\"Autre déplacement\"" + +#: src/pattern-matching/destructuring-structs.md +msgid "Change the literal values in `m` to match with the other patterns." +msgstr "" +"Modifiez les valeurs littérales dans `m` pour qu'elles correspondent aux autres modèles." + +#: src/pattern-matching/destructuring-structs.md +msgid "Add a new field to `Movement` and make changes to the pattern as needed." +msgstr "Ajoutez un nouveau champ à `Movement` et modifiez le modèle selon vos besoins." + +#: src/pattern-matching/destructuring-structs.md +msgid "Note how `delta: (x, 0)` is a nested pattern." +msgstr "Notez que `delta: (x, 0)` est un modèle imbriqué." + +#: src/pattern-matching/destructuring-structs.md +msgid "" +"Try `match &m` and check the type of captures. The pattern syntax remains the same, but " +"the captures become shared references. This is [match ergonomics](https://rust-lang." +"github.io/rfcs/2005-match-ergonomics.html) and is often useful with `match self` when " +"implementing methods on an enum." +msgstr "" +"Essayez `match &m` et observez le type de captures. La syntaxe du motif reste la même, " +"mais les captures deviennent des références partagées. C'est ce qu'on appelle l'ergonomie " +"de `match` (https://rust-lang.github.io/rfcs/2005-match-ergonomics.html), souvent utile " +"avec `match self` lors de l'implémentation de méthodes sur une énumération." + +#: src/pattern-matching/destructuring-structs.md +msgid "" +"The same effect occurs with `match &mut m`: the captures become exclusive references." +msgstr "" +"Le même effet se produit avec `match &mut m` : les captures deviennent des références " +"exclusives." + +#: src/pattern-matching/destructuring-structs.md +msgid "" +"The distinction between a capture and a constant expression can be hard to spot. Try " +"changing the `10` in the first arm to a variable, and see that it subtly doesn't work. " +"Change it to a `const` and see it working again." +msgstr "" +"La distinction entre une capture et une expression constante peut être difficile à " +"percevoir. Essayez de remplacer `10` dans la première branche par une variable : vous " +"constaterez que cela ne fonctionne plus. Remplacez-le par une constante (`const`) et vous " +"verrez que cela fonctionne à nouveau." + +#: src/pattern-matching/destructuring-enums.md +msgid "Like tuples, enums can also be destructured by matching:" +msgstr "" +"Comme les tuples, les énumérations peuvent également être déstructurées par " +"correspondance :" + +#: src/pattern-matching/destructuring-enums.md +msgid "" +"Patterns can also be used to bind variables to parts of your values. This is how you " +"inspect the structure of your types. Let us start with a simple `enum` type:" +msgstr "" +"Les modèles peuvent également servir à lier des variables à des parties de vos valeurs. " +"C'est ainsi que vous examinez la structure de vos types. Commençons par un type `enum` " +"simple :" + +#: src/pattern-matching/destructuring-enums.md +msgid "\"cannot divide {n} into two equal parts\"" +msgstr "\"on ne peut pqs diviser {n} en deux parties égales\"" + +#: src/pattern-matching/destructuring-enums.md +msgid "\"{n} divided in two is {half}\"" +msgstr "\"{n} divisé en deux moitiés {half}\"" + +#: src/pattern-matching/destructuring-enums.md +msgid "\"sorry, an error happened: {msg}\"" +msgstr "\"désolé, une erreur s'est produite : {msg}\"" + +#: src/pattern-matching/destructuring-enums.md +msgid "" +"Here we have used the arms to _destructure_ the `Result` value. In the first arm, `half` " +"is bound to the value inside the `Ok` variant. In the second arm, `msg` is bound to the " +"error message." +msgstr "" +"Ici, nous avons utilisé les bras pour déstructurer la valeur `Result`. Dans le premier " +"bras, `half` est lié à la valeur de la variante `Ok`. Dans le second bras, `msg` est lié " +"au message d'erreur." + +#: src/pattern-matching/destructuring-enums.md +msgid "" +"The `if`/`else` expression is returning an enum that is later unpacked with a `match`." +msgstr "" +"L'expression `if`/`else` renvoie une énumération qui est ensuite décompressée avec une " +"`match`." + +#: src/pattern-matching/destructuring-enums.md +msgid "" +"You can try adding a third variant to the enum definition and displaying the errors when " +"running the code. Point out the places where your code is now inexhaustive and how the " +"compiler tries to give you hints." +msgstr "" +"Vous pouvez essayer d'ajouter une troisième variante à la définition de l'énumération et " +"d'afficher les erreurs lors de l'exécution du code. Indiquez les endroits où votre code " +"est désormais incomplet et comment le compilateur tente de vous fournir des indications." + +#: src/pattern-matching/destructuring-enums.md +msgid "The values in the enum variants can only be accessed after being pattern matched." +msgstr "" +"Les valeurs des variantes d'énumération ne sont accessibles qu'après correspondance de " +"modèle." + +#: src/pattern-matching/destructuring-enums.md +msgid "" +"Demonstrate what happens when the search is inexhaustive. Note the advantage the Rust " +"compiler provides by confirming when all cases are handled." +msgstr "" +"Démontrez ce qui se passe lorsque la recherche est incomplète. Notez l'avantage que " +"procure le compilateur Rust en confirmant que tous les cas ont été traités." + +#: src/pattern-matching/destructuring-enums.md +msgid "" +"Demonstrate the syntax for a struct-style variant by adding one to the enum definition " +"and the `match`. Point out how this is syntactically similar to matching on a struct." +msgstr "" +"Illustrez la syntaxe d'une variante de type structure en l'ajoutant à la définition de " +"l'énumération et à la fonction `match`. Montrez en quoi cela est syntaxiquement similaire " +"à la correspondance sur une structure." + +#: src/pattern-matching/let-control-flow.md +msgid "" +"Rust has a few control flow constructs that differ from other languages. They are used " +"for pattern matching:" +msgstr "" +"Rust possède quelques mécanismes de contrôle de flux qui diffèrent des autres langages. " +"Ils sont utilisés pour la correspondance de modèles :" + +#: src/pattern-matching/let-control-flow.md +msgid "`if let` expressions" +msgstr "expressions `if let`" + +#: src/pattern-matching/let-control-flow.md +msgid "`while let` expressions" +msgstr "expressions `while let`" + +#: src/pattern-matching/let-control-flow.md +msgid "`let else` expressions" +msgstr "expressions `let else`" + +#: src/pattern-matching/let-control-flow/if-let.md +msgid "" +"The [`if let` expression](https://doc.rust-lang.org/reference/expressions/if-expr.html#if-" +"let-expressions) lets you execute different code depending on whether a value matches a " +"pattern:" +msgstr "" +"L'expression [`if let`](https://doc.rust-lang.org/reference/expressions/if-expr.html#if-" +"let-expressions) vous permet d'exécuter un code différent selon qu'une valeur corresponde " +"ou non à un modèle :" + +#: src/pattern-matching/let-control-flow/if-let.md +msgid "\"slept for {duration:?}\"" +msgstr "\"slept for {duration:?}\"" + +#: src/pattern-matching/let-control-flow/if-let.md +msgid "" +"Unlike `match`, `if let` does not have to cover all branches. This can make it more " +"concise than `match`." +msgstr "" +"Contrairement à `match`, `if let` n'est pas obligé de couvrir toutes les branches. Cela " +"peut le rendre plus concis que `match`." + +#: src/pattern-matching/let-control-flow/if-let.md +msgid "A common usage is handling `Some` values when working with `Option`." +msgstr "" +"Une utilisation courante consiste à gérer les valeurs `Some` lors de l'utilisation de " +"`Option`." + +#: src/pattern-matching/let-control-flow/if-let.md +msgid "Unlike `match`, `if let` does not support guard clauses for pattern matching." +msgstr "" +"Contrairement à `match`, `if let` ne prend pas en charge les clauses de garde pour la " +"correspondance de modèles." + +#: src/pattern-matching/let-control-flow/if-let.md +msgid "With an `else` clause, this can be used as an expression." +msgstr "Avec une clause `else`, cela peut être utilisé comme une expression." + +#: src/pattern-matching/let-control-flow/while-let.md +msgid "" +"Like with `if let`, there is a [`while let`](https://doc.rust-lang.org/reference/" +"expressions/loop-expr.html#predicate-pattern-loops) variant that repeatedly tests a value " +"against a pattern:" +msgstr "" +"Comme avec `if let`, il existe une variante [`while let`](https://doc.rust-lang.org/" +"reference/expressions/loop-expr.html#predicate-pattern-loops) qui teste de manière " +"répétée une valeur par rapport à un modèle :" + +#: src/pattern-matching/let-control-flow/while-let.md +msgid "\"Comprehensive Rust 🦀\"" +msgstr "Bienvenue à Comprehensive Rust (le guide complet de Rust) 🦀" + +#: src/pattern-matching/let-control-flow/while-let.md +msgid "// (There are more efficient ways to reverse a string!)\n" +msgstr "// (Il y a d'autres moyens efficaces de renverser une chaîne !)\n" + +#: src/pattern-matching/let-control-flow/while-let.md +msgid "" +"Here [`String::pop`](https://doc.rust-lang.org/stable/std/string/struct.String." +"html#method.pop) returns `Some(c)` until the string is empty, after which it will return " +"`None`. The `while let` lets us keep iterating through all items." +msgstr "" +"Ici, la méthode `String::pop` (https://doc.rust-lang.org/stable/std/string/struct.String." +"html#method.pop) renvoie `Some(c)` tant que la chaîne est vide, après quoi elle renvoie " +"`None`. La boucle `while let` permet de parcourir tous les éléments." + +#: src/pattern-matching/let-control-flow/while-let.md +msgid "" +"Point out that the `while let` loop will keep going as long as the value matches the " +"pattern." +msgstr "" +"Faites remarquer que la boucle `while let` continuera de s'exécuter tant que la valeur " +"correspond au modèle." + +#: src/pattern-matching/let-control-flow/while-let.md +msgid "" +"You could rewrite the `while let` loop as an infinite loop with an if statement that " +"breaks when there is no value to unwrap for `name.pop()`. The `while let` provides " +"syntactic sugar for the above scenario." +msgstr "" +"On pourrait réécrire la boucle `while let` en une boucle infinie avec une condition `if` " +"qui s'interrompt lorsqu'il n'y a plus de valeur à extraire pour `name.pop()`. La boucle " +"`while let` simplifie la syntaxe dans ce cas." + +#: src/pattern-matching/let-control-flow/while-let.md +msgid "" +"This form cannot be used as an expression, because it may have no value if the condition " +"is false." +msgstr "" +"Cette forme ne peut pas être utilisée comme une expression, car elle peut n'avoir aucune " +"valeur si la condition est fausse." + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "`let else` Statements" +msgstr "expressions `let else`" + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "" +"For the common case of matching a pattern and returning from the function, use [`let " +"else`](https://doc.rust-lang.org/rust-by-example/flow_control/let_else.html). The " +"\"else\" case must diverge (`return`, `break`, or panic - anything but falling off the " +"end of the block)." +msgstr "" +"Dans le cas courant où une fonction recherche un motif et retourne, utilisez `let else`. " +"Le cas `else` doit diverger (`return`, `break` ou `panic`, sauf en cas de sortie de bloc)." + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "\"got None\"" +msgstr "\"on a obtenu None\"" + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "\"got empty string\"" +msgstr "\"on a obtenu une chaîne vide\"" + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "\"not a hex digit\"" +msgstr "\"ce n'est pas un nombre hexadécimal\"" + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "\"result: {:?}\"" +msgstr "\"résultat : {:?}\"" + +#: src/pattern-matching/let-control-flow/let-else.md src/generics/trait-bounds.md +#: src/testing/solution.md src/android/testing.md src/android/testing/googletest.md +msgid "\"foo\"" +msgstr "\"foo\"" + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "" +"This early return-based control flow is common in Rust error handling code, where you try " +"to get a value out of a `Result`, returning an error if the `Result` was `Err`." +msgstr "" +"Ce type de contrôle de flux basé sur un retour anticipé est courant dans le code de " +"gestion des erreurs en Rust, où l'on tente d'extraire une valeur d'un `Result`, en " +"renvoyant une erreur si le `Result` est de type `Err`." + +#: src/pattern-matching/let-control-flow/let-else.md +msgid "" +"If students ask, you can also demonstrate how real error handling code would be written " +"with `?`." +msgstr "" +"Si les apprenants vous le demandent, vous pouvez également leur montrer comment on écrirait " +"un véritable code de gestion des erreurs à l'aide de `?`." + +#: src/pattern-matching/exercise.md +msgid "Let's write a simple recursive evaluator for arithmetic expressions." +msgstr "Écrivons un évaluateur récursif simple pour les expressions arithmétiques." + +#: src/pattern-matching/exercise.md +msgid "" +"An example of a small arithmetic expression could be `10 + 20`, which evaluates to `30`. " +"We can represent the expression as a tree:" +msgstr "" +"Un exemple de petite expression arithmétique pourrait être « 10 + 20 », dont le résultat " +"est « 30 ». Nous pouvons représenter cette expression sous forme d'arbre :" + +#: src/pattern-matching/exercise.md +msgid "" +"A bigger and more complex expression would be `(10 * 9) + ((3 - 4) * 5)`, which evaluates " +"to `85`. We represent this as a much bigger tree:" +msgstr "" +"Une expression plus longue et plus complexe serait `(10 * 9) + ((3 - 4) * 5)`, dont le " +"résultat est `85`. Nous la représentons sous la forme d'un arbre beaucoup plus grand :" + +#: src/pattern-matching/exercise.md +msgid "In code, we will represent the tree with two types:" +msgstr "Dans le code, nous représenterons l'arbre à l'aide de deux types :" + +#: src/pattern-matching/exercise.md src/pattern-matching/solution.md +#: src/error-handling/exercise.md src/error-handling/solution.md +msgid "/// An operation to perform on two subexpressions.\n" +msgstr "/// Une opération à réaliser sur deux sous-expressions.\n" + +#: src/pattern-matching/exercise.md src/pattern-matching/solution.md +#: src/error-handling/exercise.md src/error-handling/solution.md +msgid "/// An expression, in tree form.\n" +msgstr "/// Une expression sous forme d'arbre.\n" + +#: src/pattern-matching/exercise.md src/pattern-matching/solution.md +#: src/error-handling/exercise.md src/error-handling/solution.md +msgid "/// An operation on two subexpressions.\n" +msgstr "/// Une opération sur deux sous-expressions.\n" + +#: src/pattern-matching/exercise.md src/pattern-matching/solution.md +#: src/error-handling/exercise.md src/error-handling/solution.md +msgid "/// A literal value\n" +msgstr "/// Une valeur littérale\n" + +#: src/pattern-matching/exercise.md +msgid "" +"The `Box` type here is a smart pointer, and will be covered in detail later in the " +"course. An expression can be \"boxed\" with `Box::new` as seen in the tests. To evaluate " +"a boxed expression, use the deref operator (`*`) to \"unbox\" it: `eval(*boxed_expr)`." +msgstr "" +"Le type `Box` est ici un pointeur intelligent ; il sera abordé en détail plus loin dans " +"ce cours. Une expression peut être « mise en boîte » à l'aide de `Box::new`, comme on le " +"voit dans les tests. Pour évaluer une expression mise en boîte, utilisez l'opérateur de " +"déréférencement (`*`) afin de la « déboîter » : `eval(*boxed_expr)`." + +#: src/pattern-matching/exercise.md +msgid "" +"Copy and paste the code into the Rust playground, and begin implementing `eval`. The " +"final product should pass the tests. It may be helpful to use `todo!()` and get the tests " +"to pass one-by-one. You can also skip a test temporarily with `#[ignore]`:" +msgstr "" +"Copiez-collez le code dans le Rust Playground et commencez à implémenter `eval`. Le " +"résultat final devrait réussir les tests. Il peut être utile d'utiliser `todo!()` pour " +"faire passer les tests un par un. Vous pouvez également ignorer temporairement un test " +"avec `#[ignore]` :" + +#: src/methods-and-traits/methods.md +msgid "" +"Rust allows you to associate functions with your new types. You do this with an `impl` " +"block:" +msgstr "" +"Rust vous permet d'associer des fonctions à vos nouveaux types. Vous faites cela avec un " +"bloc `impl` :" + +#: src/methods-and-traits/methods.md +msgid "// No receiver, a static method\n" +msgstr "// Pas de receveur : une méthode statique\n" + +#: src/methods-and-traits/methods.md +msgid "// Exclusive borrowed read-write access to self\n" +msgstr "// Référence exclusive en lecture-écriture vers self\n" + +#: src/methods-and-traits/methods.md +msgid "// Shared and read-only borrowed access to self\n" +msgstr "// Référence partagée en lecture seule vers self\n" + +#: src/methods-and-traits/methods.md +msgid "\"Recorded {} laps for {}:\"" +msgstr "\"{} tours enregistrés pour {}:\"" + +#: src/methods-and-traits/methods.md +msgid "\"Lap {idx}: {lap} sec\"" +msgstr "\"tour {idx}: {lap} sec\"" + +#: src/methods-and-traits/methods.md +msgid "// Exclusive ownership of self (covered later)\n" +msgstr "// Possession exclusive de self (nous en parlerons plus tard)\n" + +#: src/methods-and-traits/methods.md +msgid "\"Race {} is finished, total lap time: {}\"" +msgstr "\"La course {} est finie, temps total de tour : {}\"" + +#: src/methods-and-traits/methods.md +msgid "\"Monaco Grand Prix\"" +msgstr "\"Grand Prix de Monaco\"" + +#: src/methods-and-traits/methods.md +msgid "// race.add_lap(42);\n" +msgstr "// race.add_lap(42);\n" + +#: src/methods-and-traits/methods.md +msgid "" +"The `self` arguments specify the \"receiver\" - the object the method acts on. There are " +"several common receivers for a method:" +msgstr "" +"Les arguments « self » désignent le « récepteur », c'est-à-dire l'objet sur lequel porte " +"la méthode. Il existe plusieurs types courants de récepteurs pour une méthode :" + +#: src/methods-and-traits/methods.md +msgid "" +"`&self`: borrows the object from the caller using a shared and immutable reference. The " +"object can be used again afterwards." +msgstr "" +"`&self` : emprunte l’objet à l’appelant en utilisant une référence partagée et immuable. " +"L’objet peut être réutilisé par la suite." + +#: src/methods-and-traits/methods.md +msgid "" +"`&mut self`: borrows the object from the caller using a unique and mutable reference. The " +"object can be used again afterwards." +msgstr "" +"`&mut self` : emprunte l’objet à l’appelant à l’aide d’une référence unique et " +"modifiable. L’objet peut être réutilisé par la suite." + +#: src/methods-and-traits/methods.md +msgid "" +"`self`: takes ownership of the object and moves it away from the caller. The method " +"becomes the owner of the object. The object will be dropped (deallocated) when the method " +"returns, unless its ownership is explicitly transmitted. Complete ownership does not " +"automatically mean mutability." +msgstr "" +"`self` : prend possession de l’objet et le retire de la méthode appelante. La méthode " +"devient propriétaire de l’objet. L’objet sera libéré (désalloué) lorsque la méthode se " +"termine, sauf si sa propriété est explicitement transmise. La propriété complète " +"n’implique pas automatiquement la mutabilité." + +#: src/methods-and-traits/methods.md +msgid "`mut self`: same as above, but the method can mutate the object." +msgstr "`mut self` : identique à ci-dessus, mais la méthode peut modifier l’objet." + +#: src/methods-and-traits/methods.md +msgid "" +"No receiver: this becomes a static method on the struct. Typically used to create " +"constructors that are called `new` by convention." +msgstr "" +"Aucun récepteur : cette méthode devient statique sur la structure. Elle sert généralement " +"à créer des constructeurs appelés `new` par convention." + +#: src/methods-and-traits/methods.md +msgid "It can be helpful to introduce methods by comparing them to functions." +msgstr "Il peut être utile de présenter les méthodes en les comparant à des fonctions." + +#: src/methods-and-traits/methods.md +msgid "" +"Methods are called on an instance of a type (such as a struct or enum), the first " +"parameter represents the instance as `self`." +msgstr "" +"Les méthodes sont appelées sur une instance d'un type (comme une structure ou une " +"énumération), le premier paramètre représentant l'instance sous la forme `self`." + +#: src/methods-and-traits/methods.md +msgid "" +"Developers may choose to use methods to take advantage of method receiver syntax and to " +"help keep them more organized. By using methods we can keep all the implementation code " +"in one predictable place." +msgstr "" +"Les développeurs peuvent choisir d'utiliser des méthodes pour tirer parti de la syntaxe " +"des récepteurs de méthodes et pour une meilleure organisation du code. L'utilisation de " +"méthodes permet de centraliser tout le code d'implémentation dans un emplacement unique " +"et prévisible." + +#: src/methods-and-traits/methods.md +msgid "" +"Note that methods can also be called like associated functions by explicitly passing the " +"receiver in, e.g. `CarRace::add_lap(&mut race, 20)`." +msgstr "" +"Notez que les méthodes peuvent également être appelées comme des fonctions associées en " +"passant explicitement le récepteur, par exemple `CarRace::add_lap(&mut race, 20)`." + +#: src/methods-and-traits/methods.md +msgid "Point out the use of the keyword `self`, a method receiver." +msgstr "Soulignez l'utilisation du mot-clé `self`, un récepteur de méthode." + +#: src/methods-and-traits/methods.md +msgid "" +"Show that it is an abbreviated term for `self: Self` and perhaps show how the struct name " +"could also be used." +msgstr "" +"Montrez qu'il s'agit d'une abréviation de `self: Self` et indiquez éventuellement comment " +"le nom de la structure pourrait également être utilisé." + +#: src/methods-and-traits/methods.md +msgid "" +"Explain that `Self` is a type alias for the type the `impl` block is in and can be used " +"elsewhere in the block." +msgstr "" +"Expliquez que `Self` est un alias de type pour le type dans lequel se trouve le bloc " +"`impl` et qu'il peut être utilisé ailleurs dans le bloc." + +#: src/methods-and-traits/methods.md +msgid "" +"Note how `self` is used like other structs and dot notation can be used to refer to " +"individual fields." +msgstr "" +"Notez que `self` est utilisé comme les autres structures et que la notation pointée peut " +"être utilisée pour faire référence à des champs individuels." + +#: src/methods-and-traits/methods.md +msgid "" +"This might be a good time to demonstrate how the `&self` differs from `self` by trying to " +"run `finish` twice." +msgstr "" +"Ce serait peut-être le bon moment pour démontrer en quoi `&self` diffère de `self` en " +"essayant d'exécuter `finish` deux fois." + +#: src/methods-and-traits/methods.md +msgid "" +"Beyond variants on `self`, there are also [special wrapper types](https://doc.rust-lang." +"org/reference/special-types-and-traits.html) allowed to be receiver types, such as " +"`Box`." +msgstr "" +"Au-delà des variantes de `self`, il existe également des [types wrapper spéciaux](https://" +"doc.rust-lang.org/reference/special-types-and-traits.html) autorisés à être des types " +"récepteurs, tels que `Box`." + +#: src/methods-and-traits/traits.md +msgid "Rust lets you abstract over types with traits. They're similar to interfaces:" +msgstr "" +"Rust permet d'abstraire les types grâce aux traits. Ils sont similaires aux interfaces :" + +#: src/methods-and-traits/traits.md +msgid "/// Return a sentence from this pet.\n" +msgstr "/// Retourne une phrase de cet animal.\n" + +#: src/methods-and-traits/traits.md +msgid "/// Print a string to the terminal greeting this pet.\n" +msgstr "/// Affiche une chaîne sur le terminal saluant cet animal.\n" + +#: src/methods-and-traits/traits.md +msgid "" +"A trait defines a number of methods that types must have in order to implement the trait." +msgstr "" +"Un trait définit un certain nombre de méthodes que les types doivent posséder pour " +"implémenter ce trait." + +#: src/methods-and-traits/traits.md +msgid "" +"In the \"Generics\" segment, next, we will see how to build functionality that is generic " +"over all types implementing a trait." +msgstr "" +"Dans la section « Génériques », nous verrons ensuite comment créer des fonctionnalités " +"génériques pour tous les types implémentant un trait." + +#: src/methods-and-traits/traits/implementing.md +msgid "\"Oh you're a cutie! What's your name? {}\"" +msgstr "\"Oh tu es mignon ! Quel est ton nom ? {}\"" + +#: src/methods-and-traits/traits/implementing.md src/generics/dyn-trait.md +#: src/smart-pointers/trait-objects.md +msgid "\"Woof, my name is {}!\"" +msgstr "\"Woof, je m'appelle {}!\"" + +#: src/methods-and-traits/traits/implementing.md src/generics/dyn-trait.md +#: src/smart-pointers/trait-objects.md +msgid "\"Fido\"" +msgstr "\"Fido\"" + +#: src/methods-and-traits/traits/implementing.md +msgid "To implement `Trait` for `Type`, you use an `impl Trait for Type { .. }` block." +msgstr "" +"Pour implémenter `Trait` pour `Type`, vous utilisez un bloc `impl Trait for Type { .. }`." + +#: src/methods-and-traits/traits/implementing.md +msgid "" +"Unlike Go interfaces, just having matching methods is not enough: a `Cat` type with a " +"`talk()` method would not automatically satisfy `Pet` unless it is in an `impl Pet` block." +msgstr "" +"Contrairement aux interfaces Go, le simple fait d'avoir des méthodes correspondantes ne " +"suffit pas : un type `Cat` avec une méthode `talk()` ne satisferait pas automatiquement " +"`Pet` à moins qu'il ne soit dans un bloc `impl Pet`." + +#: src/methods-and-traits/traits/implementing.md +msgid "" +"Traits may provide default implementations of some methods. Default implementations can " +"rely on all the methods of the trait. In this case, `greet` is provided, and relies on " +"`talk`." +msgstr "" +"Les traits peuvent fournir des implémentations par défaut de certaines méthodes. Ces " +"implémentations par défaut peuvent dépendre de toutes les méthodes du trait. Dans ce cas, " +"`greet` est fournie et dépend de `talk`." + +#: src/methods-and-traits/traits/implementing.md +msgid "" +"Multiple `impl` blocks are allowed for a given type. This includes both inherent `impl` " +"blocks and trait `impl` blocks. Likewise multiple traits can be implemented for a given " +"type (and often types implement many traits!). `impl` blocks can even be spread across " +"multiple modules/files." +msgstr "" +"Plusieurs blocs `impl` sont autorisés pour un type donné. Cela inclut les blocs `impl` " +"inhérents et les blocs `impl` de traits. De même, plusieurs traits peuvent être " +"implémentés pour un type donné (et souvent, les types implémentent de nombreux traits !). " +"Les blocs `impl` peuvent même être répartis sur plusieurs modules ou fichiers." + +#: src/methods-and-traits/traits/supertraits.md +msgid "" +"A trait can require that types implementing it also implement other traits, called " +"_supertraits_. Here, any type implementing `Pet` must implement `Animal`." +msgstr "" +"Un trait peut exiger que les types qui l'implémentent implémentent également d'autres " +"traits, appelés _supertraits_. Ici, tout type implémentant `Pet` doit implémenter " +"`Animal`." + +#: src/methods-and-traits/traits/supertraits.md +msgid "\"Rex\"" +msgstr "\"Rex\"" + +#: src/methods-and-traits/traits/supertraits.md +msgid "\"{} has {} legs\"" +msgstr "\"{} a {} pattes\"" + +#: src/methods-and-traits/traits/supertraits.md +msgid "" +"This is sometimes called \"trait inheritance\" but students should not expect this to " +"behave like OO inheritance. It just specifies an additional requirement on " +"implementations of a trait." +msgstr "" +"Un trait peut exiger que les types qui l'implémentent implémentent également d'autres " +"traits, appelés « supertraits ». Ce mécanisme est parfois appelé « héritage de traits », " +"mais les apprenants ne doivent pas s'attendre à ce qu'il fonctionne comme l'héritage " +"orienté objet. Il spécifie simplement une exigence supplémentaire pour les " +"implémentations d'un trait. Par exemple, tout type implémentant `Pet` doit implémenter " +"`Animal`." + +#: src/methods-and-traits/traits/associated-types.md +msgid "" +"Associated types are placeholder types that are supplied by the trait implementation." +msgstr "" +"Les types associés sont des types de substitution fournis par l'implémentation du trait." + +#: src/methods-and-traits/traits/associated-types.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +#: src/idiomatic/polymorphism/refresher/monomorphization.md +#: src/unsafe-deep-dive/safety-preconditions/determining.md +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "\"{:?}\"" +msgstr "\"{:?}\"" + +#: src/methods-and-traits/traits/associated-types.md +msgid "" +"Associated types are sometimes also called \"output types\". The key observation is that " +"the implementer, not the caller, chooses this type." +msgstr "" +"Les types associés sont parfois aussi appelés « types de sortie ». L’observation " +"essentielle est que c’est l’implémenteur, et non l’appelant, qui choisit ce type." + +#: src/methods-and-traits/traits/associated-types.md +msgid "" +"Many standard library traits have associated types, including arithmetic operators and " +"`Iterator`." +msgstr "" +"De nombreux traits de la bibliothèque standard ont des types associés, notamment les " +"opérateurs arithmétiques et `Iterator`." + +#: src/methods-and-traits/deriving.md +msgid "Supported traits can be automatically implemented for your custom types, as follows:" +msgstr "" +"Les caractéristiques prises en charge peuvent être automatiquement implémentées pour vos " +"types personnalisés, comme suit :" + +#: src/methods-and-traits/deriving.md +msgid "// Default trait adds `default` constructor.\n" +msgstr "// Le trait `Default` ajoute le constructeur `default`.\n" + +#: src/methods-and-traits/deriving.md +msgid "// Clone trait adds `clone` method.\n" +msgstr "// Le trait `Clone`ajoute la méthode `clone`.\n" + +#: src/methods-and-traits/deriving.md +msgid "\"EldurScrollz\"" +msgstr "\"EldurScrollz\"" + +#: src/methods-and-traits/deriving.md +msgid "// Debug trait adds support for printing with `{:?}`.\n" +msgstr "// Le trait `Debug` ajoute la faculté d'imprimer avec `{:?}`.\n" + +#: src/methods-and-traits/deriving.md +msgid "\"{p1:?} vs. {p2:?}\"" +msgstr "\"{p1:?} vs. {p2:?}\"" + +#: src/methods-and-traits/deriving.md +msgid "" +"Derivation is implemented with macros, and many crates provide useful derive macros to " +"add useful functionality. For example, `serde` can derive serialization support for a " +"struct using `#[derive(Serialize)]`." +msgstr "" +"Les caractéristiques prises en charge peuvent être implémentées automatiquement pour vos " +"types personnalisés, car folloDerivation est implémenté avec des macros, et de nombreuses " +"bibliothèques fournissent des macros de dérivation utiles pour ajouter des " +"fonctionnalités pratiques. Par exemple, `serde` peut dériver la prise en charge de la " +"sérialisation pour une structure en utilisant `#[derive(Serialize)]`.ws :" + +#: src/methods-and-traits/deriving.md +msgid "" +"Derivation is usually provided for traits that have a common boilerplate implementation " +"that is correct for most cases. For example, demonstrate how a manual `Clone` impl can be " +"repetitive compared to deriving the trait:" +msgstr "" +"On propose généralement une méthode de dérivation pour les traits qui possèdent une " +"implémentation standard commune, correcte dans la plupart des cas. Par exemple, illustrez " +"en quoi une implémentation manuelle de `Clone` peut être répétitive par rapport à la " +"dérivation du trait :" + +#: src/methods-and-traits/deriving.md +msgid "" +"Not all of the `.clone()`s in the above are necessary in this case, but this demonstrates " +"the generally boilerplate-y pattern that manual impls would follow, which should help " +"make the use of `derive` clear to students." +msgstr "" +"Tous les `.clone()` de ce qui précède ne sont pas nécessaires dans ce cas, mais cela " +"illustre le modèle généralement standard que suivraient les implémentations manuelles, ce " +"qui devrait aider à clarifier l'utilisation de `derive` pour les étudiants." + +#: src/methods-and-traits/exercise.md +msgid "Exercise: Logger Trait" +msgstr "Exercice : Trait Logger" + +#: src/methods-and-traits/exercise.md +msgid "" +"Let's design a simple logging utility, using a trait `Logger` with a `log` method. Code " +"that might log its progress can then take an `&impl Logger`. In testing, this might put " +"messages in the test logfile, while in a production build it would send messages to a log " +"server." +msgstr "" +"Concevons un utilitaire de journalisation simple, utilisant un trait `Logger` avec une " +"méthode `log`. Le code susceptible d'enregistrer sa progression pourra alors prendre un " +"`&impl Logger`. En phase de test, les messages seront consignés dans le fichier de " +"journalisation de test, tandis qu'en production, ils seront envoyés à un serveur de " +"journalisation." + +#: src/methods-and-traits/exercise.md +msgid "" +"However, the `StderrLogger` given below logs all messages, regardless of verbosity. Your " +"task is to write a `VerbosityFilter` type that will ignore messages above a maximum " +"verbosity." +msgstr "" +"Cependant, le `StderrLogger` ci-dessous enregistre tous les messages, quel que soit leur " +"niveau de verbosité. Votre tâche consiste à écrire un `VerbosityFilter` qui ignorera les " +"messages dont le niveau de verbosité dépasse un seuil maximal." + +#: src/methods-and-traits/exercise.md +msgid "" +"This is a common pattern: a struct wrapping a trait implementation and implementing that " +"same trait, adding behavior in the process. In the \"Generics\" segment, we will see how " +"to make the wrapper generic over the wrapped type." +msgstr "" +"Il s'agit d'un schéma courant : une structure encapsule une implémentation de trait et " +"implémente ce même trait, en y ajoutant un comportement. Dans la section « Génériques », " +"nous verrons comment rendre l'encapsuleur générique par rapport au type encapsulé." + +#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md +#: src/generics/generic-data.md src/closures/exercise.md src/closures/solution.md +msgid "/// Log a message at the given verbosity level.\n" +msgstr "/// Logue un message à un niveau de verbosité donné.\n" + +#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md +#: src/generics/generic-data.md src/closures/exercise.md src/closures/solution.md +msgid "\"verbosity={verbosity}: {message}\"" +msgstr "\"verbosité={verbosity}: {message}\"" + +#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md +#: src/generics/generic-data.md +msgid "/// Only log messages up to the given verbosity level.\n" +msgstr "/// Ne logue que les messages jusqu'à un niveau de verbosité donné.\n" + +#: src/methods-and-traits/exercise.md +msgid "// TODO: Implement the `Logger` trait for `VerbosityFilter`.\n" +msgstr "// TODO: Implémentez le trait `Logger` pour `VerbosityFilter`.\n" + +#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md +#: src/generics/generic-data.md src/closures/exercise.md src/closures/solution.md +msgid "\"FYI\"" +msgstr "\"PI\"" + +#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md +#: src/generics/generic-data.md +msgid "\"Uhoh\"" +msgstr "\"Uhoh\"" + +#: src/generics.md +msgid "impl Trait" +msgstr "impl Trait" + +#: src/generics.md +msgid "dyn Trait" +msgstr "dyn Trait" + +#: src/generics.md +msgid "Exercise: Generic min" +msgstr "Exercice : min générique" + +#: src/generics/generic-functions.md +msgid "" +"Rust supports generics, which lets you abstract algorithms or data structures (such as " +"sorting or a binary tree) over the types used or stored." +msgstr "" +"Rust prend en charge les génériques, ce qui permet d'abstraire les algorithmes ou les " +"structures de données (comme le tri ou un arbre binaire) sur les types utilisés ou " +"stockés." + +#: src/generics/generic-functions.md +msgid "\"picked a number: {:?}\"" +msgstr "\"L'appelant a choisi un nombre : {:?}\"" + +#: src/generics/generic-functions.md +msgid "\"picked a string: {:?}\"" +msgstr "\"L'appelant a choisi une chaîne : {:?}\"" + +#: src/generics/generic-functions.md +msgid "'L'" +msgstr "'L'" + +#: src/generics/generic-functions.md +msgid "'R'" +msgstr "'R'" + +#: src/generics/generic-functions.md +msgid "" +"It can be helpful to show the monomorphized versions of `pick`, either before talking " +"about the generic `pick` in order to show how generics can reduce code duplication, or " +"after talking about generics to show how monomorphization works." +msgstr "" +"Il peut être utile de montrer les versions monomorphisées de `pick`, soit avant de parler " +"du `pick` générique afin de montrer comment les génériques peuvent réduire la duplication " +"de code, soit après avoir parlé des génériques pour montrer comment fonctionne la " +"monomorphisation." + +#: src/generics/generic-functions.md +msgid "Rust infers a type for T based on the types of the arguments and return value." +msgstr "" +"Rust déduit un type pour T en fonction des types des arguments et de la valeur de retour." + +#: src/generics/generic-functions.md +msgid "" +"In this example we only use the primitive types `i32` and `char` for `T`, but we can use " +"any type here, including user-defined types:" +msgstr "" +"Dans cet exemple, nous utilisons uniquement les types primitifs `i32` et `char` pour `T`, " +"mais nous pouvons utiliser n'importe quel type ici, y compris les types définis par " +"l'utilisateur :" + +#: src/generics/generic-functions.md +msgid "" +"This is similar to C++ templates, but Rust partially compiles the generic function " +"immediately, so that function must be valid for all types matching the constraints. For " +"example, try modifying `pick` to return `left + right` if `cond` is false. Even if only " +"the `pick` instantiation with integers is used, Rust still considers it invalid. C++ " +"would let you do this." +msgstr "" +"Ceci est similaire aux modèles C++, mais Rust compile partiellement la fonction générique " +"immédiatement, de sorte que cette fonction doit être valide pour tous les types " +"correspondant aux contraintes. Par exemple, essayez de modifier `pick` pour qu'elle " +"renvoie `left + right` si `cond` est faux. Même si seule l'instanciation de `pick` avec " +"des entiers est utilisée, Rust la considère toujours comme invalide. En C++, cela serait " +"possible." + +#: src/generics/generic-functions.md +msgid "" +"Generic code is turned into non-generic code based on the call sites. This is a zero-cost " +"abstraction: you get exactly the same result as if you had hand-coded the data structures " +"without the abstraction." +msgstr "" +"Le code générique est transformé en code non générique en fonction des points d'appel. " +"Cette abstraction est sans coût : le résultat est exactement le même que si vous aviez " +"codé manuellement les structures de données sans abstraction." + +#: src/generics/trait-bounds.md +msgid "" +"When working with generics, you often want to require the types to implement some trait, " +"so that you can call this trait's methods." +msgstr "" +"Lorsqu'on travaille avec des génériques, on souhaite souvent exiger que les types " +"implémentent un trait, afin de pouvoir appeler les méthodes de ce trait." + +#: src/generics/trait-bounds.md +msgid "You can do this with `T: Trait`:" +msgstr "Vous pouvez le faire avec `T: Trait` :" + +#: src/generics/trait-bounds.md +msgid "\"{pair:?}\"" +msgstr "\"{pair:?}\"" + +#: src/generics/trait-bounds.md +msgid "Try making a `NotCloneable` and passing it to `duplicate`." +msgstr "Essayez de créer un objet `NotCloneable` et de le passer à `duplicate`." + +#: src/generics/trait-bounds.md +msgid "When multiple traits are necessary, use `+` to join them." +msgstr "" +"Lorsque plusieurs caractéristiques sont nécessaires, utilisez `+` pour les combiner." + +#: src/generics/trait-bounds.md +msgid "Show a `where` clause, students will encounter it when reading code." +msgstr "" +"Montrez-leur une clause `where`, les étudiants la rencontreront lors de la lecture de " +"code." + +#: src/generics/trait-bounds.md +msgid "It declutters the function signature if you have many parameters." +msgstr "Cela simplifie la signature de la fonction si vous avez de nombreux paramètres." + +#: src/generics/trait-bounds.md +msgid "It has additional features making it more powerful." +msgstr "Il possède des fonctionnalités supplémentaires qui le rendent plus puissant." + +#: src/generics/trait-bounds.md +msgid "" +"If someone asks, the extra feature is that the type on the left of \":\" can be " +"arbitrary, like `Option`." +msgstr "" +"Si quelqu'un pose la question, la fonctionnalité supplémentaire est que le type à gauche " +"de \":\" peut être arbitraire, comme `Option`." + +#: src/generics/trait-bounds.md +msgid "" +"Note that Rust does not (yet) support specialization. For example, given the original " +"`duplicate`, it is invalid to add a specialized `duplicate(a: u32)`." +msgstr "" +"Notez que Rust ne prend pas (encore) en charge la spécialisation. Par exemple, étant " +"donné la fonction `duplicate` d'origine, il est invalide d'ajouter une fonction " +"spécialisée `duplicate(a: u32)`." + +#: src/generics/generic-data.md +msgid "" +"You can use generics to abstract over the concrete field type. Returning to the exercise " +"for the previous segment:" +msgstr "" +"Vous pouvez utiliser les génériques pour faire abstraction du type de champ concret. " +"Revenons à l'exercice du segment précédent :" + +#: src/generics/generic-data.md +msgid "" +"_Q:_ Why is `L` specified twice in `impl .. VerbosityFilter`? Isn't that " +"redundant?" +msgstr "" +"_Q:_ Pourquoi `L` est-il spécifié deux fois dans `impl .. " +"VerbosityFilter` ? N'est-ce pas redondant ?" + +#: src/generics/generic-data.md +msgid "" +"This is because it is a generic implementation section for generic type. They are " +"independently generic." +msgstr "" +"En effet, il s'agit d'une section d'implémentation générique pour un type générique. Ces " +"types sont génériques indépendamment les uns des autres." + +#: src/generics/generic-data.md +msgid "It means these methods are defined for any `L`." +msgstr "Cela signifie que ces méthodes sont définies pour tout `L`." + +#: src/generics/generic-data.md +msgid "It is possible to write `impl VerbosityFilter { .. }`." +msgstr "Il est possible d'écrire `impl VerbosityFilter { .. }`." + +#: src/generics/generic-data.md +msgid "" +"`VerbosityFilter` is still generic and you can use `VerbosityFilter`, but methods in " +"this block will only be available for `VerbosityFilter`." +msgstr "" +"`VerbosityFilter` reste générique et vous pouvez utiliser `VerbosityFilter`, mais " +"les méthodes de ce bloc ne seront disponibles que pour `VerbosityFilter`." + +#: src/generics/generic-data.md +msgid "" +"Note that we don't put a trait bound on the `VerbosityFilter` type itself. You can put " +"bounds there as well, but generally in Rust we only put the trait bounds on the impl " +"blocks." +msgstr "" +"Notez que nous n'appliquons pas de contrainte de trait au type `VerbosityFilter` lui-" +"même. Vous pouvez également y appliquer des contraintes, mais en Rust, on limite " +"généralement les contraintes de trait uniquement aux blocs d'implémentation." + +#: src/generics/generic-traits.md +msgid "" +"Traits can also be generic, just like types and functions. A trait's parameters get " +"concrete types when it is used. For example the [`From`](https://doc.rust-lang.org/std/" +"convert/trait.From.html) trait is used to define type conversions:" +msgstr "" +"Les traits peuvent également être génériques, tout comme les types et les fonctions. Les " +"paramètres d'un trait acquièrent des types concrets lorsqu'il est utilisé. Par exemple, " +"le trait `From` permet de définir des conversions de types." + +#: src/generics/generic-traits.md +msgid "\"Converted from integer: {from}\"" +msgstr "\"Converti depuis le type entier : {from}\"" + +#: src/generics/generic-traits.md +msgid "\"Converted from bool: {from}\"" +msgstr "\"Converti depuis le type bool : {from}\"" + +#: src/generics/generic-traits.md +msgid "" +"The `From` trait will be covered later in the course, but its [definition in the `std` " +"docs](https://doc.rust-lang.org/std/convert/trait.From.html) is simple, and copied here " +"for reference." +msgstr "" +"Le trait `From` sera abordé plus tard dans le cours, mais sa [définition dans la " +"documentation `std`](https://doc.rust-lang.org/std/convert/trait.From.html) est simple et " +"est copiée ici à titre de référence." + +#: src/generics/generic-traits.md +msgid "" +"Implementations of the trait do not need to cover all possible type parameters. Here, " +"`Foo::from(\"hello\")` would not compile because there is no `From<&str>` implementation " +"for `Foo`." +msgstr "" +"Les implémentations du trait n'ont pas besoin de couvrir tous les paramètres de type " +"possibles. Ici, `Foo::from(\"hello\")` ne compilerait pas car il n'existe aucune " +"implémentation de `From<&str>` pour `Foo`." + +#: src/generics/generic-traits.md +msgid "" +"Generic traits take types as \"input\", while associated types are a kind of \"output\" " +"type. A trait can have multiple implementations for different input types." +msgstr "" +"Les traits génériques prennent des types en entrée, tandis que les types associés sont " +"une sorte de type de sortie. Un trait peut avoir plusieurs implémentations pour " +"différents types d'entrée." + +#: src/generics/generic-traits.md +msgid "" +"In fact, Rust requires that at most one implementation of a trait match for any type T. " +"Unlike some other languages, Rust has no heuristic for choosing the \"most specific\" " +"match. There is work on adding this support, called [specialization](https://rust-lang." +"github.io/rfcs/1210-impl-specialization.html)." +msgstr "" +"En fait, Rust exige qu'au plus une implémentation d'un trait corresponde à tout type T. " +"Contrairement à d'autres langages, Rust ne dispose d'aucune heuristique pour choisir la " +"correspondance la plus « spécifique ». Des travaux sont en cours pour ajouter cette " +"fonctionnalité, appelée [specialization](https://rust-lang.github.io/rfcs/1210-impl-" +"specialization.html)." + +#: src/generics/impl-trait.md +msgid "" +"Similar to trait bounds, an `impl Trait` syntax can be used in function arguments and " +"return values:" +msgstr "" +"À l'instar des limites de traits, la syntaxe `impl Trait` peut être utilisée dans les " +"arguments et les valeurs de retour des fonctions :" + +#: src/generics/impl-trait.md +msgid "" +"// Syntactic sugar for:\n" +"// fn add_42_millions>(x: T) -> i32 {\n" +msgstr "" +"// Raccourci pour :\n" +"// fn add_42_millions>(x: T) -> i32 {\n" + +#: src/generics/impl-trait.md +msgid "" +"`impl Trait` allows you to work with types that you cannot name. The meaning of `impl " +"Trait` is a bit different in the different positions." +msgstr "" +"`impl Trait` vous permet de manipuler des types que vous ne pouvez pas nommer. Sa " +"signification varie légèrement selon son emplacement." + +#: src/generics/impl-trait.md +msgid "" +"For a parameter, `impl Trait` is like an anonymous generic parameter with a trait bound." +msgstr "" +"Pour un paramètre, `impl Trait` est comme un paramètre générique anonyme avec une " +"contrainte de trait." + +#: src/generics/impl-trait.md +msgid "" +"For a return type, it means that the return type is some concrete type that implements " +"the trait, without naming the type. This can be useful when you don't want to expose the " +"concrete type in a public API." +msgstr "" +"Pour un type de retour, cela signifie que le type de retour est un type concret qui " +"implémente le trait, sans que ce type soit nommé. Cela peut s'avérer utile lorsque vous " +"ne souhaitez pas exposer le type concret dans une API publique." + +#: src/generics/impl-trait.md +msgid "" +"Inference is hard in return position. A function returning `impl Foo` picks the concrete " +"type it returns, without writing it out in the source. A function returning a generic " +"type like `collect() -> B` can return any type satisfying `B`, and the caller may need " +"to choose one, such as with `let x: Vec<_> = foo.collect()` or with the turbofish, `foo." +"collect::>()`." +msgstr "" +"L'inférence est complexe en position de retour. Une fonction retournant `impl Foo` " +"choisit le type concret qu'elle retourne, sans l'écrire dans le code source. Une fonction " +"retournant un type générique comme `collect() -> B` peut retourner n'importe quel type " +"satisfaisant `B`, et l'appelant peut avoir besoin d'en choisir un, comme avec `let x: " +"Vec<_> = foo.collect()` ou avec turbofish, `foo.collect::>()`." + +#: src/generics/impl-trait.md +msgid "" +"What is the type of `debuggable`? Try `let debuggable: () = ..` to see what the error " +"message shows." +msgstr "" +"Quel est le type de `debuggable` ? Essayez `let debuggable: () = ..` pour voir le message " +"d'erreur." + +#: src/generics/dyn-trait.md +msgid "" +"In addition to using traits for static dispatch via generics, Rust also supports using " +"them for type-erased, dynamic dispatch via trait objects:" +msgstr "" +"En plus d'utiliser les traits pour la répartition statique via les génériques, Rust prend " +"également en charge leur utilisation pour la répartition dynamique sans effacement de " +"type via les objets de traits :" + +#: src/generics/dyn-trait.md src/smart-pointers/trait-objects.md +msgid "\"Miau!\"" +msgstr "\"Miaou !\"" + +#: src/generics/dyn-trait.md +msgid "// Uses generics and static dispatch.\n" +msgstr "// On utilise les générique et le dispatch statique.\n" + +#: src/generics/dyn-trait.md src/smart-pointers/trait-objects.md +msgid "\"Hello, who are you? {}\"" +msgstr "\"Bonjour, comment vas-tu ? {}\"" + +#: src/generics/dyn-trait.md +msgid "// Uses type-erasure and dynamic dispatch.\n" +msgstr "// Utilise l'effacement de type et la distribution dynamique.\n" + +#: src/generics/dyn-trait.md +msgid "" +"Generics, including `impl Trait`, use monomorphization to create a specialized instance " +"of the function for each different type that the generic is instantiated with. This means " +"that calling a trait method from within a generic function still uses static dispatch, as " +"the compiler has full type information and can resolve that type's trait implementation " +"to use." +msgstr "" +"Les génériques, y compris `impl Trait`, utilisent la monomorphisation pour créer une " +"instance spécialisée de la fonction pour chaque type différent avec lequel le générique " +"est instancié. Cela signifie que l'appel d'une méthode de trait depuis une fonction " +"générique bénéficie toujours de la résolution statique, car le compilateur dispose de " +"toutes les informations de type et peut résoudre l'implémentation du trait correspondant " +"à ce type." + +#: src/generics/dyn-trait.md +msgid "" +"When using `dyn Trait`, it instead uses dynamic dispatch through a [virtual method table]" +"(https://en.wikipedia.org/wiki/Virtual_method_table) (vtable). This means that there's a " +"single version of `fn dynamic` that is used regardless of what type of `Pet` is passed in." +msgstr "" +"Lorsqu'on utilise `dyn Trait`, la répartition dynamique s'effectue via une table de " +"méthodes virtuelles (vtable). Cela signifie qu'une seule version de `fn dynamic` est " +"utilisée, quel que soit le type de `Pet` passé en paramètre." + +#: src/generics/dyn-trait.md +msgid "" +"When using `dyn Trait`, the trait object needs to be behind some kind of indirection. In " +"this case it's a reference, though smart pointer types like `Box` can also be used (this " +"will be demonstrated on day 3)." +msgstr "" +"Lorsqu'on utilise `dyn Trait`, l'objet trait doit être placé derrière une forme " +"d'indirection. Dans ce cas, il s'agit d'une référence, bien que des types de pointeurs " +"intelligents comme `Box` puissent également être utilisés (cela sera démontré le " +"troisième jour)." + +#: src/generics/dyn-trait.md +msgid "" +"At runtime, a `&dyn Pet` is represented as a \"fat pointer\", i.e. a pair of two " +"pointers: One pointer points to the concrete object that implements `Pet`, and the other " +"points to the vtable for the trait implementation for that type. When calling the `talk` " +"method on `&dyn Pet` the compiler looks up the function pointer for `talk` in the vtable " +"and then invokes the function, passing the pointer to the `Dog` or `Cat` into that " +"function. The compiler doesn't need to know the concrete type of the `Pet` in order to do " +"this." +msgstr "" +"À l'exécution, un `&dyn Pet` est représenté par un « pointeur large », c'est-à-dire une " +"paire de pointeurs : l'un pointe vers l'objet concret implémentant `Pet`, et l'autre vers " +"la table virtuelle de l'implémentation du trait correspondant. Lors de l'appel de la " +"méthode `talk` sur un `&dyn Pet`, le compilateur recherche le pointeur de fonction " +"correspondant à `talk` dans la table virtuelle, puis invoque la fonction en lui passant " +"le pointeur vers l'objet `Dog` ou `Cat`. Le compilateur n'a pas besoin de connaître le " +"type concret de l'objet `Pet` pour ce faire." + +#: src/generics/dyn-trait.md +msgid "" +"A `dyn Trait` is considered to be \"type-erased\", because we no longer have compile-time " +"knowledge of what the concrete type is." +msgstr "" +"Un trait `dyn` est considéré comme « effacé au niveau du type », car nous n'avons plus " +"connaissance, au moment de la compilation, du type concret." + +#: src/generics/exercise.md +msgid "" +"In this short exercise, you will implement a generic `min` function that determines the " +"minimum of two values, using the [`Ord`](https://doc.rust-lang.org/stable/std/cmp/trait." +"Ord.html) trait." +msgstr "" +"Dans ce court exercice, vous implémenterez une fonction générique `min` qui détermine le " +"minimum de deux valeurs, en utilisant le trait [`Ord`](https://doc.rust-lang.org/stable/" +"std/cmp/trait.Ord.html)." + +#: src/generics/exercise.md +msgid "// TODO: implement the `min` function used in the tests.\n" +msgstr "// TODO: implémentez la fonction `min` utilisée dans les tests.\n" + +#: src/generics/exercise.md src/generics/solution.md +msgid "'z'" +msgstr "'z'" + +#: src/generics/exercise.md src/generics/solution.md +msgid "'7'" +msgstr "'7'" + +#: src/generics/exercise.md src/generics/solution.md +msgid "'1'" +msgstr "'1'" + +#: src/generics/exercise.md src/generics/solution.md src/std-traits/from-and-into.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "\"hello\"" +msgstr "\"bonjour\"" + +#: src/generics/exercise.md src/generics/solution.md +msgid "\"goodbye\"" +msgstr "\"au revoir\"" + +#: src/generics/exercise.md src/generics/solution.md +msgid "\"bat\"" +msgstr "\"chauve-souris\"" + +#: src/generics/exercise.md src/generics/solution.md +msgid "\"armadillo\"" +msgstr "\"tatou\"" + +#: src/generics/exercise.md +msgid "" +"Show students the [`Ord`](https://doc.rust-lang.org/stable/std/cmp/trait.Ord.html) trait " +"and [`Ordering`](https://doc.rust-lang.org/stable/std/cmp/enum.Ordering.html) enum." +msgstr "" +"Montrez aux apprenants le trait [`Ord`](https://doc.rust-lang.org/stable/std/cmp/trait.Ord." +"html) et l'énumération [`Ordering`](https://doc.rust-lang.org/stable/std/cmp/enum." +"Ordering.html)." + +#: src/closures.md src/concurrency/threads.md src/concurrency/shared-state.md +msgid "This segment should take about 30 minutes. It contains:" +msgstr "Ce segment devrait durer environ 30 minutes. Il contient :" + +#: src/closures/syntax.md +msgid "Closures are created with vertical bars: `|..| ..`." +msgstr "Les fermetures sont créées avec des barres verticales : `|..| ..`." + +#: src/closures/syntax.md +msgid "// Argument and return type can be inferred for lightweight syntax:\n" +msgstr "// L'argument et le type de retour peuvent être inférés pour une syntaxe légère :\n" + +#: src/closures/syntax.md +msgid "// Or we can specify types and bracket the body to be fully explicit:\n" +msgstr "" +"// Ou l'on peut spécifier les types et mettre le corps de la déclaration entre \n" +" // crochets pour être complètement explicites :\n" + +#: src/closures/syntax.md +msgid "" +"The arguments go between the `|..|`. The body can be surrounded by `{ .. }`, but if it is " +"a single expression these can be omitted." +msgstr "" +"Les arguments sont placés entre les chevrons `|..|`. Le corps de l'expression peut être " +"entouré d'accolades `{ .. }`, mais s'il s'agit d'une expression unique, celles-ci peuvent " +"être omises." + +#: src/closures/syntax.md +msgid "" +"Argument types are optional, and are inferred if not given. The return type is also " +"optional, but can only be written if using `{ .. }` around the body." +msgstr "" +"Les types d'arguments sont facultatifs et sont déduits s'ils ne sont pas spécifiés. Le " +"type de retour est également facultatif, mais ne peut être indiqué que si le corps de la " +"fonction est entouré des accolades `{ .. }`." + +#: src/closures/syntax.md +msgid "" +"The examples can both be written as mere nested functions instead -- they do not capture " +"any variables from their lexical environment. We will see captures next." +msgstr "" +"Ces deux exemples peuvent être écrits comme de simples fonctions imbriquées ; ils ne " +"capturent aucune variable de leur environnement lexical. Nous verrons les captures par la " +"suite." + +#: src/closures/syntax.md +msgid "" +"The ability to store functions in variables doesn't just apply to closures, regular " +"functions can be put in variables and then invoked the same way that closures can: " +"[Example in the playground](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=817cbeeefc49f3d0d180a3d6d54c8bda)." +msgstr "" +"La possibilité de stocker des fonctions dans des variables ne s'applique pas seulement " +"aux fermetures, les fonctions régulières peuvent être placées dans des variables puis " +"invoquées de la même manière que les fermetures : [Exemple dans le playground](https://" +"play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=817cbeeefc49f3d0d180a3d6d54c8bda)." + +#: src/closures/syntax.md +msgid "" +"The linked example also demonstrates that closures that don't capture anything can also " +"coerce to a regular function pointer." +msgstr "" +"L'exemple lié démontre également que les fermetures qui ne capturent rien peuvent " +"également être converties en un pointeur de fonction classique." + +#: src/closures/capturing.md +msgid "A closure can capture variables from the environment where it was defined." +msgstr "" +"Une fermeture peut capturer des variables de l'environnement dans lequel elle a été " +"définie." + +#: src/closures/capturing.md +msgid "" +"By default, a closure captures values by reference. Here `max_value` is captured by " +"`clamp`, but still available to `main` for printing. Try making `max_value` mutable, " +"changing it, and printing the clamped values again. Why doesn't this work?" +msgstr "" +"Par défaut, une fermeture capture les valeurs par référence. Ici, `max_value` est " +"capturée par `clamp`, mais reste accessible à `main` pour l'affichage. Essayez de rendre " +"`max_value` mutable, de la modifier, puis d'afficher à nouveau les valeurs capturées. " +"Pourquoi cela ne fonctionne-t-il pas ?" + +#: src/closures/capturing.md +msgid "" +"If a closure mutates values, it will capture them by mutable reference. Try adding " +"`max_value += 1` to `clamp`." +msgstr "" +"Si une fermeture modifie des valeurs, elle les capture par référence mutable. Essayez " +"d'ajouter `max_value += 1` à `clamp`." + +#: src/closures/capturing.md +msgid "" +"You can force a closure to move values instead of referencing them with the `move` " +"keyword. This can help with lifetimes, for example if the closure must outlive the " +"captured values (more on lifetimes later)." +msgstr "" +"Vous pouvez forcer une fermeture à déplacer des valeurs au lieu de les référencer avec le " +"mot-clé `move`. Cela peut s'avérer utile pour la gestion de la durée de vie, par exemple " +"si la fermeture doit survivre aux valeurs capturées (nous aborderons la question de la " +"durée de vie plus loin)." + +#: src/closures/capturing.md +msgid "" +"This looks like `move |v| ..`. Try adding this keyword and see if `main` can still access " +"`max_value` after defining `clamp`." +msgstr "" +"Cela ressemble à `move |v| ..`. Essayez d'ajouter ce mot-clé et voyez si `main` peut " +"toujours accéder à `max_value` après avoir défini `clamp`." + +#: src/closures/capturing.md +msgid "" +"By default, closures will capture each variable from an outer scope by the least " +"demanding form of access they can (by shared reference if possible, then exclusive " +"reference, then by move). The `move` keyword forces capture by value." +msgstr "" +"Par défaut, les fermetures capturent chaque variable de la portée extérieure par le moyen " +"d'accès le moins contraignant possible (par référence partagée si possible, puis par " +"référence exclusive, et enfin par déplacement). Le mot-clé `move` force la capture par " +"valeur." + +#: src/closures/traits.md +msgid "Closure traits" +msgstr "Traits des fermetures" + +#: src/closures/traits.md +msgid "" +"Closures or lambda expressions have types that cannot be named. However, they implement " +"special [`Fn`](https://doc.rust-lang.org/std/ops/trait.Fn.html), [`FnMut`](https://doc." +"rust-lang.org/std/ops/trait.FnMut.html), and [`FnOnce`](https://doc.rust-lang.org/std/ops/" +"trait.FnOnce.html) traits:" +msgstr "" +"Les fermetures ou expressions lambda ont des types qui ne peuvent pas être nommés. " +"Cependant, elles implémentent des traits spéciaux [`Fn`](https://doc.rust-lang.org/std/" +"ops/trait.Fn.html), [`FnMut`](https://doc.rust-lang.org/std/ops/trait.FnMut.html) et " +"[`FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html) :" + +#: src/closures/traits.md +msgid "" +"The special types `fn(..) -> T` refer to function pointers - either the address of a " +"function, or a closure that captures nothing." +msgstr "" +"Les types spéciaux `fn(..) -> T` font référence à des pointeurs de fonction - soit " +"l'adresse d'une fonction, soit une fermeture qui ne capture rien." + +#: src/closures/traits.md +msgid "\"Calling {func_name}({input}): {}\"" +msgstr "\"On appelle {func_name}({input}): {}\"" + +#: src/closures/traits.md +msgid "\"-itis\"" +msgstr "\"-itis\"" + +#: src/closures/traits.md +msgid "\"{x}{suffix}\"" +msgstr "\"{x}{suffix}\"" + +#: src/closures/traits.md +msgid "\"add_suffix\"" +msgstr "\"add_suffix\"" + +#: src/closures/traits.md +msgid "\"senior\"" +msgstr "\"senior\"" + +#: src/closures/traits.md +msgid "\"appendix\"" +msgstr "\"appendix\"" + +#: src/closures/traits.md +msgid "\"/\"" +msgstr "\"/\"" + +#: src/closures/traits.md +msgid "\"accumulate\"" +msgstr "\"accumulate\"" + +#: src/closures/traits.md +msgid "\"red\"" +msgstr "\"red\"" + +#: src/closures/traits.md +msgid "\"green\"" +msgstr "\"green\"" + +#: src/closures/traits.md +msgid "\"blue\"" +msgstr "\"blue\"" + +#: src/closures/traits.md +msgid "\"take_and_reverse\"" +msgstr "\"take_and_reverse\"" + +#: src/closures/traits.md +msgid "\"reversed: \"" +msgstr "\"reversed: \"" + +#: src/closures/traits.md +msgid "" +"An `Fn` (e.g. `add_suffix`) neither consumes nor mutates captured values. It can be " +"called needing only a shared reference to the closure, which means the closure can be " +"executed repeatedly and even concurrently." +msgstr "" +"Une fonction (par exemple, `add_suffix`) ne consomme ni ne modifie les valeurs capturées. " +"Elle peut être appelée en ne nécessitant qu'une référence partagée à la fermeture, ce qui " +"signifie que cette dernière peut être exécutée de manière répétée, voire concurrente." + +#: src/closures/traits.md +msgid "" +"An `FnMut` (e.g. `accumulate`) might mutate captured values. The closure object is " +"accessed via exclusive reference, so it can be called repeatedly but not concurrently." +msgstr "" +"Une fonction `FnMut` (par exemple, `accumulate`) peut modifier les valeurs capturées. " +"L'objet de fermeture est accessible par référence exclusive ; il peut donc être appelé " +"plusieurs fois, mais pas simultanément." + +#: src/closures/traits.md +msgid "" +"If you have an `FnOnce` (e.g. `take_and_reverse`), you may only call it once. Doing so " +"consumes the closure and any values captured by move." +msgstr "" +"Si vous avez une fonction `FnOnce` (par exemple `take_and_reverse`), vous ne pouvez " +"l'appeler qu'une seule fois. Ce faisant, la fermeture et toutes les valeurs capturées par " +"`move` sont consommées." + +#: src/closures/traits.md +msgid "" +"`FnMut` is a subtype of `FnOnce`. `Fn` is a subtype of `FnMut` and `FnOnce`. I.e. you can " +"use an `FnMut` wherever an `FnOnce` is called for, and you can use an `Fn` wherever an " +"`FnMut` or `FnOnce` is called for." +msgstr "" +"`FnMut` est un sous-type de `FnOnce`. `Fn` est un sous-type de `FnMut` et de `FnOnce`. " +"Autrement dit, vous pouvez utiliser `FnMut` là où `FnOnce` est requis, et vous pouvez " +"utiliser `Fn` là où `FnMut` ou `FnOnce` est requis." + +#: src/closures/traits.md +msgid "" +"When you define a function that takes a closure, you should take `FnOnce` if you can (i." +"e. you call it once), or `FnMut` else, and last `Fn`. This allows the most flexibility " +"for the caller." +msgstr "" +"Lorsque vous définissez une fonction qui prend une fermeture en paramètre, vous devriez " +"utiliser `FnOnce` si possible (c'est-à-dire que vous l'appelez une seule fois), ou " +"`FnMut` sinon, et enfin `Fn`. Cela offre une flexibilité maximale à l'appelant." + +#: src/closures/traits.md +msgid "" +"In contrast, when you have a closure, the most flexible you can have is `Fn` (which can " +"be passed to a consumer of any of the three closure traits), then `FnMut`, and lastly " +"`FnOnce`." +msgstr "" +"En revanche, lorsque vous avez une fermeture, la plus flexible que vous pouvez avoir est " +"`Fn` (qui peut être passée à un consommateur de n'importe lequel des trois traits de " +"fermeture), puis `FnMut`, et enfin `FnOnce`." + +#: src/closures/traits.md +msgid "" +"The compiler also infers `Copy` (e.g. for `add_suffix`) and `Clone` (e.g. " +"`take_and_reverse`), depending on what the closure captures. Function pointers " +"(references to `fn` items) implement `Copy` and `Fn`." +msgstr "" +"Le compilateur infère également les classes `Copy` (par exemple, pour `add_suffix`) et " +"`Clone` (par exemple, pour `take_and_reverse`), selon ce que la fermeture capture. Les " +"pointeurs de fonction (références aux éléments `fn`) implémentent les classes `Copy` et " +"`Fn`." + +#: src/closures/exercise.md +msgid "" +"Building on the generic logger from this morning, implement a `Filter` that uses a " +"closure to filter log messages, sending those that pass the filtering predicate to an " +"inner logger." +msgstr "" +"En vous appuyant sur le système de journalisation générique de ce matin, implémentez un " +"`Filter` qui utilise une fermeture pour filtrer les messages de journalisation, en " +"envoyant ceux qui réussissent le prédicat de filtrage à un système de journalisation " +"interne." + +#: src/closures/exercise.md +msgid "// TODO: Define and implement `Filter`.\n" +msgstr "// TODO: Définissez et implémentez `Filter`.\n" + +#: src/closures/exercise.md src/closures/solution.md +msgid "\"yikes\"" +msgstr "\"oups\"" + +#: src/closures/exercise.md src/closures/solution.md +msgid "\"yikes, something went wrong\"" +msgstr "\"oups, quelque chose s'est mal passé\"" + +#: src/closures/exercise.md src/closures/solution.md +msgid "\"uhoh\"" +msgstr "\"uhoh\"" + +#: src/closures/solution.md +msgid "/// Only log messages matching a filtering predicate.\n" +msgstr "/// Ne logguez que les messages correspondant à un prédicat de filtrage.\n" + +#: src/closures/solution.md +msgid "" +"**Storing Closures:** To store a closure in a struct, we use a generic type parameter " +"(here `P`). This is because every closure in Rust has a unique, anonymous type generated " +"by the compiler." +msgstr "" +"**Stockage des fermetures :** Pour stocker une fermeture dans une structure, nous " +"utilisons un paramètre de type générique (ici `P`). En effet, chaque fermeture en Rust " +"possède un type unique et anonyme généré par le compilateur." + +#: src/closures/solution.md +msgid "" +"**`Fn` Trait Bound:** The bound `P: Fn(u8, &str) -> bool` tells the compiler that `P` can " +"be called as a function with the specified arguments and return type. We use `Fn` " +"(instead of `FnMut` or `FnOnce`) because `log` takes `&self`, so we can only access the " +"predicate immutably." +msgstr "" +"**Liaison du trait `Fn` :** La liaison `P: Fn(u8, &str) -> bool` indique au compilateur " +"que `P` peut être appelée comme une fonction avec les arguments et le type de retour " +"spécifiés. Nous utilisons `Fn` (au lieu de `FnMut` ou `FnOnce`) car `log` prend `&self`, " +"ce qui nous permet d'accéder au prédicat de manière immuable." + +#: src/closures/solution.md +msgid "" +"**Calling fields:** We invoke the closure using `(self.predicate)(...)`. The parentheses " +"around `self.predicate` are necessary to disambiguate between calling a method named " +"`predicate` and calling the field itself." +msgstr "" +"**Appel des champs :** Nous invoquons la fermeture à l’aide de `(self.predicate)(...)`. " +"Les parenthèses autour de `self.predicate` sont nécessaires pour lever toute ambiguïté " +"entre l’appel d’une méthode nommée `predicate` et l’appel du champ lui-même." + +#: src/closures/solution.md +msgid "" +"Discuss why `Fn` is required. If we used `FnMut`, `log` would need to take `&mut self`, " +"which conflicts with the `Logger` trait signature. If we used `FnOnce`, we could only log " +"a single message!" +msgstr "" +"Expliquez pourquoi `Fn` est nécessaire. Si nous utilisions `FnMut`, `log` devrait prendre " +"`&mut self`, ce qui est incompatible avec la signature du trait `Logger`. Si nous " +"utilisions `FnOnce`, nous ne pourrions consigner qu'un seul message !" + +#: src/closures/solution.md +msgid "" +"The `impl` block for `new` also includes the bounds. While technically not strictly " +"required for the struct definition itself (bounds can be placed only on `impl` blocks " +"that use them), putting them on `new` helps type inference." +msgstr "" +"Le bloc `impl` de `new` inclut également les limites. Bien que cela ne soit pas " +"strictement nécessaire pour la définition de la structure elle-même (les limites ne " +"peuvent être placées que sur les blocs `impl` qui les utilisent), les inclure dans `new` " +"facilite l'inférence de type." + +#: src/std-types.md src/std-types/option.md +msgid "Option" +msgstr "Option" + +#: src/std-types.md src/std-types/result.md src/error-handling.md +msgid "Result" +msgstr "Result" + +#: src/std-types.md src/std-types/string.md +msgid "String" +msgstr "String" + +#: src/std-types.md +msgid "Vec" +msgstr "Vec" + +#: src/std-types.md +msgid "HashMap" +msgstr "HashMap" + +#: src/std-types.md +msgid "" +"For each of the slides in this section, spend some time reviewing the documentation " +"pages, highlighting some of the more common methods." +msgstr "" +"Pour chacune des diapositives de cette section, prenez le temps de consulter les pages de " +"documentation, en mettant en évidence certaines des méthodes les plus courantes." + +#: src/std-types/std.md +msgid "" +"Rust comes with a standard library that helps establish a set of common types used by " +"Rust libraries and programs. This way, two libraries can work together smoothly because " +"they both use the same `String` type." +msgstr "" +"Rust est fourni avec une bibliothèque standard qui définit un ensemble de types communs " +"utilisés par les bibliothèques et les programmes Rust. Ainsi, deux bibliothèques peuvent " +"fonctionner ensemble sans problème car elles utilisent toutes deux le même type `String`." + +#: src/std-types/std.md +msgid "" +"In fact, Rust contains several layers of the Standard Library: `core`, `alloc` and `std`." +msgstr "" +"En fait, Rust contient plusieurs couches de la bibliothèque standard : `core`, `alloc` et " +"`std`." + +#: src/std-types/std.md +msgid "" +"`core` includes the most basic types and functions that don't depend on `libc`, allocator " +"or even the presence of an operating system." +msgstr "" +"`core` comprend les types et fonctions les plus basiques qui ne dépendent pas de `libc`, " +"de l'allocateur ou même de la présence d'un système d'exploitation." + +#: src/std-types/std.md +msgid "" +"`alloc` includes types that require a global heap allocator, such as `Vec`, `Box` and " +"`Arc`." +msgstr "" +"`alloc` inclut des types qui nécessitent un allocateur de tas global, tels que `Vec`, " +"`Box` et `Arc`." + +#: src/std-types/std.md +msgid "Embedded Rust applications typically only use `core`, and sometimes `alloc`." +msgstr "" +"Les applications Rust embarquées utilisent généralement uniquement `core`, et parfois " +"`alloc`." + +#: src/std-types/docs.md +msgid "Rust comes with extensive documentation. For example:" +msgstr "Rust est fourni avec une documentation exhaustive. Par exemple :" + +#: src/std-types/docs.md +msgid "" +"All of the details about [loops](https://doc.rust-lang.org/stable/reference/expressions/" +"loop-expr.html)." +msgstr "" +"Tous les détails concernant les [boucles](https://doc.rust-lang.org/stable/reference/" +"expressions/loop-expr.html)." + +#: src/std-types/docs.md +msgid "Primitive types like [`u8`](https://doc.rust-lang.org/stable/std/primitive.u8.html)." +msgstr "" +"Les types primitifs comme [`u8`](https://doc.rust-lang.org/stable/std/primitive.u8.html)." + +#: src/std-types/docs.md +msgid "" +"Standard library types like [`Option`](https://doc.rust-lang.org/stable/std/option/enum." +"Option.html) or [`BinaryHeap`](https://doc.rust-lang.org/stable/std/collections/struct." +"BinaryHeap.html)." +msgstr "" +"Les types de bibliothèque standard comme [`Option`](https://doc.rust-lang.org/stable/std/" +"option/enum.Option.html) ou [`BinaryHeap`](https://doc.rust-lang.org/stable/std/" +"collections/struct.BinaryHeap.html)." + +#: src/std-types/docs.md +msgid "Use `rustup doc --std` or to view the documentation." +msgstr "Utilisez `rustup doc --std` ou pour consulter la documentation." + +#: src/std-types/docs.md +msgid "In fact, you can document your own code:" +msgstr "En fait, vous pouvez documenter votre propre code :" + +#: src/std-types/docs.md +msgid "" +"/// Determine whether the first argument is divisible by the second argument.\n" +"///\n" +"/// If the second argument is zero, the result is false.\n" +msgstr "" +"/// Déterminez si les premier argument est divisible par le second.\n" +"///\n" +"/// Si le second argument est égal à zéro, le résultat est false.\n" + +#: src/std-types/docs.md +msgid "" +"The contents are treated as Markdown. All published Rust library crates are automatically " +"documented at [`docs.rs`](https://docs.rs) using the [rustdoc](https://doc.rust-lang.org/" +"rustdoc/what-is-rustdoc.html) tool. It is idiomatic to document all public items in an " +"API using this pattern." +msgstr "" +"Le contenu est traité comme du Markdown. Toutes les crates de bibliothèque Rust publiées " +"sont automatiquement documentées sur [`docs.rs`](https://docs.rs) à l'aide de l'outil " +"[rustdoc](https://doc.rust-lang.org/rustdoc/what-is-rustdoc.html). Il est d'usage de " +"documenter tous les éléments publics d'une API selon ce modèle." + +#: src/std-types/docs.md +msgid "" +"To document an item from inside the item (such as inside a module), use `//!` or `/*! .. " +"*/`, called \"inner doc comments\":" +msgstr "" +"Pour documenter un élément depuis l'intérieur de cet élément (par exemple, à l'intérieur " +"d'un module), utilisez `//!` ou `/*! .. */`, appelés « commentaires de documentation " +"internes » :" + +#: src/std-types/docs.md +msgid "//! This module contains functionality relating to divisibility of integers.\n" +msgstr "//! Ce module contient une fonctionalité en relation avec la divisibilité des entiers.\n" + +#: src/std-types/docs.md +msgid "Show students the generated docs for the `rand` crate at ." +msgstr "" +"Montrez aux étudiants la documentation générée pour la bibliothèque `rand` à l'adresse " +"." + +#: src/std-types/option.md +msgid "" +"We have already seen some use of `Option`. It stores either a value of type `T` or " +"nothing. For example, [`String::find`](https://doc.rust-lang.org/stable/std/string/struct." +"String.html#method.find) returns an `Option`." +msgstr "" +"Nous avons déjà vu l'utilisation de `Option`. Cette classe stocke soit une valeur de " +"type `T`, soit rien. Par exemple, `String::find` renvoie un `Option`." + +#: src/std-types/option.md +msgid "\"Löwe 老虎 Léopard Gepardi\"" +msgstr "\"Löwe 老虎 Léopard Gepardi\"" + +#: src/std-types/option.md +msgid "'é'" +msgstr "'é'" + +#: src/std-types/option.md +msgid "'Z'" +msgstr "'Z'" + +#: src/std-types/option.md +msgid "\"Character not found\"" +msgstr "\"Caractère non trouvé\"" + +#: src/std-types/option.md +msgid "`Option` is widely used, not just in the standard library." +msgstr "`Option` est largement utilisé, et pas seulement dans la bibliothèque standard." + +#: src/std-types/option.md +msgid "" +"`unwrap` will return the value in an `Option`, or panic. `expect` is similar but takes an " +"error message." +msgstr "" +"La fonction `unwrap` renvoie la valeur dans un objet `Option`, ou provoque une erreur. " +"`expect` est similaire, mais prend un message d'erreur." + +#: src/std-types/option.md +msgid "You can panic on None, but you can't \"accidentally\" forget to check for None." +msgstr "" +"Vous pouvez paniquer s'il n'y a pas de résultat, mais vous ne pouvez pas « " +"accidentellement » oublier de vérifier s'il n'y a pas de résultat." + +#: src/std-types/option.md +msgid "" +"It's common to `unwrap`/`expect` all over the place when hacking something together, but " +"production code typically handles `None` in a nicer fashion." +msgstr "" +"Il est courant d'utiliser `unwrap`/`expect` un peu partout lorsqu'on improvise, mais le " +"code de production gère généralement `None` de manière plus élégante." + +#: src/std-types/option.md +msgid "" +"The \"niche optimization\" means that `Option` typically has the same size in memory " +"as `T`, if there is some representation that is not a valid value of T. For example, a " +"reference cannot be NULL, so `Option<&T>` automatically uses NULL to represent the `None` " +"variant, and thus can be stored in the same memory as `&T`." +msgstr "" +"L'« optimisation de niche » signifie que `Option` a généralement la même taille en " +"mémoire que `T`, s'il existe une représentation qui n'est pas une valeur valide de T. Par " +"exemple, une référence ne peut pas être NULL, donc `Option<&T>` utilise automatiquement " +"NULL pour représenter la variante `None`, et peut donc être stockée dans la même mémoire " +"que `&T`." + +#: src/std-types/result.md +msgid "" +"`Result` is similar to `Option`, but indicates the success or failure of an operation, " +"each with a different enum variant. It is generic: `Result` where `T` is used in " +"the `Ok` variant and `E` appears in the `Err` variant." +msgstr "" +"`Result` est similaire à `Option`, mais indique le succès ou l'échec d'une opération, " +"chaque cas étant représenté par une variante d'énumération différente. Il est générique : " +"`Result`, où `T` est utilisé dans la variante `Ok` et `E` dans la variante `Err`." + +#: src/std-types/result.md src/error-handling/result.md +msgid "\"diary.txt\"" +msgstr "\"diary.txt\"" + +#: src/std-types/result.md src/error-handling/result.md +msgid "\"Dear diary: {contents} ({bytes} bytes)\"" +msgstr "\"Cher journal : {contents} ({bytes} octets)\"" + +#: src/std-types/result.md src/error-handling/result.md +msgid "\"Could not read file content\"" +msgstr "\"Le contenu du fichier n'a pas pu être lu\"" + +#: src/std-types/result.md src/error-handling/result.md +msgid "\"The diary could not be opened: {err}\"" +msgstr "\"Le journale n'a pas pu être ouvert : {err}\"" + +#: src/std-types/result.md +msgid "" +"As with `Option`, the successful value sits inside of `Result`, forcing the developer to " +"explicitly extract it. This encourages error checking. In the case where an error should " +"never happen, `unwrap()` or `expect()` can be called, and this is a signal of the " +"developer intent too." +msgstr "" +"Comme pour `Option`, la valeur de succès est stockée dans `Result`, obligeant le " +"développeur à l'extraire explicitement. Cela encourage la gestion des erreurs. Dans le " +"cas où une erreur ne devrait jamais se produire, `unwrap()` ou `expect()` peuvent être " +"appelés, ce qui témoigne également de l'intention du développeur." + +#: src/std-types/result.md +msgid "" +"`Result` documentation is a recommended read. Not during the course, but it is worth " +"mentioning. It contains many convenience methods and functions that help functional-style " +"programming." +msgstr "" +"La documentation de `Result` est une lecture recommandée. Elle ne sera pas abordée " +"pendant le cours, mais mérite d'être mentionnée. Elle contient de nombreuses méthodes et " +"fonctions pratiques qui facilitent la programmation fonctionnelle." + +#: src/std-types/result.md +msgid "`Result` is the standard type to implement error handling as we will see on Day 4." +msgstr "" +"`Result` est le type standard pour implémenter la gestion des erreurs, comme nous le " +"verrons le jour 4." + +#: src/std-types/string.md +msgid "" +"[`String`](https://doc.rust-lang.org/std/string/struct.String.html) is a growable UTF-8 " +"encoded string:" +msgstr "" +"[`String`](https://doc.rust-lang.org/std/string/struct.String.html) est une chaîne de " +"caractères extensible encodée en UTF-8 :" + +#: src/std-types/string.md src/std-traits/comparisons.md src/std-traits/read-and-write.md +#: src/memory-management/review.md src/testing/unit-tests.md +#: src/concurrency/threads/scoped.md +msgid "\"Hello\"" +msgstr "\"Hello\"" + +#: src/std-types/string.md +msgid "\"s1: len = {}, capacity = {}\"" +msgstr "\"s1: longueur = {}, capacité = {}\"" + +#: src/std-types/string.md +msgid "'!'" +msgstr "'!'" + +#: src/std-types/string.md +msgid "\"s2: len = {}, capacity = {}\"" +msgstr "\"s2: longueur = {}, capacité = {}\"" + +#: src/std-types/string.md +msgid "\"🇨🇭\"" +msgstr "\"🇨🇭\"" + +#: src/std-types/string.md +msgid "\"s3: len = {}, number of chars = {}\"" +msgstr "\"s3: longueur = {}, nombre de chars = {}\"" + +#: src/std-types/string.md +msgid "" +"`String` implements [`Deref`](https://doc.rust-lang.org/std/string/struct." +"String.html#deref-methods-str), which means that you can call all `str` methods on a " +"`String`." +msgstr "" +"`String` implémente [`Deref`](https://doc.rust-lang.org/std/string/struct." +"String.html#deref-methods-str), ce qui signifie que vous pouvez appeler toutes les " +"méthodes `str` sur une `String`." + +#: src/std-types/string.md +msgid "" +"`String::new` returns a new empty string, use `String::with_capacity` when you know how " +"much data you want to push to the string." +msgstr "" +"`String::new` renvoie une nouvelle chaîne vide ; utilisez `String::with_capacity` lorsque " +"vous savez quelle quantité de données vous souhaitez ajouter à la chaîne." + +#: src/std-types/string.md +msgid "" +"`String::len` returns the size of the `String` in bytes (which can be different from its " +"length in characters)." +msgstr "" +"`String::len` renvoie la taille de la `String` en octets (qui peut être différente de sa " +"longueur en caractères)." + +#: src/std-types/string.md +msgid "" +"`String::chars` returns an iterator over the actual characters. Note that a `char` can be " +"different from what a human will consider a \"character\" due to [grapheme clusters]" +"(https://docs.rs/unicode-segmentation/latest/unicode_segmentation/struct.Graphemes.html)." +msgstr "" +"La méthode `String::chars` renvoie un itérateur sur les caractères eux-mêmes. Notez qu'un " +"`char` peut différer de ce qu'un humain considère comme un « caractère » en raison des " +"[groupes de graphèmes](https://docs.rs/unicode-segmentation/latest/unicode_segmentation/" +"struct.Graphemes.html)." + +#: src/std-types/string.md +msgid "When people refer to strings they could either be talking about `&str` or `String`." +msgstr "" +"Lorsque les gens font référence à des chaînes de caractères, ils peuvent parler soit de " +"`&str`, soit de `String`." + +#: src/std-types/string.md +msgid "" +"When a type implements `Deref`, the compiler will let you transparently call " +"methods from `T`." +msgstr "" +"Lorsqu'un type implémente `Deref`, le compilateur vous permettra d'appeler de " +"manière transparente des méthodes de `T`." + +#: src/std-types/string.md +msgid "" +"We haven't discussed the `Deref` trait yet, so at this point this mostly explains the " +"structure of the sidebar in the documentation." +msgstr "" +"Nous n'avons pas encore abordé le trait `Deref`, donc pour l'instant, cela explique " +"principalement la structure de la barre latérale dans la documentation." + +#: src/std-types/string.md +msgid "" +"`String` implements `Deref` which transparently gives it access to `str`'s " +"methods." +msgstr "" +"`String` implémente `Deref`, ce qui lui donne de manière transparente " +"l'accès aux méthodes de `str`." + +#: src/std-types/string.md +msgid "Write and compare `let s3 = s1.deref();` and `let s3 = &*s1;`." +msgstr "Écrivez et comparez `let s3 = s1.deref();` et `let s3 = &*s1;`." + +#: src/std-types/string.md +msgid "" +"`String` is implemented as a wrapper around a vector of bytes, many of the operations you " +"see supported on vectors are also supported on `String`, but with some extra guarantees." +msgstr "" +"`String` est implémenté comme un wrapper autour d'un vecteur d'octets ; la plupart des " +"opérations que vous voyez prises en charge sur les vecteurs le sont également sur " +"`String`, mais avec quelques garanties supplémentaires." + +#: src/std-types/string.md +msgid "Compare the different ways to index a `String`:" +msgstr "Comparez les différentes manières d'indexer une `String` :" + +#: src/std-types/string.md +msgid "" +"To a character by using `s3.chars().nth(i).unwrap()` where `i` is in-bound, out-of-bounds." +msgstr "" +"À un caractère en utilisant `s3.chars().nth(i).unwrap()` où `i` est à l'intérieur, hors " +"des limites." + +#: src/std-types/string.md +msgid "" +"To a substring by using `s3[0..4]`, where that slice is on character boundaries or not." +msgstr "" +"Pour une sous-chaîne en utilisant `s3[0..4]`, où cette tranche se trouve sur des limites " +"de caractères ou non." + +#: src/std-types/string.md +msgid "" +"Many types can be converted to a string with the [`to_string`](https://doc.rust-lang.org/" +"std/string/trait.ToString.html#tymethod.to_string) method. This trait is automatically " +"implemented for all types that implement `Display`, so anything that can be formatted can " +"also be converted to a string." +msgstr "" +"De nombreux types peuvent être convertis en chaîne de caractères grâce à la méthode " +"`to_string` (https://doc.rust-lang.org/std/string/trait.ToString.html#tymethod." +"to_string). Ce trait est automatiquement implémenté pour tous les types implémentant " +"`Display`, ce qui permet de convertir en chaîne tout type formatable." + +#: src/std-types/vec.md +msgid "" +"[`Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html) is the standard resizable heap-" +"allocated buffer:" +msgstr "" +"[`Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html) est le tampon standard " +"redimensionnable alloué sur le tas :" + +#: src/std-types/vec.md +msgid "\"v1: len = {}, capacity = {}\"" +msgstr "\"v1: len = {}, capacity = {}\"" + +#: src/std-types/vec.md +msgid "\"v2: len = {}, capacity = {}\"" +msgstr "\"v2: len = {}, capacity = {}\"" + +#: src/std-types/vec.md +msgid "// Canonical macro to initialize a vector with elements.\n" +msgstr "// Macro canonique pour initialiser un vector avec des éléments.\n" + +#: src/std-types/vec.md +msgid "// Retain only the even elements.\n" +msgstr "// Ne retenir que les éléments pairs.\n" + +#: src/std-types/vec.md +msgid "\"{v3:?}\"" +msgstr "\"{v3:?}\"" + +#: src/std-types/vec.md +msgid "// Remove consecutive duplicates.\n" +msgstr "// Enlever les duplicats consécutifs.\n" + +#: src/std-types/vec.md +msgid "" +"`Vec` implements [`Deref`](https://doc.rust-lang.org/std/vec/struct.Vec." +"html#deref-methods-%5BT%5D), which means that you can call slice methods on a `Vec`." +msgstr "" +"`Vec` implémente [`Deref`](https://doc.rust-lang.org/std/vec/struct.Vec." +"html#deref-methods-%5BT%5D), ce qui signifie que vous pouvez appeler des méthodes de " +"tranche sur un `Vec`." + +#: src/std-types/vec.md +msgid "" +"`Vec` is a type of collection, along with `String` and `HashMap`. The data it contains is " +"stored on the heap. This means the amount of data doesn't need to be known at compile " +"time. It can grow or shrink at runtime." +msgstr "" +"`Vec` est un type de collection, au même titre que `String` et `HashMap`. Les données " +"qu'il contient sont stockées dans le tas. Cela signifie que la quantité de données n'a " +"pas besoin d'être connue à la compilation ; elle peut augmenter ou diminuer à l'exécution." + +#: src/std-types/vec.md +msgid "" +"Notice how `Vec` is a generic type too, but you don't have to specify `T` explicitly. " +"As always with Rust type inference, the `T` was established during the first `push` call." +msgstr "" +"Notez que `Vec` est également un type générique, mais vous n'avez pas besoin de " +"spécifier `T` explicitement. Comme toujours avec l'inférence de types en Rust, `T` a été " +"établi lors du premier appel à `push`." + +#: src/std-types/vec.md +msgid "" +"`vec![...]` is a canonical macro to use instead of `Vec::new()` and it supports adding " +"initial elements to the vector." +msgstr "" +"`vec![...]` est une macro canonique à utiliser à la place de `Vec::new()` et elle permet " +"d'ajouter des éléments initiaux au vecteur." + +#: src/std-types/vec.md +msgid "" +"To index the vector you use `[` `]`, but they will panic if out of bounds. Alternatively, " +"using `get` will return an `Option`. The `pop` function will remove the last element." +msgstr "" +"Pour indexer le vecteur, utilisez `[]`, mais une erreur se produira en cas d'accès hors " +"limites. Vous pouvez également utiliser `get`, qui renverra un `Option`. La fonction " +"`pop` supprimera le dernier élément." + +#: src/std-types/hashmap.md +msgid "Standard hash map with protection against HashDoS attacks:" +msgstr "Table de hachage standard avec protection contre les attaques HashDoS :" + +#: src/std-types/hashmap.md +msgid "\"Adventures of Huckleberry Finn\"" +msgstr "\"Les aventures d'Huckleberry Finn\"" + +#: src/std-types/hashmap.md +msgid "\"Grimms' Fairy Tales\"" +msgstr "\"Les contes de Grimm\"" + +#: src/std-types/hashmap.md +msgid "\"Pride and Prejudice\"" +msgstr "\"Orgueil et Préjugés\"" + +#: src/std-types/hashmap.md +msgid "\"Les Misérables\"" +msgstr "\"Les Misérables\"" + +#: src/std-types/hashmap.md +msgid "\"We know about {} books, but not Les Misérables.\"" +msgstr "\"Nous connaissons {} livres mais pas Les Misérables.\"" + +#: src/std-types/hashmap.md +msgid "\"Alice's Adventure in Wonderland\"" +msgstr "\"Alice au pays des Merveilles\"" + +#: src/std-types/hashmap.md +msgid "\"{book}: {count} pages\"" +msgstr "\"{book}: {count} pages\"" + +#: src/std-types/hashmap.md +msgid "\"{book} is unknown.\"" +msgstr "\"{book} est inconnu.\"" + +#: src/std-types/hashmap.md +msgid "// Use the .entry() method to insert a value if nothing is found.\n" +msgstr "// Utilisez la méthode .entry() pour insérer une valeur si rien n'est trouvé.\n" + +#: src/std-types/hashmap.md +msgid "`HashMap` is not defined in the prelude and needs to be brought into scope." +msgstr "`HashMap` n'est pas défini dans le prélude et doit être inclus dans la portée." + +#: src/std-types/hashmap.md +msgid "" +"Try the following lines of code. The first line will see if a book is in the hashmap and " +"if not return an alternative value. The second line will insert the alternative value in " +"the hashmap if the book is not found." +msgstr "" +"Essayez les lignes de code suivantes. La première vérifie si un livre est présent dans la " +"table de hachage et, si ce n'est pas le cas, renvoie une valeur alternative. La deuxième " +"ligne insère cette valeur alternative dans la table de hachage si le livre est " +"introuvable." + +#: src/std-types/hashmap.md +msgid "\"Harry Potter and the Sorcerer's Stone\"" +msgstr "\"Harry Potter et la Pierre Philosophale\"" + +#: src/std-types/hashmap.md +msgid "\"The Hunger Games\"" +msgstr "\"Les Hunger Games\"" + +#: src/std-types/hashmap.md +msgid "Unlike `vec!`, there is unfortunately no standard `hashmap!` macro." +msgstr "" +"Contrairement à `vec!`, il n'existe malheureusement pas de macro `hashmap!` standard." + +#: src/std-types/hashmap.md +msgid "" +"Although, since Rust 1.56, HashMap implements [`From<[(K, V); N]>`](https://doc.rust-lang." +"org/std/collections/hash_map/struct.HashMap.html#impl-From%3C%5B(K,+V);+N%5D%3E-for-" +"HashMap%3CK,+V,+RandomState%3E), which allows us to easily initialize a hash map from a " +"literal array:" +msgstr "" +"Bien que, depuis Rust 1.56, HashMap implémente [`From<[(K, V); N]>`](https://doc.rust-" +"lang.org/std/collections/hash_map/struct.HashMap.html#impl-From%3C%5B(K,+V);+N%5D%3E-for-" +"HashMap%3CK,+V,+RandomState%3E), ce qui nous permet d'initialiser facilement une table de " +"hachage à partir d'un tableau littéral :" + +#: src/std-types/hashmap.md +msgid "Alternatively HashMap can be built from any `Iterator` that yields key-value tuples." +msgstr "" +"Il est également possible de construire un HashMap à partir de n'importe quel `Iterator` " +"qui produit des tuples clé-valeur." + +#: src/std-types/hashmap.md +msgid "" +"This type has several \"method-specific\" return types, such as `std::collections::" +"hash_map::Keys`. These types often appear in searches of the Rust docs. Show students the " +"docs for this type, and the helpful link back to the `keys` method." +msgstr "" +"Ce type possède plusieurs types de retour spécifiques à certaines méthodes, comme `std::" +"collections::hash_map::Keys`. Ces types apparaissent fréquemment dans les résultats de " +"recherche de la documentation Rust. Montrez aux étudiants la documentation de ce type, " +"ainsi que le lien utile vers la méthode `keys`." + +#: src/std-types/exercise.md +msgid "" +"In this exercise you will take a very simple data structure and make it generic. It uses " +"a [`std::collections::HashMap`](https://doc.rust-lang.org/stable/std/collections/struct." +"HashMap.html) to keep track of what values have been seen and how many times each one has " +"appeared." +msgstr "" +"Dans cet exercice, vous allez rendre générique une structure de données très simple. " +"Celle-ci utilise une [`std::collections::HashMap`](https://doc.rust-lang.org/stable/std/" +"collections/struct.HashMap.html) pour garder une trace des valeurs rencontrées et de leur " +"fréquence d'apparition." + +#: src/std-types/exercise.md +msgid "" +"The initial version of `Counter` is hardcoded to only work for `u32` values. Make the " +"struct and its methods generic over the type of value being tracked, that way `Counter` " +"can track any type of value." +msgstr "" +"La version initiale de `Counter` est conçue pour ne fonctionner qu'avec les valeurs " +"`u32`. Rendez la structure et ses méthodes génériques pour tout type de valeur suivie, " +"afin que `Counter` puisse gérer n'importe quel type de valeur." + +#: src/std-types/exercise.md +msgid "" +"If you finish early, try using the [`entry`](https://doc.rust-lang.org/stable/std/" +"collections/struct.HashMap.html#method.entry) method to halve the number of hash lookups " +"required to implement the `count` method." +msgstr "" +"Si vous terminez plus tôt, essayez d'utiliser la méthode [`entry`](https://doc.rust-lang." +"org/stable/std/collections/struct.HashMap.html#method.entry) pour réduire de moitié le " +"nombre de recherches de hachage nécessaires pour implémenter la méthode `count`." + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "/// Counter counts the number of times each value of type T has been seen.\n" +msgstr "/// Le compteur conte le nombre de fois que chaque valeur de type T a été vue.\n" + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "/// Create a new Counter.\n" +msgstr "/// Créez un nouveau Compteur.\n" + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "/// Count an occurrence of the given value.\n" +msgstr "/// Comptez l'occurrence d'une valeur donnée.\n" + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "/// Return the number of times the given value has been seen.\n" +msgstr "/// Retournez le nombre de fois qu'une valeur donnée a été vue.\n" + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "\"saw {} values equal to {}\"" +msgstr "\"{} valeur vues, ce qui égale {}\"" + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "\"apple\"" +msgstr "\"pomme\"" + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "\"orange\"" +msgstr "\"orange\"" + +#: src/std-types/exercise.md src/std-types/solution.md +msgid "\"got {} apples\"" +msgstr "\"a {} pommes\"" + +#: src/std-traits.md +msgid "Read and Write" +msgstr "Read et Write" + +#: src/std-traits.md +msgid "Default, struct update syntax" +msgstr "Defauts et syntaxe de mise à jour de struct" + +#: src/std-traits.md +msgid "" +"As with the standard library types, spend time reviewing the documentation for each trait." +msgstr "" +"Comme pour les types de la bibliothèque standard, prenez le temps de consulter la " +"documentation de chaque caractéristique." + +#: src/std-traits.md +msgid "This section is long. Take a break midway through." +msgstr "Ce passage est long. Faites une pause à mi-chemin." + +#: src/std-traits/comparisons.md +msgid "" +"These traits support comparisons between values. All traits can be derived for types " +"containing fields that implement these traits." +msgstr "" +"Ces caractéristiques permettent de comparer des valeurs. Toutes les caractéristiques " +"peuvent être dérivées pour les types contenant des champs qui implémentent ces " +"caractéristiques." + +#: src/std-traits/comparisons.md +msgid "`PartialEq` and `Eq`" +msgstr "`PartialEq` et `Eq`" + +#: src/std-traits/comparisons.md +msgid "" +"`PartialEq` is a partial equivalence relation, with required method `eq` and provided " +"method `ne`. The `==` and `!=` operators will call these methods." +msgstr "" +"`PartialEq` est une relation d'équivalence partielle, avec une méthode obligatoire `eq` " +"et une méthode fournie `ne`. Les opérateurs `==` et `!=` appellent ces méthodes." + +#: src/std-traits/comparisons.md +msgid "" +"`Eq` is a full equivalence relation (reflexive, symmetric, and transitive) and implies " +"`PartialEq`. Functions that require full equivalence will use `Eq` as a trait bound." +msgstr "" +"`Eq` est une relation d'équivalence complète (réflexive, symétrique et transitive) et " +"implique `PartialEq`. Les fonctions qui requièrent une équivalence complète utiliseront " +"`Eq` comme contrainte de trait." + +#: src/std-traits/comparisons.md +msgid "`PartialOrd` and `Ord`" +msgstr "`PartialOrd` et `Ord`" + +#: src/std-traits/comparisons.md +msgid "" +"`PartialOrd` defines a partial ordering, with a `partial_cmp` method. It is used to " +"implement the `<`, `<=`, `>=`, and `>` operators." +msgstr "" +"`PartialOrd` définit un ordre partiel, avec une méthode `partial_cmp`. Il est utilisé " +"pour implémenter les opérateurs `<`, `<=`, `>=` et `>`." + +#: src/std-traits/comparisons.md +msgid "`Ord` is a total ordering, with `cmp` returning `Ordering`." +msgstr "`Ord` est un ordre total, `cmp` renvoyant `Ordering`." + +#: src/std-traits/comparisons.md +msgid "" +"`PartialEq` can be implemented between different types, but `Eq` cannot, because it is " +"reflexive:" +msgstr "" +"`PartialEq` peut être implémenté entre différents types, mais `Eq` ne le peut pas, car il " +"est réflexif :" + +#: src/std-traits/comparisons.md +msgid "In practice, it's common to derive these traits, but uncommon to implement them." +msgstr "" +"En pratique, il est courant de déceler ces caractéristiques, mais rare de les mettre en " +"œuvre." + +#: src/std-traits/comparisons.md +msgid "" +"When comparing references in Rust, it will compare the value of the things pointed to, it " +"will NOT compare the references themselves. That means that references to two different " +"things can compare as equal if the values pointed to are the same:" +msgstr "" +"En Rust, lors de la comparaison de références, ce sont les valeurs des éléments pointés " +"qui sont comparées, et non les références elles-mêmes. Cela signifie que deux références " +"pointant vers des éléments différents peuvent être considérées comme égales si les " +"valeurs pointées sont identiques." + +#: src/std-traits/operators.md +msgid "" +"Operator overloading is implemented via traits in [`std::ops`](https://doc.rust-lang.org/" +"std/ops/index.html):" +msgstr "" +"La surcharge d'opérateurs est implémentée via des traits dans [`std::ops`](https://doc." +"rust-lang.org/std/ops/index.html) :" + +#: src/std-traits/operators.md +msgid "\"{p1:?} + {p2:?} = {:?}\"" +msgstr "\"{p1:?} + {p2:?} = {:?}\"" + +#: src/std-traits/operators.md src/memory-management/drop.md +msgid "Discussion points:" +msgstr "Points de discussion:" + +#: src/std-traits/operators.md +msgid "You could implement `Add` for `&Point`. In which situations is that useful?" +msgstr "" +"Vous pourriez implémenter `Add` pour `&Point`. Dans quelles situations cela serait-il " +"utile ?" + +#: src/std-traits/operators.md +msgid "" +"Answer: `Add:add` consumes `self`. If type `T` for which you are overloading the operator " +"is not `Copy`, you should consider overloading the operator for `&T` as well. This avoids " +"unnecessary cloning on the call site." +msgstr "" +"Réponse : `Add:add` consomme `self`. Si le type `T` pour lequel vous surchargez " +"l’opérateur n’est pas `Copy`, vous devriez également envisager de surcharger l’opérateur " +"pour `&T`. Cela évite un clonage inutile au point d’appel." + +#: src/std-traits/operators.md +msgid "Why is `Output` an associated type? Could it be made a type parameter of the method?" +msgstr "" +"Pourquoi `Output` est-il un type associé ? Pourrait-il être transformé en paramètre de " +"type de la méthode ?" + +#: src/std-traits/operators.md +msgid "" +"Short answer: Function type parameters are controlled by the caller, but associated types " +"(like `Output`) are controlled by the implementer of a trait." +msgstr "" +"Réponse courte : les paramètres de type fonction sont contrôlés par l’appelant, mais les " +"types associés (comme `Output`) sont contrôlés par l’implémenteur d’un trait." + +#: src/std-traits/operators.md +msgid "" +"You could implement `Add` for two different types, e.g. `impl Add<(i32, i32)> for Point` " +"would add a tuple to a `Point`." +msgstr "" +"Vous pourriez implémenter `Add` pour deux types différents, par exemple `impl Add<(i32, " +"i32)> for Point` ajouterait un tuple à un `Point`." + +#: src/std-traits/operators.md +msgid "" +"The `Not` trait (`!` operator) is notable because it does not convert the argument to " +"`bool` like the same operator in C-family languages; instead, for integer types it flips " +"each bit of the number, which, arithmetically, is equivalent to subtracting the argument " +"from `-1`: `!5 == -6`." +msgstr "" +"Le trait `Not` (opérateur `!`) est remarquable car il ne convertit pas l'argument en " +"`bool` comme le même opérateur dans les langages de la famille C ; au lieu de cela, pour " +"les types entiers, il inverse chaque bit du nombre, ce qui, arithmétiquement, est " +"équivalent à soustraire l'argument de `-1` : `!5 == -6`." + +#: src/std-traits/from-and-into.md +msgid "" +"Types implement [`From`](https://doc.rust-lang.org/std/convert/trait.From.html) and " +"[`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) to facilitate type " +"conversions. Unlike `as`, these traits correspond to lossless, infallible conversions." +msgstr "" +"Les types implémentent les traits `From` et `Into` pour faciliter les conversions de " +"types. Contrairement à `as`, ces traits correspondent à des conversions sans perte et " +"infaillibles." + +#: src/std-traits/from-and-into.md +msgid "\"{s}, {addr}, {one}, {bigger}\"" +msgstr "\"{s}, {addr}, {one}, {bigger}\"" + +#: src/std-traits/from-and-into.md +msgid "" +"[`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) is automatically " +"implemented when [`From`](https://doc.rust-lang.org/std/convert/trait.From.html) is " +"implemented:" +msgstr "" +"[`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) est automatiquement " +"implémenté lorsque [`From`](https://doc.rust-lang.org/std/convert/trait.From.html) est " +"implémenté :" + +#: src/std-traits/from-and-into.md +msgid "" +"That's why it is common to only implement `From`, as your type will get `Into` " +"implementation too." +msgstr "" +"C'est pourquoi il est courant de n'implémenter que `From`, car votre type recevra " +"également une implémentation de `Into`." + +#: src/std-traits/from-and-into.md +msgid "" +"When declaring a function argument input type like \"anything that can be converted into " +"a `String`\", the rule is opposite, you should use `Into`. Your function will accept " +"types that implement `From` and those that _only_ implement `Into`." +msgstr "" +"Lorsqu'on déclare un type d'entrée pour un argument de fonction comme « tout ce qui peut " +"être converti en `String` », la règle est inverse : il faut utiliser `Into`. Votre " +"fonction acceptera les types qui implémentent `From` et ceux qui implémentent " +"_uniquement_ `Into`." + +#: src/std-traits/casting.md +msgid "" +"Rust has no _implicit_ type conversions, but does support explicit casts with `as`. These " +"generally follow C semantics where those are defined." +msgstr "" +"Rust ne propose pas de conversions de type _implicites_, mais prend en charge les " +"conversions explicites avec `as`. Celles-ci suivent généralement la sémantique du C " +"lorsqu'elle est définie." + +#: src/std-traits/casting.md +msgid "\"as u16: {}\"" +msgstr "\"as u16: {}\"" + +#: src/std-traits/casting.md +msgid "\"as i16: {}\"" +msgstr "\"as i16: {}\"" + +#: src/std-traits/casting.md +msgid "\"as u8: {}\"" +msgstr "\"as u8: {}\"" + +#: src/std-traits/casting.md +msgid "" +"The results of `as` are _always_ defined in Rust and consistent across platforms. This " +"might not match your intuition for changing sign or casting to a smaller type -- check " +"the docs, and comment for clarity." +msgstr "" +"Le comportement de `as` est _toujours_ défini en Rust et cohérent d'une plateforme à " +"l'autre. Cela peut ne pas correspondre à votre intuition concernant le changement de " +"signe ou la conversion vers un type plus petit ; consultez la documentation et n'hésitez " +"pas à commenter pour plus de clarté." + +#: src/std-traits/casting.md +msgid "" +"Casting with `as` is a relatively sharp tool that is easy to use incorrectly, and can be " +"a source of subtle bugs as future maintenance work changes the types that are used or the " +"ranges of values in types. Casts are best used only when the intent is to indicate " +"unconditional truncation (e.g. selecting the bottom 32 bits of a `u64` with `as u32`, " +"regardless of what was in the high bits)." +msgstr "" +"L'utilisation de `as` pour convertir des types est un outil relativement précis, mais " +"facile à mal utiliser, et peut être source de bogues subtils lors de futures mises à jour " +"de maintenance modifiant les types utilisés ou leurs plages de valeurs. Il est préférable " +"d'utiliser les conversions uniquement pour indiquer une troncature inconditionnelle (par " +"exemple, sélectionner les 32 bits de poids faible d'un `u64` avec `as u32`, " +"indépendamment de la valeur des bits de poids fort)." + +#: src/std-traits/casting.md +msgid "" +"For infallible casts (e.g. `u32` to `u64`), prefer using `From` or `Into` over `as` to " +"confirm that the cast is in fact infallible. For fallible casts, `TryFrom` and `TryInto` " +"are available when you want to handle casts that fit differently from those that don't." +msgstr "" +"Pour les conversions infaillibles (par exemple, de `u32` à `u64`), privilégiez `From` ou " +"`Into` à `as` pour garantir leur infaillibilité. Pour les conversions imparfaites, " +"utilisez `TryFrom` et `TryInto` afin de gérer les cas où la conversion diffère de celle " +"qui est correcte." + +#: src/std-traits/casting.md +msgid "Consider taking a break after this slide." +msgstr "Pensez à faire une pause après cette diapositive." + +#: src/std-traits/casting.md +msgid "" +"`as` is similar to a C++ static cast. Use of `as` in cases where data might be lost is " +"generally discouraged, or at least deserves an explanatory comment." +msgstr "" +"L'opérateur `as` est similaire à une conversion statique en C++. Son utilisation est " +"généralement déconseillée lorsqu'une perte de données est possible, ou nécessite au moins " +"une explication." + +#: src/std-traits/casting.md +msgid "This is common in casting integers to `usize` for use as an index." +msgstr "" +"Ceci est courant lors de la conversion d'entiers en `usize` pour une utilisation comme " +"index." + +#: src/std-traits/read-and-write.md +msgid "" +"Using [`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) and [`BufRead`](https://" +"doc.rust-lang.org/std/io/trait.BufRead.html), you can abstract over `u8` sources:" +msgstr "" +"En utilisant [`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) et [`BufRead`]" +"(https://doc.rust-lang.org/std/io/trait.BufRead.html), vous pouvez faire abstraction des " +"sources `u8` :" + +#: src/std-traits/read-and-write.md +msgid "b\"foo\\nbar\\nbaz\\n\"" +msgstr "b\"foo\\nbar\\nbaz\\n\"" + +#: src/std-traits/read-and-write.md +msgid "\"lines in slice: {}\"" +msgstr "\"lignes dans la tranche : {}\"" + +#: src/std-traits/read-and-write.md +msgid "\"lines in file: {}\"" +msgstr "\"ligne dans le fichier : {}\"" + +#: src/std-traits/read-and-write.md +msgid "" +"Similarly, [`Write`](https://doc.rust-lang.org/std/io/trait.Write.html) lets you abstract " +"over `u8` sinks:" +msgstr "" +"De même, [`Write`](https://doc.rust-lang.org/std/io/trait.Write.html) vous permet " +"d'abstraire les récepteurs `u8` :" + +#: src/std-traits/read-and-write.md +msgid "\"\\n\"" +msgstr "\"\\n\"" + +#: src/std-traits/read-and-write.md +msgid "\"Logged: {buffer:?}\"" +msgstr "\"Loggué : {buffer:?}\"" + +#: src/std-traits/default.md +msgid "The `Default` Trait" +msgstr "Le trait `Default`" + +#: src/std-traits/default.md +msgid "" +"The [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) trait produces " +"a default value for a type." +msgstr "" +"Le trait [`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) produit " +"une valeur par défaut pour un type." + +#: src/std-traits/default.md +msgid "\"John Smith\"" +msgstr "\"John Smith\"" + +#: src/std-traits/default.md +msgid "\"Y is set!\"" +msgstr "\"Y est défini !\"" + +#: src/std-traits/default.md +msgid "It can be implemented directly or it can be derived via `#[derive(Default)]`." +msgstr "" +"Il peut être implémenté directement ou il peut être dérivé via `#[derive(Default)]`." + +#: src/std-traits/default.md +msgid "" +"A derived implementation will produce a value where all fields are set to their default " +"values." +msgstr "" +"Une implémentation dérivée produira une valeur où tous les champs sont définis sur leurs " +"valeurs par défaut." + +#: src/std-traits/default.md +msgid "This means all types in the struct must implement `Default` too." +msgstr "" +"Cela signifie que tous les types de la structure doivent également implémenter `Default`." + +#: src/std-traits/default.md +msgid "" +"Standard Rust types commonly implement `Default` with reasonable values (e.g. `0`, " +"`\"\"`, etc)." +msgstr "" +"Les types Rust standard implémentent généralement `Default` avec des valeurs raisonnables " +"(par exemple `0`, `\"\"`, etc.)." + +#: src/std-traits/default.md +msgid "The partial struct initialization works nicely with default." +msgstr "" +"L'initialisation partielle de la structure fonctionne bien avec la valeur par défaut." + +#: src/std-traits/default.md +msgid "" +"The Rust standard library is aware that types can implement `Default` and provides " +"convenience methods that use it." +msgstr "" +"La bibliothèque standard Rust sait que les types peuvent implémenter `Default` et fournit " +"des méthodes pratiques qui l'utilisent." + +#: src/std-traits/default.md +msgid "" +"The `..` syntax is called [struct update syntax](https://doc.rust-lang.org/book/ch05-01-" +"defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax)." +msgstr "" +"La syntaxe `..` est appelée [syntaxe de mise à jour de structure](https://doc.rust-lang." +"org/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-" +"struct-update-syntax)." + +#: src/std-traits/exercise.md +msgid "" +"In this example, you will implement the classic [\"ROT13\" cipher](https://en.wikipedia." +"org/wiki/ROT13). Copy this code to the playground, and implement the missing bits. Only " +"rotate ASCII alphabetic characters, to ensure the result is still valid UTF-8." +msgstr "" +"Dans cet exemple, vous implémenterez le chiffrement classique [« ROT13 »](https://en." +"wikipedia.org/wiki/ROT13). Copiez ce code dans l'espace de travail et implémentez les " +"éléments manquants. Ne modifiez que les caractères alphabétiques ASCII afin de garantir " +"un résultat UTF-8 valide." + +#: src/std-traits/exercise.md +msgid "// Implement the `Read` trait for `RotDecoder`.\n" +msgstr "// Implémentez le trait `Read` pour `RotDecoder`.\n" + +#: src/std-traits/exercise.md src/std-traits/solution.md +msgid "\"Gb trg gb gur bgure fvqr!\"" +msgstr "\"Gb trg gb gur bgure fvqr!\"" + +#: src/std-traits/exercise.md src/std-traits/solution.md +msgid "\"To get to the other side!\"" +msgstr "\"To get to the other side!\"" + +#: src/std-traits/exercise.md +msgid "" +"What happens if you chain two `RotDecoder` instances together, each rotating by 13 " +"characters?" +msgstr "" +"Que se passe-t-il si vous enchaînez deux instances de `RotDecoder`, chacune effectuant " +"une rotation de 13 caractères ?" + +#: src/welcome-day-3.md +msgid "Welcome to Day 3" +msgstr "Bienvenue au Jour 3" + +#: src/welcome-day-3.md +msgid "We have now seen all the core language features:" +msgstr "Nous avons maintenant vu toutes les fonctionnalités essentielles du langage :" + +#: src/welcome-day-3.md +msgid "**Foundations:** Basic types, control flow, functions, and data structures." +msgstr "" +"**Fondements :** Types de base, flux de contrôle, fonctions et structures de données." + +#: src/welcome-day-3.md +msgid "**Pattern Matching:** Destructuring data effectively." +msgstr "**Recherche de modèles :** Déstructuration efficace des données." + +#: src/welcome-day-3.md +msgid "**Polymorphism:** Methods, Traits, and Generics." +msgstr "**Polymorphisme :** Méthodes, traits et génériques." + +#: src/welcome-day-3.md +msgid "" +"**Standard Library:** Using essential types like `Option`, `Result`, `Vec`, and `String`." +msgstr "" +"**Bibliothèque standard :** Utilisation de types essentiels comme `Option`, `Result`, " +"`Vec` et `String`." + +#: src/welcome-day-3.md +msgid "**Closures:** Anonymous functions that can capture their environment." +msgstr "**Fermetures :** Fonctions anonymes capables de capturer leur environnement." + +#: src/welcome-day-3.md +msgid "" +"You can write any type and associate behavior with it. We are now shifting gears to apply " +"these concepts to memory management and system design." +msgstr "" +"Vous pouvez définir n'importe quel type de code et lui associer un comportement. Nous " +"allons maintenant appliquer ces concepts à la gestion de la mémoire et à la conception " +"des systèmes." + +#: src/welcome-day-3.md src/welcome-day-4-afternoon.md +msgid "" +"Including 10 minute breaks, this session should take about 2 hours and 20 minutes. It " +"contains:" +msgstr "" +"En comptant les pauses de 10 minutes, cette session devrait durer environ 2 heures et 20 " +"minutes. Elle comprend :" + +#: src/memory-management.md +msgid "Drop" +msgstr "Drop" + +#: src/memory-management/review.md +msgid "Programs allocate memory in two ways:" +msgstr "Les programmes allouent de la mémoire de deux manières :" + +#: src/memory-management/review.md +msgid "Stack: Continuous area of memory for local variables." +msgstr "Pile : Zone de mémoire contiguë pour les variables locales." + +#: src/memory-management/review.md +msgid "Values have fixed sizes known at compile time." +msgstr "Les valeurs ont des tailles fixes connues au moment de la compilation." + +#: src/memory-management/review.md +msgid "Extremely fast: just move a stack pointer." +msgstr "Extrêmement rapide : il suffit de déplacer un pointeur de pile." + +#: src/memory-management/review.md +msgid "Easy to manage: follows function calls." +msgstr "Facile à gérer : suit les appels de fonction." + +#: src/memory-management/review.md +msgid "Great memory locality." +msgstr "Grande localité de mémoire." + +#: src/memory-management/review.md +msgid "Heap: Storage of values outside of function calls." +msgstr "Tas : Stockage des valeurs en dehors des appels de fonction." + +#: src/memory-management/review.md +msgid "Values have dynamic sizes determined at runtime." +msgstr "Les valeurs ont des tailles dynamiques déterminées lors de l'exécution." + +#: src/memory-management/review.md +msgid "Slightly slower than the stack: some bookkeeping needed." +msgstr "Légèrement plus lent que la pile : un peu de comptabilité est nécessaire." + +#: src/memory-management/review.md +#, fuzzy +msgid "No guarantee of memory locality." +msgstr "Aucune garantie de localisation de la mémoire." + +#: src/memory-management/review.md +msgid "" +"Creating a `String` puts fixed-sized metadata on the stack and dynamically sized data, " +"the actual string, on the heap:" +msgstr "" +"La création d'une `String` place les métadonnées de taille fixe sur la pile et les " +"données de taille dynamique, la chaîne de caractères proprement dite, sur le tas :" + +#: src/memory-management/review.md +msgid "" +"Mention that a `String` is backed by a `Vec`, so it has a capacity and length and can " +"grow if mutable via reallocation on the heap." +msgstr "" +"Précisez qu'une `String` est adossée à un `Vec`, elle possède donc une capacité et une " +"longueur et peut s'agrandir si elle est mutable par réallocation sur le tas." + +#: src/memory-management/review.md +msgid "" +"If students ask about it, you can mention that the underlying memory is heap allocated " +"using the [System Allocator](https://doc.rust-lang.org/std/alloc/struct.System.html) and " +"custom allocators can be implemented using the [Allocator API](https://doc.rust-lang.org/" +"std/alloc/index.html)" +msgstr "" +"Si les étudiants posent des questions à ce sujet, vous pouvez mentionner que la mémoire " +"sous-jacente est allouée sur le tas à l'aide de l'[Allocateur système](https://doc.rust-" +"lang.org/std/alloc/struct.System.html) et que des allocateurs personnalisés peuvent être " +"implémentés à l'aide de l'[API Allocator](https://doc.rust-lang.org/std/alloc/index.html)." + +#: src/memory-management/review.md +msgid "" +"We can inspect the memory layout with `unsafe` Rust. However, you should point out that " +"this is rightfully unsafe!" +msgstr "" +"On peut examiner l'organisation de la mémoire avec Rust `unsafe`. Cependant, il convient " +"de préciser que cette approche est légitimement dangereuse !" + +#: src/memory-management/review.md src/testing/unit-tests.md +msgid "' '" +msgstr "' '" + +#: src/memory-management/review.md +msgid "\"world\"" +msgstr "\"world\"" + +#: src/memory-management/review.md +msgid "" +"// DON'T DO THIS AT HOME! For educational purposes only.\n" +" // String provides no guarantees about its layout, so this could lead to\n" +" // undefined behavior.\n" +msgstr "" +"// NE LE FAITES PAS A LA MAISON ! A des fins éducatives uniquement.\n" +" // Le type String ne donne aucune garantie sur sa représentation en mémoire\n" +" // Cela pourrait donc entraîner un comportement indéfini.\n" + +#: src/memory-management/review.md +msgid "\"capacity = {capacity}, ptr = {ptr:#x}, len = {len}\"" +msgstr "\"capacity = {capacity}, ptr = {ptr:#x}, len = {len}\"" + +#: src/memory-management/approaches.md +msgid "Traditionally, languages have fallen into two broad categories:" +msgstr "Traditionnellement, les langues se répartissent en deux grandes catégories :" + +#: src/memory-management/approaches.md +msgid "Full control via manual memory management: C, C++, Pascal, ..." +msgstr "Contrôle total via la gestion manuelle de la mémoire : C, C++, Pascal, ..." + +#: src/memory-management/approaches.md +msgid "Programmer decides when to allocate or free heap memory." +msgstr "Le programmeur décide quand allouer ou libérer de la mémoire du tas." + +#: src/memory-management/approaches.md +msgid "Programmer must determine whether a pointer still points to valid memory." +msgstr "" +"Le programmeur doit déterminer si un pointeur pointe toujours vers une zone mémoire " +"valide." + +#: src/memory-management/approaches.md +msgid "Studies show, programmers make mistakes." +msgstr "Des études montrent que les programmeurs font des erreurs." + +#: src/memory-management/approaches.md +msgid "" +"Full safety via automatic memory management at runtime: Java, Python, Go, Haskell, ..." +msgstr "" +"Sécurité totale grâce à la gestion automatique de la mémoire à l'exécution : Java, " +"Python, Go, Haskell, ..." + +#: src/memory-management/approaches.md +msgid "" +"A runtime system ensures that memory is not freed until it can no longer be referenced." +msgstr "" +"Un système d'exécution garantit que la mémoire n'est libérée que lorsqu'elle ne peut plus " +"être référencée." + +#: src/memory-management/approaches.md +msgid "Typically implemented with reference counting or garbage collection." +msgstr "" +"Généralement mis en œuvre avec un système de comptage de références ou de ramasse-miettes." + +#: src/memory-management/approaches.md +msgid "Rust offers a new mix:" +msgstr "Rust propose un nouveau mélange :" + +#: src/memory-management/approaches.md +msgid "Full control _and_ safety via compile time enforcement of correct memory management." +msgstr "" +"Contrôle total et sécurité grâce à l'application, au moment de la compilation, d'une " +"gestion correcte de la mémoire." + +#: src/memory-management/approaches.md +msgid "It does this with an explicit ownership concept." +msgstr "Elle le fait grâce à un concept de propriété explicite." + +#: src/memory-management/approaches.md +msgid "" +"This slide is intended to help students coming from other languages to put Rust in " +"context." +msgstr "" +"Cette diapositive a pour but d'aider les apprenants venant d'autres langages à situer Rust " +"dans son contexte." + +#: src/memory-management/approaches.md +msgid "" +"C must manage heap manually with `malloc` and `free`. Common errors include forgetting to " +"call `free`, calling it multiple times for the same pointer, or dereferencing a pointer " +"after the memory it points to has been freed." +msgstr "" +"En C, la gestion du tas doit être effectuée manuellement à l'aide de `malloc` et `free`. " +"Les erreurs courantes consistent à oublier d'appeler `free`, à l'appeler plusieurs fois " +"pour le même pointeur, ou à déréférencer un pointeur après que la mémoire qu'il pointe a " +"été libérée." + +#: src/memory-management/approaches.md +msgid "" +"C++ has tools like smart pointers (`unique_ptr`, `shared_ptr`) that take advantage of " +"language guarantees about calling destructors to ensure memory is freed when a function " +"returns. It is still quite easy to misuse these tools and create similar bugs to C." +msgstr "" +"Le C++ dispose d'outils comme les pointeurs intelligents (`unique_ptr`, `shared_ptr`) qui " +"tirent parti des garanties du langage concernant l'appel des destructeurs afin d'assurer " +"la libération de la mémoire lors du retour d'une fonction. Il reste néanmoins assez " +"facile de mal utiliser ces outils et de reproduire des bogues similaires à ceux " +"rencontrés en C." + +#: src/memory-management/approaches.md +msgid "" +"Java, Go, and Python rely on the garbage collector to identify memory that is no longer " +"reachable and discard it. This guarantees that any pointer can be dereferenced, " +"eliminating use-after-free and other classes of bugs. But, GC has a runtime cost and is " +"difficult to tune properly." +msgstr "" +"Java, Go et Python s'appuient sur le ramasse-miettes pour identifier et libérer la " +"mémoire devenue inaccessible. Ceci garantit la déréférencement de tout pointeur, " +"éliminant ainsi les erreurs d'utilisation après libération et autres types de bogues. " +"Cependant, le ramasse-miettes a un coût en temps d'exécution et son paramétrage est " +"complexe." + +#: src/memory-management/approaches.md +msgid "" +"Rust's ownership and borrowing model can, in many cases, get the performance of C, with " +"alloc and free operations precisely where they are required -- zero-cost. It also " +"provides tools similar to C++'s smart pointers. When required, other options such as " +"reference counting are available, and there are even crates available to support runtime " +"garbage collection (not covered in this class)." +msgstr "" +"Le modèle de gestion de la mémoire de Rust permet, dans de nombreux cas, d'atteindre les " +"performances du C, les opérations d'allocation et de libération étant effectuées " +"précisément là où elles sont nécessaires – et ce, sans coût. Il offre également des " +"outils similaires aux pointeurs intelligents du C++. Au besoin, d'autres options telles " +"que le comptage de références sont disponibles, et il existe même des bibliothèques pour " +"la gestion de la mémoire à l'exécution (non abordée dans ce cours)." + +#: src/memory-management/ownership.md +msgid "" +"All variable bindings have a _scope_ where they are valid and it is an error to use a " +"variable outside its scope:" +msgstr "" +"Chaque liaison de variable possède un _scope_ dans lequel elle est valide, et utiliser " +"une variable en dehors de son scope constitue une erreur :" + +#: src/memory-management/ownership.md +msgid "" +"We say that the variable _owns_ the value. Every Rust value has precisely one owner at " +"all times." +msgstr "" +"On dit que la variable _possède_ la valeur. Chaque valeur Rust a toujours un seul " +"propriétaire." + +#: src/memory-management/ownership.md +msgid "" +"At the end of the scope, the variable is _dropped_ and the data is freed. A destructor " +"can run here to free up resources." +msgstr "" +"À la fin de la portée, la variable est supprimée et les données sont libérées. Un " +"destructeur peut être exécuté ici pour libérer les ressources." + +#: src/memory-management/ownership.md +msgid "" +"Students familiar with garbage collection implementations will know that a garbage " +"collector starts with a set of \"roots\" to find all reachable memory. Rust's \"single " +"owner\" principle is a similar idea." +msgstr "" +"Les apprenants qui connaissent les implémentations du ramasse-miettes savent qu'un ramasse-" +"miettes commence par un ensemble de « racines » pour parcourir toute la mémoire " +"accessible. Le principe de « propriétaire unique » de Rust repose sur une idée similaire." + +#: src/memory-management/move.md +msgid "An assignment will transfer _ownership_ between variables:" +msgstr "Une affectation transférera la propriété des variables :" + +#: src/memory-management/move.md src/concurrency/async-control-flow/select.md +msgid "\"Hello!\"" +msgstr "\"Hello!\"" + +#: src/memory-management/move.md +msgid "// dbg!(s1);\n" +msgstr "// dbg!(s1);\n" + +#: src/memory-management/move.md +msgid "The assignment of `s1` to `s2` transfers ownership." +msgstr "L'attribution de `s1` à `s2` transfère la propriété." + +#: src/memory-management/move.md +msgid "When `s1` goes out of scope, nothing happens: it does not own anything." +msgstr "Lorsque `s1` sort de la portée, rien ne se passe : il ne possède rien." + +#: src/memory-management/move.md +msgid "When `s2` goes out of scope, the string data is freed." +msgstr "Lorsque `s2` sort de sa portée, les données de chaîne sont libérées." + +#: src/memory-management/move.md +msgid "Before move to `s2`:" +msgstr "Avant de passer à `s2` :" + +#: src/memory-management/move.md +msgid "After move to `s2`:" +msgstr "Après le passage à `s2` :" + +#: src/memory-management/move.md +msgid "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": s1 \"(inaccessible)\" : : :\n" +": +-----------+-------+ : : +----+----+----+----+----+----+ :\n" +": | ptr | o---+---+--+--+-->| H | e | l | l | o | ! | :\n" +": | len | 6 | : | : +----+----+----+----+----+----+ :\n" +": | capacity | 6 | : | : :\n" +": +-----------+-------+ : | : :\n" +": : | `- - - - - - - - - - - - - - - - - - -'\n" +": s2 : |\n" +": +-----------+-------+ : |\n" +": | ptr | o---+---+--'\n" +": | len | 6 | :\n" +": | capacity | 6 | :\n" +": +-----------+-------+ :\n" +": :\n" +"`- - - - - - - - - - - - - -'\n" +"```" +msgstr "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": s1 \"(inaccessible)\" : : :\n" +": +-----------+-------+ : : +----+----+----+----+----+----+ :\n" +": | ptr | o---+---+--+--+-->| H | e | l | l | o | ! | :\n" +": | len | 6 | : | : +----+----+----+----+----+----+ :\n" +": | capacity | 6 | : | : :\n" +": +-----------+-------+ : | : :\n" +": : | `- - - - - - - - - - - - - - - - - - -'\n" +": s2 : |\n" +": +-----------+-------+ : |\n" +": | ptr | o---+---+--'\n" +": | len | 6 | :\n" +": | capacity | 6 | :\n" +": +-----------+-------+ :\n" +": :\n" +"`- - - - - - - - - - - - - -'\n" +"```" + +#: src/memory-management/move.md +msgid "" +"When you pass a value to a function, the value is assigned to the function parameter. " +"This transfers ownership:" +msgstr "" +"Lorsque vous transmettez une valeur à une fonction, cette valeur est affectée au " +"paramètre de la fonction. Cela transfère la propriété de la valeur :" + +#: src/memory-management/move.md src/memory-management/clone.md +msgid "\"Hello {name}\"" +msgstr "\"Hello {name}\"" + +#: src/memory-management/move.md src/memory-management/clone.md +#: src/android/aidl/types/parcelables.md src/android/interoperability/java.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "\"Alice\"" +msgstr "\"Alice\"" + +#: src/memory-management/move.md +msgid "// say_hello(name);\n" +msgstr "// say_hello(name);\n" + +#: src/memory-management/move.md +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 "" +"À noter que cela est l'inverse du comportement par défaut en C++, qui copie par valeur " +"sauf si vous utilisez `std::move` (et que le constructeur de déplacement est défini !)." + +#: src/memory-management/move.md +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 "" +"Seul le droit de propriété est transféré. La génération éventuelle de code machine pour " +"manipuler les données relève de l'optimisation, et ces copies sont éliminées de manière " +"systématique." + +#: src/memory-management/move.md +msgid "Simple values (such as integers) can be marked `Copy` (see later slides)." +msgstr "" +"Les valeurs simples (telles que les entiers) peuvent être marquées `Copie` (voir les " +"diapositives suivantes)." + +#: src/memory-management/move.md +msgid "In Rust, clones are explicit (by using `clone`)." +msgstr "En Rust, les clones sont explicites (en utilisant `clone`)." + +#: src/memory-management/move.md +msgid "In the `say_hello` example:" +msgstr "Dans l'exemple `say_hello` :" + +#: src/memory-management/move.md +msgid "" +"With the first call to `say_hello`, `main` gives up ownership of `name`. Afterwards, " +"`name` cannot be used anymore within `main`." +msgstr "" +"Lors du premier appel à `say_hello`, `main` cède la propriété de `name`. Par la suite, " +"`name` ne peut plus être utilisé dans `main`." + +#: src/memory-management/move.md +msgid "" +"The heap memory allocated for `name` will be freed at the end of the `say_hello` function." +msgstr "" +"La mémoire allouée au tas pour `name` sera libérée à la fin de la fonction `say_hello`." + +#: src/memory-management/move.md +msgid "" +"`main` can retain ownership if it passes `name` as a reference (`&name`) and if " +"`say_hello` accepts a reference as a parameter." +msgstr "" +"`main` peut conserver la propriété s'il passe `name` comme référence (`&name`) et si " +"`say_hello` accepte une référence comme paramètre." + +#: src/memory-management/move.md +msgid "Alternatively, `main` can pass a clone of `name` in the first call (`name.clone()`)." +msgstr "" +"Alternativement, `main` peut passer un clone de `name` lors du premier appel (`name." +"clone()`)." + +#: src/memory-management/move.md +msgid "" +"Rust makes it harder than C++ to inadvertently create copies by making move semantics the " +"default, and by forcing programmers to make clones explicit." +msgstr "" +"Rust rend plus difficile que C++ la création involontaire de copies en faisant du " +"déplacement le comportement par défaut et en obligeant les programmeurs à rendre les " +"clones explicites." + +#: src/memory-management/move.md +msgid "Defensive Copies in Modern C++" +msgstr "Copies défensives en C++ moderne" + +#: src/memory-management/move.md +msgid "Modern C++ solves this differently:" +msgstr "Le C++ moderne résout ce problème différemment :" + +#: src/memory-management/move.md +msgid "\"Cpp\"" +msgstr "\"Cpp\"" + +#: src/memory-management/move.md +msgid "// Duplicate the data in s1.\n" +msgstr "// Dupliquez la donnée dans s1.\n" + +#: src/memory-management/move.md +msgid "The heap data from `s1` is duplicated and `s2` gets its own independent copy." +msgstr "" +"Les données du tas de `s1` sont dupliquées et `s2` obtient sa propre copie indépendante." + +#: src/memory-management/move.md +msgid "When `s1` and `s2` go out of scope, they each free their own memory." +msgstr "" +"Lorsque `s1` et `s2` sortent de leur portée, ils libèrent chacun leur propre mémoire." + +#: src/memory-management/move.md +msgid "Before copy-assignment:" +msgstr "Avant l'affectation de copie :" + +#: src/memory-management/move.md +msgid "After copy-assignment:" +msgstr "Après l'affectation de copie :" + +#: src/memory-management/move.md +msgid "" +"C++ has made a slightly different choice than Rust. Because `=` copies data, the string " +"data has to be cloned. Otherwise we would get a double-free when either string goes out " +"of scope." +msgstr "" +"C++ a fait un choix légèrement différent de Rust. Puisque l'opérateur `=` copie les " +"données, les données de type chaîne doivent être clonées. Sinon, une double libération de " +"mémoire se produirait lorsque l'une ou l'autre des chaînes sortirait de la portée." + +#: src/memory-management/move.md +msgid "" +"C++ also has [`std::move`](https://en.cppreference.com/w/cpp/utility/move), which is used " +"to indicate when a value may be moved from. If the example had been `s2 = std::move(s1)`, " +"no heap allocation would take place. After the move, `s1` would be in a valid but " +"unspecified state. Unlike Rust, the programmer is allowed to keep using `s1`." +msgstr "" +"C++ possède également `std::move` (https://en.cppreference.com/w/cpp/utility/move), qui " +"permet d'indiquer quand une valeur peut être déplacée. Si l'exemple avait été `s2 = std::" +"move(s1)`, aucune allocation mémoire n'aurait eu lieu. Après le déplacement, `s1` se " +"trouverait dans un état valide mais non spécifié. Contrairement à Rust, le programmeur " +"peut continuer à utiliser `s1`." + +#: src/memory-management/move.md +msgid "" +"Unlike Rust, `=` in C++ can run arbitrary code as determined by the type that is being " +"copied or moved." +msgstr "" +"Contrairement à Rust, `=` en C++ peut exécuter du code arbitraire en fonction du type qui " +"est copié ou déplacé." + +#: src/memory-management/clone.md +msgid "Sometimes you _want_ to make a copy of a value. The `Clone` trait accomplishes this." +msgstr "" +"Parfois, on _souhaite_ faire une copie d'une valeur. Le trait `Clone` permet de réaliser " +"cela." + +#: src/memory-management/clone.md +msgid "" +"The idea of `Clone` is to make it easy to spot where heap allocations are occurring. Look " +"for `.clone()` and a few others like `vec!` or `Box::new`." +msgstr "" +"L'objectif de `Clone` est de faciliter le repérage des allocations de mémoire sur le tas. " +"Recherchez `.clone()` et d'autres fonctions comme `vec!` ou `Box::new`." + +#: src/memory-management/clone.md +msgid "" +"It's common to \"clone your way out\" of problems with the borrow checker, and return " +"later to try to optimize those clones away." +msgstr "" +"Il est courant de « se sortir » des problèmes liés au vérificateur d'emprunts en " +"« clonant », puis de revenir plus tard pour tenter d'optimiser ces clones." + +#: src/memory-management/clone.md +msgid "" +"`clone` generally performs a deep copy of the value, meaning that if you e.g. clone an " +"array, all of the elements of the array are cloned as well." +msgstr "" +"La fonction `clone` effectue généralement une copie profonde de la valeur, ce qui " +"signifie que si vous clonez par exemple un tableau, tous les éléments du tableau sont " +"également clonés." + +#: src/memory-management/clone.md +msgid "" +"The behavior for `clone` is user-defined, so it can perform custom cloning logic if " +"needed." +msgstr "" +"Le comportement de `clone` est défini par l'utilisateur, ce qui permet d'effectuer une " +"logique de clonage personnalisée si nécessaire." + +#: src/memory-management/copy-types.md +msgid "While move semantics are the default, certain types are copied by default:" +msgstr "" +"Bien que la sémantique de déplacement soit la valeur par défaut, certains types sont " +"copiés par défaut :" + +#: src/memory-management/copy-types.md +msgid "These types implement the `Copy` trait." +msgstr "Ces types implémentent le trait `Copy`." + +#: src/memory-management/copy-types.md +msgid "You can opt-in your own types to use copy semantics:" +msgstr "" +"Vous pouvez activer l'utilisation de la sémantique de copie pour vos propres types :" + +#: src/memory-management/copy-types.md +msgid "After the assignment, both `p1` and `p2` own their own data." +msgstr "Après l'affectation, `p1` et `p2` possèdent chacun leurs propres données." + +#: src/memory-management/copy-types.md +msgid "We can also use `p1.clone()` to explicitly copy the data." +msgstr "Nous pouvons également utiliser `p1.clone()` pour copier explicitement les données." + +#: src/memory-management/copy-types.md +msgid "Copying and cloning are not the same thing:" +msgstr "Copier et cloner ne sont pas la même chose :" + +#: src/memory-management/copy-types.md +msgid "" +"Copying refers to bitwise copies of memory regions and does not work on arbitrary objects." +msgstr "" +"La copie fait référence à des copies bit à bit de régions de mémoire et ne fonctionne pas " +"sur des objets arbitraires." + +#: src/memory-management/copy-types.md +msgid "Copying does not allow for custom logic (unlike copy constructors in C++)." +msgstr "" +"La copie ne permet pas d'implémenter une logique personnalisée (contrairement aux " +"constructeurs de copie en C++)." + +#: src/memory-management/copy-types.md +msgid "" +"Cloning is a more general operation and also allows for custom behavior by implementing " +"the `Clone` trait." +msgstr "" +"Le clonage est une opération plus générale qui permet également un comportement " +"personnalisé grâce à l'implémentation du trait `Clone`." + +#: src/memory-management/copy-types.md +msgid "Copying does not work on types that implement the `Drop` trait." +msgstr "La copie ne fonctionne pas sur les types qui implémentent le trait `Drop`." + +#: src/memory-management/copy-types.md +msgid "In the above example, try the following:" +msgstr "Dans l'exemple ci-dessus, essayez ce qui suit :" + +#: src/memory-management/copy-types.md +msgid "" +"Add a `String` field to `struct Point`. It will not compile because `String` is not a " +"`Copy` type." +msgstr "" +"Ajoutez un champ `String` à `struct Point`. La compilation échouera car `String` n'est " +"pas un type `Copy`." + +#: src/memory-management/copy-types.md +msgid "" +"Remove `Copy` from the `derive` attribute. The compiler error is now in the `println!` " +"for `p1`." +msgstr "" +"Supprimez `Copy` de l'attribut `derive`. L'erreur de compilation se trouve maintenant " +"dans le `println!` de `p1`." + +#: src/memory-management/copy-types.md +msgid "Show that it works if you clone `p1` instead." +msgstr "Montrez que cela fonctionne si vous clonez `p1` à la place." + +#: src/memory-management/copy-types.md +msgid "" +"Shared references are `Copy`/`Clone`, mutable references are not. This is because Rust " +"requires that mutable references be exclusive, so while it's valid to make a copy of a " +"shared reference, creating a copy of a mutable reference would violate Rust's borrowing " +"rules." +msgstr "" +"Les références partagées peuvent être copiées ou clonées, contrairement aux références " +"mutables. En effet, Rust exige que les références mutables soient exclusives ; il est " +"donc valide de copier une référence partagée, mais copier une référence mutable " +"enfreindrait les règles d'emprunt de Rust." + +#: src/memory-management/drop.md +msgid "The `Drop` Trait" +msgstr "Le trait `Drop`" + +#: src/memory-management/drop.md +msgid "" +"Values which implement [`Drop`](https://doc.rust-lang.org/std/ops/trait.Drop.html) can " +"specify code to run when they go out of scope:" +msgstr "" +"Les valeurs qui implémentent [`Drop`](https://doc.rust-lang.org/std/ops/trait.Drop.html) " +"peuvent spécifier le code à exécuter lorsqu'elles sortent de leur portée :" + +#: src/memory-management/drop.md +msgid "\"Dropping {}\"" +msgstr "\"Dropping {}\"" + +#: src/memory-management/drop.md src/concurrency/sync-exercises/link-checker.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"a\"" +msgstr "\"a\"" + +#: src/memory-management/drop.md src/android/testing/googletest.md +msgid "\"b\"" +msgstr "\"b\"" + +#: src/memory-management/drop.md +msgid "\"c\"" +msgstr "\"c\"" + +#: src/memory-management/drop.md +msgid "\"d\"" +msgstr "\"d\"" + +#: src/memory-management/drop.md +msgid "\"Exiting innermost block\"" +msgstr "\"Sortie du bloc imbriqué le plus profond\"" + +#: src/memory-management/drop.md +msgid "\"Exiting next block\"" +msgstr "\"Sortie du bloc suivant\"" + +#: src/memory-management/drop.md +msgid "\"Exiting main\"" +msgstr "\"Sortie du main\"" + +#: src/memory-management/drop.md +msgid "Note that `std::mem::drop` is not the same as `std::ops::Drop::drop`." +msgstr "Notez que `std::mem::drop` n'est pas la même chose que `std::ops::Drop::drop`." + +#: src/memory-management/drop.md +msgid "Values are automatically dropped when they go out of scope." +msgstr "Les valeurs sont automatiquement supprimées lorsqu'elles sortent du périmètre." + +#: src/memory-management/drop.md +msgid "" +"When a value is dropped, if it implements `std::ops::Drop` then its `Drop::drop` " +"implementation will be called." +msgstr "" +"Lorsqu'une valeur est supprimée, si elle implémente `std::ops::Drop`, alors son " +"implémentation `Drop::drop` sera appelée." + +#: src/memory-management/drop.md +msgid "All its fields will then be dropped too, whether or not it implements `Drop`." +msgstr "" +"Tous ses champs seront alors supprimés également, qu'il implémente ou non la méthode " +"`Drop`." + +#: src/memory-management/drop.md +msgid "" +"`std::mem::drop` is just an empty function that takes any value. The significance is that " +"it takes ownership of the value, so at the end of its scope it gets dropped. This makes " +"it a convenient way to explicitly drop values earlier than they would otherwise go out of " +"scope." +msgstr "" +"`std::mem::drop` est une fonction vide qui accepte n'importe quelle valeur. Son intérêt " +"réside dans le fait qu'elle prend possession de la valeur, qui est ainsi libérée à la fin " +"de sa portée. Cela permet de libérer explicitement des valeurs avant qu'elles ne sortent " +"de la portée." + +#: src/memory-management/drop.md +msgid "" +"This is useful for objects that do some work on `drop`: releasing locks, closing files, " +"etc." +msgstr "" +"Ceci est utile pour les objets qui effectuent un travail lors du `drop` : libération des " +"verrous, fermeture des fichiers, etc." + +#: src/memory-management/drop.md +msgid "Why doesn't `Drop::drop` take `self`?" +msgstr "Pourquoi `Drop::drop` ne prend-il pas `self` ?" + +#: src/memory-management/drop.md +msgid "" +"Short-answer: If it did, `std::mem::drop` would be called at the end of the block, " +"resulting in another call to `Drop::drop`, and a stack overflow!" +msgstr "" +"Réponse courte : Si c’était le cas, `std::mem::drop` serait appelé à la fin du bloc, ce " +"qui entraînerait un autre appel à `Drop::drop` et un dépassement de capacité de la pile !" + +#: src/memory-management/drop.md +msgid "Try replacing `drop(a)` with `a.drop()`." +msgstr "Essayez de remplacer `drop(a)` par `a.drop()`." + +#: src/memory-management/exercise.md +msgid "" +"In this example, we will implement a complex data type that owns all of its data. We will " +"use the \"builder pattern\" to support building a new value piece-by-piece, using " +"convenience functions." +msgstr "" +"Dans cet exemple, nous allons implémenter un type de données complexe qui gère " +"l'intégralité de ses données. Nous utiliserons le modèle de conception « Builder » pour " +"permettre la construction progressive d'une nouvelle valeur, à l'aide de fonctions " +"pratiques." + +#: src/memory-management/exercise.md +msgid "Fill in the missing pieces." +msgstr "Complétez les éléments manquants." + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "/// A representation of a software package.\n" +msgstr "/// Une représentation d'un paquet logiciel.\n" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "" +"/// Return a representation of this package as a dependency, for use in\n" +" /// building other packages.\n" +msgstr "" +"/// Retournez une représentation de ce paquet en tant que dépendance, pour\n" +" /// pour l'utiliser dans la construction d'autres paquets.\n" + +#: src/memory-management/exercise.md +msgid "\"1\"" +msgstr "\"1\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "/// A builder for a Package. Use `build()` to create the `Package` itself.\n" +msgstr "" +"/// Un constructeur pour un Paquet. Utilisez `Build()` pour créer le`n" +" /// `Package` lui-même.\n" + +#: src/memory-management/exercise.md +msgid "\"2\"" +msgstr "\"2\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "/// Set the package version.\n" +msgstr "/// Définissez la version du paquet.\n" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "/// Set the package authors.\n" +msgstr "/// Définissez les auteurs du paquet.\n" + +#: src/memory-management/exercise.md +msgid "\"3\"" +msgstr "\"3\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "/// Add an additional dependency.\n" +msgstr "/// Ajoutez une dépendance additionnelle.\n" + +#: src/memory-management/exercise.md +msgid "\"4\"" +msgstr "\"4\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "/// Set the language. If not set, language defaults to None.\n" +msgstr "" +"/// Définissez le langage. S'il n'est pas défini il est `None`\n" + " /// par défaut.\n" + +#: src/memory-management/exercise.md +msgid "\"5\"" +msgstr "\"5\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "\"base64\"" +msgstr "\"base64\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "\"0.13\"" +msgstr "\"0.13\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "\"log\"" +msgstr "\"log\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "\"0.4\"" +msgstr "\"0.4\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "\"serde\"" +msgstr "\"serde\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "\"djmitche\"" +msgstr "\"djmitche\"" + +#: src/memory-management/exercise.md src/memory-management/solution.md +msgid "\"4.0\"" +msgstr "\"4.0\"" + +#: src/memory-management/solution.md +msgid "\"0.1\"" +msgstr "\"0.1\"" + +#: src/smart-pointers.md +msgid "Box" +msgstr "Box" + +#: src/smart-pointers.md +msgid "Rc" +msgstr "Rc" + +#: src/smart-pointers/box.md +msgid "" +"[`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html) is an owned pointer to data " +"on the heap:" +msgstr "" +"[`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html) est un pointeur possédé vers " +"des données sur le tas :" + +#: src/smart-pointers/box.md +msgid "\"five: {}\"" +msgstr "\"cinq : {}\"" + +#: src/smart-pointers/box.md +msgid "" +"`Box` implements `Deref`, which means that you can [call methods from `T` " +"directly on a `Box`](https://doc.rust-lang.org/std/ops/trait.Deref.html#more-on-deref-" +"coercion)." +msgstr "" +"`Box` implémente `Deref`, ce qui signifie que vous pouvez [appeler des " +"méthodes de `T` directement sur un `Box`](https://doc.rust-lang.org/std/ops/trait." +"Deref.html#more-on-deref-coercion)." + +#: src/smart-pointers/box.md +msgid "" +"Recursive data types or data types with dynamic sizes cannot be stored inline without a " +"pointer indirection. `Box` accomplishes that indirection:" +msgstr "" +"Les types de données récursifs ou à taille dynamique ne peuvent pas être stockés " +"directement dans le code sans indirection par pointeur. `Box` assure cette indirection :" + +#: src/smart-pointers/box.md +msgid "/// A non-empty list: first element and the rest of the list.\n" +msgstr "/// Une liste non vide : premier élément et le reste de la liste.\n" + +#: src/smart-pointers/box.md +msgid "/// An empty list.\n" +msgstr "/// Une liste vide.\n" + +#: src/smart-pointers/box.md +msgid "\"{list:?}\"" +msgstr "\"{list:?}\"" + +#: src/smart-pointers/box.md +msgid "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - - . .- - - - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": list : : :\n" +": +---------+----+----+ : : +---------+----+----+ +------+----+----+ :\n" +": | Element | 1 | o--+----+-----+--->| Element | 2 | o--+--->| Nil | // | // | :\n" +": +---------+----+----+ : : +---------+----+----+ +------+----+----+ :\n" +": : : :\n" +": : : :\n" +"'- - - - - - - - - - - - - - ' '- - - - - - - - - - - - - - - - - - - - - - - - -'\n" +"```" +msgstr "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - - . .- - - - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": list : : :\n" +": +---------+----+----+ : : +---------+----+----+ +------+----+----+ :\n" +": | Element | 1 | o--+----+-----+--->| Element | 2 | o--+--->| Nil | // | // | :\n" +": +---------+----+----+ : : +---------+----+----+ +------+----+----+ :\n" +": : : :\n" +": : : :\n" +"'- - - - - - - - - - - - - - ' '- - - - - - - - - - - - - - - - - - - - - - - - -'\n" +"```" + +#: src/smart-pointers/box.md +msgid "`Box` is like `std::unique_ptr` in C++, except that it's guaranteed to be not null." +msgstr "" +"`Box` est comme `std::unique_ptr` en C++, sauf qu'il est garanti de ne pas être nul." + +#: src/smart-pointers/box.md +msgid "A `Box` can be useful when you:" +msgstr "Une `Box` peut être utile lorsque :" + +#: src/smart-pointers/box.md +msgid "" +"have a type whose size can't be known at compile time, but the Rust compiler wants to " +"know an exact size." +msgstr "" +"Vous avez un type dont la taille ne peut pas être connue au moment de la compilation, " +"mais le compilateur Rust souhaite connaître une taille exacte." + +#: src/smart-pointers/box.md +msgid "" +"want to transfer ownership of a large amount of data. To avoid copying large amounts of " +"data on the stack, instead store the data on the heap in a `Box` so only the pointer is " +"moved." +msgstr "" +"Vous souhaitez transférer la propriété d'une grande quantité de données. Pour éviter de " +"copier ces données sur la pile, stockez-les plutôt dans un objet `Box` sur le tas, de " +"sorte que seul le pointeur soit déplacé." + +#: src/smart-pointers/box.md +msgid "" +"If `Box` was not used and we attempted to embed a `List` directly into the `List`, the " +"compiler would not be able to compute a fixed size for the struct in memory (the `List` " +"would be of infinite size)." +msgstr "" +"Si `Box` n'était pas utilisé et que nous tentions d'intégrer une `List` directement dans " +"la `List`, le compilateur ne serait pas en mesure de calculer une taille fixe pour la " +"structure en mémoire (la `List` aurait une taille infinie)." + +#: src/smart-pointers/box.md +msgid "" +"`Box` solves this problem as it has the same size as a regular pointer and just points at " +"the next element of the `List` in the heap." +msgstr "" +"`Box` résout ce problème car il a la même taille qu'un pointeur classique et pointe " +"simplement vers l'élément suivant de la `List` dans le tas." + +#: src/smart-pointers/box.md +msgid "" +"Remove the `Box` in the List definition and show the compiler error. We get the message " +"\"recursive without indirection\", because for data recursion, we have to use " +"indirection, a `Box` or reference of some kind, instead of storing the value directly." +msgstr "" +"Supprimez la `Box` dans la définition de la liste et affichez l'erreur du " +"compilateur. \"Récursif avec indirection\" est un indice que vous voudrez peut-" +"être utiliser une boîte ou une référence quelconque, au lieu de stocker une " +"valeur directement." + +#: src/smart-pointers/box.md +msgid "" +"Though `Box` looks like `std::unique_ptr` in C++, it cannot be empty/null. This makes " +"`Box` one of the types that allow the compiler to optimize storage of some enums (the " +"\"niche optimization\")." +msgstr "" +"Bien que `Box` ressemble à `std::unique_ptr` en C++, il ne peut pas être vide ou nul. " +"Cela fait de `Box` l'un des types qui permettent au compilateur d'optimiser le stockage " +"de certaines énumérations (l'« optimisation de niche »)." + +#: src/smart-pointers/rc.md +msgid "" +"[`Rc`](https://doc.rust-lang.org/std/rc/struct.Rc.html) is a reference-counted shared " +"pointer. Use this when you need to refer to the same data from multiple places:" +msgstr "" +"`Rc` (https://doc.rust-lang.org/std/rc/struct.Rc.html) est un pointeur partagé à comptage " +"de références. Utilisez-le lorsque vous devez accéder aux mêmes données depuis plusieurs " +"endroits :" + +#: src/smart-pointers/rc.md +msgid "" +"Each `Rc` points to the same shared data structure, containing strong and weak pointers " +"and the value:" +msgstr "" +"Chaque `Rc` pointe vers la même structure de données partagée, contenant des pointeurs " +"forts et faibles et la valeur :" + +#: src/smart-pointers/rc.md +msgid "" +"See [`Arc`](../concurrency/shared-state/arc.md) and [`Mutex`](https://doc.rust-lang.org/" +"std/sync/struct.Mutex.html) if you are in a multi-threaded context." +msgstr "" +"Voir [`Arc`](../concurrency/shared-state/arc.md) et [`Mutex`](https://doc.rust-lang.org/" +"std/sync/struct.Mutex.html) si vous êtes dans un contexte multithread." + +#: src/smart-pointers/rc.md +msgid "" +"You can _downgrade_ a shared pointer into a [`Weak`](https://doc.rust-lang.org/std/rc/" +"struct.Weak.html) pointer to create cycles that will get dropped." +msgstr "" +"Vous pouvez _rétrograder_ un pointeur partagé en un pointeur [`Weak`](https://doc.rust-" +"lang.org/std/rc/struct.Weak.html) pour créer des cycles qui seront supprimés." + +#: src/smart-pointers/rc.md +msgid "" +"`Rc`'s count ensures that its contained value is valid for as long as there are " +"references." +msgstr "" +"Le compteur de `Rc` garantit que sa valeur contenue est valide tant qu'il existe des " +"références." + +#: src/smart-pointers/rc.md +msgid "`Rc` in Rust is like `std::shared_ptr` in C++." +msgstr "`Rc` en Rust est comme `std::shared_ptr` en C++." + +#: src/smart-pointers/rc.md +msgid "" +"`Rc::clone` is cheap: it creates a pointer to the same allocation and increases the " +"reference count. Does not make a deep clone and can generally be ignored when looking for " +"performance issues in code." +msgstr "" +"`Rc::clone` est peu coûteux : il crée un pointeur vers la même allocation et incrémente " +"le compteur de références. Il n'effectue pas de clonage profond et peut généralement être " +"ignoré lors de la recherche de problèmes de performance dans le code." + +#: src/smart-pointers/rc.md +msgid "" +"`make_mut` actually clones the inner value if necessary (\"clone-on-write\") and returns " +"a mutable reference." +msgstr "" +"`make_mut` clone effectivement la valeur interne si nécessaire (« clone-on-write ») et " +"renvoie une référence mutable." + +#: src/smart-pointers/rc.md +msgid "Use `Rc::strong_count` to check the reference count." +msgstr "Utilisez `Rc::strong_count` pour vérifier le nombre de références." + +#: src/smart-pointers/rc.md +msgid "" +"`Rc::downgrade` gives you a _weakly reference-counted_ object to create cycles that will " +"be dropped properly (likely in combination with `RefCell`)." +msgstr "" +"`Rc::downgrade` vous donne un objet à _compte de références faible_ pour créer des cycles " +"qui seront correctement supprimés (probablement en combinaison avec `RefCell`)." + +#: src/smart-pointers/trait-objects.md +msgid "" +"We previously saw how trait objects can be used with references, e.g `&dyn Pet`. However, " +"we can also use trait objects with smart pointers like `Box` to create an owned trait " +"object: `Box`." +msgstr "" +"Nous avons vu précédemment comment utiliser des objets de trait avec des références, par " +"exemple `&dyn Pet`. Cependant, nous pouvons également utiliser des objets de trait avec " +"des pointeurs intelligents comme `Box` pour créer un objet de trait possédé : `Box`." + +#: src/smart-pointers/trait-objects.md +msgid "Memory layout after allocating `pets`:" +msgstr "Disposition de la mémoire après l'allocation de `pets` :" + +#: src/smart-pointers/trait-objects.md +msgid "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": \"pets: Vec>\" : : \"data: Cat\" +----+----+----+----" +"+ :\n" +": +-----------+-------+ : : +-------+-------+ | F | i | d | o | :\n" +": | ptr | o---+-------+--. : | lives | 9 | +----+----+----+----+ :\n" +": | len | 2 | : | : +-------+-------+ ^ :\n" +": | capacity | 2 | : | : ^ | :\n" +": +-----------+-------+ : | : | '-------. :\n" +": : | : | data:\"Dog\"| :\n" +": : | : | +-------+--|-------+ :\n" +"`- - - - - - - - - - - - - - - -' | : +---|-+-----+ | name | o, 4, 4 | :\n" +" `--+-->| o o | o o-|----->| age | 5 | :\n" +" : +-|---+-|---+ +-------+----------+ :\n" +" : | | :\n" +" `- - -| - - |- - - - - - - - - - - - - - - - -'\n" +" | |\n" +" | | \"Program " +"text\"\n" +" .- - -| - - |- - - - - - - - - - - - - - - - -.\n" +" : | | vtable :\n" +" : | | +----------------------+ :\n" +" : | `----->| \"::talk\" | :\n" +" : | +----------------------+ :\n" +" : | vtable :\n" +" : | +----------------------+ :\n" +" : '----------->| \"::talk\" | :\n" +" : +----------------------+ :\n" +" : :\n" +" '- - - - - - - - - - - - - - - - - - - - - - -'\n" +"```" +msgstr "" +"```bob\n" +" Stack Heap\n" +".- - - - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": \"pets: Vec>\" : : \"data: Cat\" +----+----+----+----" +"+ :\n" +": +-----------+-------+ : : +-------+-------+ | F | i | d | o | :\n" +": | ptr | o---+-------+--. : | lives | 9 | +----+----+----+----+ :\n" +": | len | 2 | : | : +-------+-------+ ^ :\n" +": | capacity | 2 | : | : ^ | :\n" +": +-----------+-------+ : | : | '-------. :\n" +": : | : | data:\"Dog\"| :\n" +": : | : | +-------+--|-------+ :\n" +"`- - - - - - - - - - - - - - - -' | : +---|-+-----+ | name | o, 4, 4 | :\n" +" `--+-->| o o | o o-|----->| age | 5 | :\n" +" : +-|---+-|---+ +-------+----------+ :\n" +" : | | :\n" +" `- - -| - - |- - - - - - - - - - - - - - - - -'\n" +" | |\n" +" | | \"Program " +"text\"\n" +" .- - -| - - |- - - - - - - - - - - - - - - - -.\n" +" : | | vtable :\n" +" : | | +----------------------+ :\n" +" : | `----->| \"::talk\" | :\n" +" : | +----------------------+ :\n" +" : | vtable :\n" +" : | +----------------------+ :\n" +" : '----------->| \"::talk\" | :\n" +" : +----------------------+ :\n" +" : :\n" +" '- - - - - - - - - - - - - - - - - - - - - - -'\n" +"```" + +#: src/smart-pointers/trait-objects.md +msgid "" +"Types that implement a given trait may be of different sizes. This makes it impossible to " +"have things like `Vec` in the example above." +msgstr "" +"Les types qui implémentent un trait donné peuvent être de tailles différentes. Cela rend " +"impossible l'utilisation de structures comme `Vec` dans l'exemple ci-dessus." + +#: src/smart-pointers/trait-objects.md +msgid "" +"`dyn Pet` is a way to tell the compiler about a dynamically sized type that implements " +"`Pet`." +msgstr "" +"`dyn Pet` est une façon d'indiquer au compilateur un type de taille dynamique qui " +"implémente `Pet`." + +#: src/smart-pointers/trait-objects.md +msgid "" +"In the example, `pets` is allocated on the stack and the vector data is on the heap. The " +"two vector elements are _fat pointers_:" +msgstr "" +"Dans cet exemple, `pets` est alloué sur la pile et les données du vecteur sont stockées " +"dans le tas. Les deux éléments du vecteur sont des _pointeurs larges_." + +#: src/smart-pointers/trait-objects.md +msgid "" +"A fat pointer is a double-width pointer. It has two components: a pointer to the actual " +"object and a pointer to the [virtual method table](https://en.wikipedia.org/wiki/" +"Virtual_method_table) (vtable) for the `Pet` implementation of that particular object." +msgstr "" +"Un pointeur gras est un pointeur à double largeur. Il comporte deux éléments : un " +"pointeur vers l’objet lui-même et un pointeur vers la [table des méthodes virtuelles]" +"(https://en.wikipedia.org/wiki/Virtual_method_table) (vtable) de l’implémentation `Pet` " +"de cet objet." + +#: src/smart-pointers/trait-objects.md +msgid "" +"The data for the `Dog` named Fido is the `name` and `age` fields. The `Cat` has a `lives` " +"field." +msgstr "" +"Les données du chien nommé Fido correspondent aux champs « nom » et « âge ». Le chat " +"possède un champ « vies »." + +#: src/smart-pointers/trait-objects.md +msgid "Compare these outputs in the above example:" +msgstr "Comparez ces résultats dans l'exemple ci-dessus :" + +#: src/smart-pointers/trait-objects.md +msgid "\"{} {}\"" +msgstr "\"{} {}\"" + +#: src/smart-pointers/trait-objects.md src/modules/exercise.md src/modules/solution.md +#: src/android/build-rules/library.md src/android/interoperability/cpp/rust-bridge.md +#: src/concurrency/async-pitfalls/cancellation.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/crying-wolf.md +msgid "\"{}\"" +msgstr "\"{}\"" + +#: src/smart-pointers/exercise.md +msgid "" +"A binary tree is a tree-type data structure where every node has two children (left and " +"right). We will create a tree where each node stores a value. For a given node N, all " +"nodes in a N's left subtree contain smaller values, and all nodes in N's right subtree " +"will contain larger values. A given value should only be stored in the tree once, i.e. no " +"duplicate nodes." +msgstr "" +"Un arbre binaire est une structure de données arborescente où chaque nœud possède deux " +"enfants (gauche et droit). Nous allons créer un arbre où chaque nœud stocke une valeur. " +"Pour un nœud N donné, tous les nœuds de son sous-arbre gauche contiennent des valeurs " +"inférieures, et tous les nœuds de son sous-arbre droit contiennent des valeurs " +"supérieures. Une valeur donnée ne doit être stockée qu'une seule fois dans l'arbre ; il " +"ne doit donc pas y avoir de doublons." + +#: src/smart-pointers/exercise.md +msgid "Implement the following types, so that the given tests pass." +msgstr "Implémentez les types suivants afin que les tests donnés réussissent." + +#: src/smart-pointers/exercise.md src/smart-pointers/solution.md +msgid "/// A node in the binary tree.\n" +msgstr "/// Un noeud dans l'arbre binaire.\n" + +#: src/smart-pointers/exercise.md src/smart-pointers/solution.md +msgid "/// A possibly-empty subtree.\n" +msgstr "/// Un sous-arbre potentiellement vide.\n" + +#: src/smart-pointers/exercise.md src/smart-pointers/solution.md +msgid "" +"/// A container storing a set of values, using a binary tree.\n" +"///\n" +"/// If the same value is added multiple times, it is only stored once.\n" +msgstr "" +"/// Un conteneur stockant un ensemble de valeurs en utilisant un arbre binaire.\n" +"///\n" +"/// Si la même valeur est ajoutée plusieurs fois, elle n'est stockée qu'une seule fois.\n" + +#: src/smart-pointers/exercise.md +msgid "" +"// Implement `new` for `Node`.\n" +"// Implémentez `new`, `insert`, `len`, et `has` pour `Subtree`.\n" +msgstr "" +"// Implémentez `new` pour `Node`.\n" +"// Implémentez `new`, `insert`, `len`, and `has` pour `Subtree`.\n" + +#: src/smart-pointers/exercise.md src/smart-pointers/solution.md +msgid "// not a unique item\n" +msgstr "// n'est pas un item unique\n" + +#: src/welcome-day-3-afternoon.md +msgid "" +"Including 10 minute breaks, this session should take about 2 hours and 30 minutes. It " +"contains:" +msgstr "" +"En comptant les pauses de 10 minutes, cette session devrait durer environ 2 heures et 30 " +"minutes. Elle comprend :" + +#: src/borrowing.md src/unsafe-rust.md +msgid "This segment should take about 1 hour and 15 minutes. It contains:" +msgstr "Ce segment devrait durer environ 1 heure et 15 minutes. Il contient :" + +#: src/borrowing/shared.md +msgid "" +"As we saw before, instead of transferring ownership when calling a function, you can let " +"a function _borrow_ the value:" +msgstr "" +"Comme nous l'avons vu précédemment, au lieu de transférer la propriété lors de l'appel " +"d'une fonction, vous pouvez laisser une fonction _emprunter_ la valeur :" + +#: src/borrowing/shared.md +msgid "The `add` function _borrows_ two points and returns a new point." +msgstr "La fonction `add` _emprunte_ deux points et renvoie un nouveau point." + +#: src/borrowing/shared.md +msgid "The caller retains ownership of the inputs." +msgstr "L'appelant conserve la propriété des données saisies." + +#: src/borrowing/shared.md +msgid "" +"This slide is a review of the material on references from day 1, expanding slightly to " +"include function arguments and return values." +msgstr "" +"Cette diapositive reprend les notions de référence vues le premier jour, en les " +"développant légèrement pour inclure les arguments de fonction et les valeurs de retour." + +#: src/borrowing/shared.md +msgid "Notes on stack returns and inlining:" +msgstr "Remarques sur les retours de pile et l'intégration en ligne :" + +#: src/borrowing/shared.md +msgid "" +"Demonstrate that the return from `add` is cheap because the compiler can eliminate the " +"copy operation, by inlining the call to add into main. Change the above code to print " +"stack addresses and run it on the [Playground](https://play.rust-lang.org/?" +"version=stable&mode=release&edition=2024&gist=0cb13be1c05d7e3446686ad9947c4671) 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 "" +"Démontrez que le retour de `add` est peu coûteux car le compilateur peut éliminer " +"l'opération de copie en intégrant l'appel à `add` dans la fonction `main`. Modifiez le " +"code ci-dessus pour afficher les adresses de la pile et exécutez-le sur le [Playground]" +"(https://play.rust-lang.org/?" +"version=stable&mode=release&edition=2024&gist=0cb13be1c05d7e3446686ad9947c4671) ou " +"consultez le code assembleur dans [Godbolt](https://rust.godbolt.org/). Au niveau " +"d'optimisation « DEBUG », les adresses devraient changer, tandis qu'elles restent les " +"mêmes au niveau « RELEASE »." + +#: src/borrowing/shared.md +msgid "" +"The Rust compiler can do automatic inlining, that can be disabled on a function level " +"with `#[inline(never)]`." +msgstr "" +"Le compilateur Rust peut effectuer une inlining automatique, qui peut être désactivée au " +"niveau de la fonction avec `#[inline(never)]`." + +#: src/borrowing/shared.md +msgid "" +"Once disabled, the printed address will change on all optimization levels. Looking at " +"Godbolt or Playground, one can see that in this case, the return of the value depends on " +"the ABI, e.g. on amd64 the two i32 that is making up the point will be returned in 2 " +"registers (eax and edx)." +msgstr "" +"Une fois désactivée, l'adresse imprimée sera modifiée à tous les niveaux d'optimisation. " +"En consultant Godbolt ou Playground, on constate que, dans ce cas, la valeur renvoyée " +"dépend de l'ABI ; par exemple, sur amd64, les deux i32 qui composent le point seront " +"renvoyés dans deux registres (eax et edx)." + +#: src/borrowing/borrowck.md +msgid "" +"Rust's _borrow checker_ puts constraints on the ways you can borrow values. We've already " +"seen that a reference cannot _outlive_ the value it borrows:" +msgstr "" +"Le vérificateur d'emprunts de Rust impose des contraintes sur la manière d'emprunter des " +"valeurs. Nous avons déjà vu qu'une référence ne peut pas survivre à la valeur qu'elle " +"emprunte :" + +#: src/borrowing/borrowck.md +msgid "" +"There's also a second main rule that the borrow checker enforces: The _aliasing_ rule. " +"For a given value, at any time:" +msgstr "" +"Il existe également une seconde règle principale que le vérificateur d'emprunts " +"applique : la règle d'aliasing. Pour une valeur donnée, à tout moment :" + +#: src/borrowing/borrowck.md +msgid "You can have one or more shared references to the value, _or_" +msgstr "Vous pouvez avoir une ou plusieurs références partagées à la valeur, _ou_" + +#: src/borrowing/borrowck.md +msgid "You can have exactly one exclusive reference to the value." +msgstr "Vous ne pouvez avoir qu'une seule référence exclusive à cette valeur." + +#: src/borrowing/borrowck.md +msgid "" +"The \"outlives\" rule was demonstrated previously when we first looked at references. We " +"review it here to show students that the borrow checking is following a few different " +"rules to validate borrowing." +msgstr "" +"La règle de la « survie » a déjà été présentée lors de notre première analyse des " +"références. Nous la reprenons ici afin de montrer aux étudiants que la vérification des " +"emprunts suit plusieurs règles différentes pour valider ces derniers." + +#: src/borrowing/borrowck.md +msgid "" +"The above code does not compile because `a` is borrowed as mutable (through `c`) and as " +"immutable (through `b`) at the same time." +msgstr "" +"Le code ci-dessus ne compile pas car `a` est emprunté à la fois comme mutable (via `c`) " +"et comme immuable (via `b`)." + +#: src/borrowing/borrowck.md +msgid "" +"Note that the requirement is that conflicting references not _exist_ at the same point. " +"It does not matter where the reference is dereferenced. Try commenting out `*c = 20` and " +"show that the compiler error still occurs even if we never use `c`." +msgstr "" +"Notez que la condition est que les références conflictuelles ne puissent pas exister " +"simultanément. L'endroit où la référence est déréférencée est sans importance. Essayez de " +"commenter `*c = 20` et montrez que l'erreur de compilation persiste même si `c` n'est " +"jamais utilisé." + +#: src/borrowing/borrowck.md +msgid "" +"Note that the intermediate reference `c` isn't necessary to trigger a borrow conflict. " +"Replace `c` with a direct mutation of `a` and demonstrate that this produces a similar " +"error. This is because direct mutation of a value effectively creates a temporary mutable " +"reference." +msgstr "" +"Notez que la référence intermédiaire `c` n'est pas nécessaire pour déclencher un conflit " +"d'emprunt. Remplacez `c` par une mutation directe de `a` et démontrez que cela produit " +"une erreur similaire. En effet, la mutation directe d'une valeur crée de fait une " +"référence mutable temporaire." + +#: src/borrowing/borrowck.md +msgid "" +"Move the `dbg!` statement for `b` before the scope that introduces `c` to make the code " +"compile." +msgstr "" +"Déplacez l'instruction `dbg!` pour `b` avant la portée qui introduit `c` pour que le code " +"compile." + +#: src/borrowing/borrowck.md +msgid "" +"After that change, the compiler realizes that `b` is only ever used before the new " +"mutable borrow of `a` through `c`. This is a feature of the borrow checker called \"non-" +"lexical lifetimes\"." +msgstr "" +"Après cette modification, le compilateur constate que `b` n'est utilisé qu'avant le " +"nouvel emprunt mutable de `a` à `c`. Il s'agit d'une caractéristique du vérificateur " +"d'emprunts appelée « durées de vie non lexicales »." + +#: src/borrowing/borrowck.md +msgid "" +"Technically, multiple mutable references to a piece of data can exist at the same time " +"via re-borrowing. This is what allows you to pass a mutable reference into a function " +"without invalidating the original reference. [This playground example](https://play.rust-" +"lang.org/?version=stable&mode=debug&edition=2024&gist=8f5896878611566845fe3b0f4dc5af68) " +"demonstrates that behavior." +msgstr "" +"Techniquement, plusieurs références mutables à une donnée peuvent coexister grâce au " +"réemprunt. C'est ce qui permet de passer une référence mutable à une fonction sans " +"invalider la référence d'origine. Cet exemple du playground (https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=8f5896878611566845fe3b0f4dc5af68) illustre ce " +"comportement." + +#: src/borrowing/borrowck.md +msgid "" +"Rust uses the exclusive reference constraint to ensure that data races do not occur in " +"multi-threaded code, since only one thread can have mutable access to a piece of data at " +"a time." +msgstr "" +"Rust utilise la contrainte de référence exclusive pour garantir que les conflits d'accès " +"aux données ne se produisent pas dans le code multithread, car un seul thread peut avoir " +"un accès mutable à une donnée à la fois." + +#: src/borrowing/borrowck.md +msgid "" +"Rust also uses this constraint to optimize code. For example, a value behind a shared " +"reference can be safely cached in a register for the lifetime of that reference." +msgstr "" +"Rust exploite également cette contrainte pour optimiser le code. Par exemple, la valeur " +"associée à une référence partagée peut être mise en cache en toute sécurité dans un " +"registre pendant toute la durée de vie de cette référence." + +#: src/borrowing/borrowck.md +msgid "" +"Fields of a struct can be borrowed independently of each other, but calling a method on a " +"struct will borrow the whole struct, potentially invalidating references to individual " +"fields. See [this playground snippet](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=f293a31f2d4d0d31770486247c2e8437) for an " +"example of this." +msgstr "" +"Les champs d'une structure peuvent être empruntés indépendamment les uns des autres, mais " +"l'appel d'une méthode sur une structure emprunte la structure entière, ce qui peut " +"invalider les références à des champs individuels. Voir [cet extrait de code](https://" +"play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=f293a31f2d4d0d31770486247c2e8437) pour un " +"exemple." + +#: src/borrowing/examples.md +msgid "" +"As a concrete example of how these borrowing rules prevent memory errors, consider the " +"case of modifying a collection while there are references to its elements:" +msgstr "" +"Pour illustrer concrètement comment ces règles d'emprunt empêchent les erreurs de " +"mémoire, prenons le cas de la modification d'une collection alors qu'il existe des " +"références à ses éléments :" + +#: src/borrowing/examples.md +msgid "Similarly, consider the case of iterator invalidation:" +msgstr "De même, considérons le cas de l'invalidation d'un itérateur :" + +#: src/borrowing/examples.md +msgid "" +"In both of these cases, modifying the collection by pushing new elements into it can " +"potentially invalidate existing references to the collection's elements if the collection " +"has to reallocate." +msgstr "" +"Dans les deux cas, la modification de la collection par l'ajout de nouveaux éléments peut " +"potentiellement invalider les références existantes aux éléments de la collection si " +"celle-ci doit être réallouée." + +#: src/borrowing/interior-mutability.md +msgid "" +"In some situations, it's necessary to modify data behind a shared (read-only) reference. " +"For example, a shared data structure might have an internal cache, and wish to update " +"that cache from read-only methods." +msgstr "" +"Dans certains cas, il est nécessaire de modifier des données accessibles via une " +"référence partagée (en lecture seule). Par exemple, une structure de données partagée " +"peut posséder un cache interne, et il peut être souhaitable de mettre à jour ce cache à " +"partir de méthodes en lecture seule." + +#: src/borrowing/interior-mutability.md +msgid "" +"The \"interior mutability\" pattern allows exclusive (mutable) access behind a shared " +"reference. The standard library provides several ways to do this, all while still " +"ensuring safety, typically by performing a runtime check." +msgstr "" +"Le modèle de « mutabilité interne » permet un accès exclusif (modifiable) derrière une " +"référence partagée. La bibliothèque standard propose plusieurs méthodes pour y parvenir, " +"tout en garantissant la sécurité, généralement par une vérification à l'exécution." + +#: src/borrowing/interior-mutability.md +msgid "" +"The main thing to take away from this slide is that Rust provides _safe_ ways to modify " +"data behind a shared reference. There are a variety of ways to ensure that safety, and " +"the next sub-slides present a few of them." +msgstr "" +"L'essentiel à retenir de cette diapositive est que Rust offre des méthodes sûres pour " +"modifier des données accessibles via une référence partagée. Plusieurs solutions " +"permettent de garantir cette sécurité, et les diapositives suivantes en présentent " +"quelques-unes." + +#: src/borrowing/interior-mutability/cell.md +msgid "" +"`Cell` wraps a value and allows getting or setting the value using only a shared " +"reference to the `Cell`. However, it does not allow any references to the inner value. " +"Since there are no references, borrowing rules cannot be broken." +msgstr "" +"`Cell` encapsule une valeur et permet d'accéder à cette valeur ou de la modifier en " +"utilisant uniquement une référence partagée à `Cell`. Cependant, aucune référence à la " +"valeur interne n'est autorisée. En l'absence de références, les règles d'emprunt de " +"mémoire sont respectées." + +#: src/borrowing/interior-mutability/cell.md src/borrowing/interior-mutability/refcell.md +msgid "// Note that `cell` is NOT declared as mutable.\n" +msgstr "// Notez que `cell` N'EST PAS déclaré comme mutable.\n" + +#: src/borrowing/interior-mutability/cell.md +msgid "" +"`Cell` is a simple means to ensure safety: it has a `set` method that takes `&self`. This " +"needs no runtime check, but requires moving values, which can have its own cost." +msgstr "" +"`Cell` est un moyen simple de garantir la sécurité : elle possède une méthode `set` qui " +"prend `&self` en paramètre. Cela ne nécessite aucune vérification à l'exécution, mais " +"implique le déplacement de valeurs, ce qui peut engendrer un coût." + +#: src/borrowing/interior-mutability/refcell.md +msgid "" +"`RefCell` allows accessing and mutating a wrapped value by providing alternative types " +"`Ref` and `RefMut` that emulate `&T`/`&mut T` without actually being Rust references." +msgstr "" +"`RefCell` permet d'accéder à une valeur encapsulée et de la modifier en fournissant des " +"types alternatifs `Ref` et `RefMut` qui émulent `&T`/`&mut T` sans être réellement des " +"références Rust." + +#: src/borrowing/interior-mutability/refcell.md +msgid "" +"These types perform dynamic checks using a counter in the `RefCell` to prevent existence " +"of a `RefMut` alongside another `Ref`/`RefMut`." +msgstr "" +"Ces types effectuent des vérifications dynamiques à l'aide d'un compteur dans la " +"`RefCell` pour empêcher l'existence d'une `RefMut` à côté d'une autre `Ref`/`RefMut`." + +#: src/borrowing/interior-mutability/refcell.md +msgid "" +"By implementing `Deref` (and `DerefMut` for `RefMut`), these types allow calling methods " +"on the inner value without allowing references to escape." +msgstr "" +"En implémentant `Deref` (et `DerefMut` pour `RefMut`), ces types permettent d'appeler des " +"méthodes sur la valeur interne sans permettre aux références de s'échapper." + +#: src/borrowing/interior-mutability/refcell.md +msgid "" +"// This triggers an error at runtime.\n" +" // let other = cell.borrow();\n" +" // println!(\"{}\", other);\n" +msgstr "" +"// Ceci déclenche une erreur au runtime.\n" +" // let other = cell.borrow();\n" +" // println!(\"{}\", other);\n" + +#: src/borrowing/interior-mutability/refcell.md +msgid "\"{cell:?}\"" +msgstr "\"{cell:?}\"" + +#: src/borrowing/interior-mutability/refcell.md +msgid "" +"`RefCell` enforces Rust's usual borrowing rules (either multiple shared references or a " +"single exclusive reference) with a runtime check. In this case, all borrows are very " +"short and never overlap, so the checks always succeed." +msgstr "" +"`RefCell` applique les règles d'emprunt habituelles de Rust (plusieurs références " +"partagées ou une seule référence exclusive) avec une vérification à l'exécution. Dans ce " +"cas, tous les emprunts sont très courts et ne se chevauchent jamais, les vérifications " +"sont donc toujours concluantes." + +#: src/borrowing/interior-mutability/refcell.md +msgid "" +"The extra block in the example is to end the borrow created by the call to `borrow_mut` " +"before we print the cell. Trying to print a borrowed `RefCell` just shows the message " +"`\"{borrowed}\"`." +msgstr "" +"Le bloc supplémentaire dans l'exemple sert à mettre fin à l'emprunt créé par l'appel à " +"`borrow_mut` avant d'afficher la cellule. Tenter d'afficher une `RefCell` empruntée ne " +"fait qu'afficher le message « {borrowed} »." + +#: src/borrowing/interior-mutability/refcell.md +msgid "" +"There are also `OnceCell` and `OnceLock`, which allow initialization on first use. Making " +"these useful requires some more knowledge than students have at this time." +msgstr "" +"Il existe également `OnceCell` et `OnceLock`, qui permettent une initialisation lors de " +"la première utilisation. Leur utilisation optimale requiert des connaissances plus " +"approfondies que celles que possèdent actuellement les étudiants." + +#: src/borrowing/exercise.md +msgid "" +"In this exercise, you will manage a wizard's inventory using what you have learned about " +"borrowing and ownership." +msgstr "" +"Dans cet exercice, vous gérerez l'inventaire d'un magicien en utilisant ce que vous avez " +"appris sur les emprunts et la propriété." + +#: src/borrowing/exercise.md +msgid "" +"The wizard has a collection of spells. You need to implement functions to add spells to " +"the inventory and to cast spells from them." +msgstr "" +"Le magicien possède un inventaire de sorts. Vous devez implémenter des fonctions pour " +"ajouter des sorts à cet inventaire et pour les lancer." + +#: src/borrowing/exercise.md +msgid "" +"Spells have a limited number of uses. When a spell has no uses left, it must be removed " +"from the wizard's inventory." +msgstr "" +"Les sorts ont un nombre d'utilisations limité. Lorsqu'un sort n'a plus d'utilisations, il " +"doit être retiré de l'inventaire du magicien." + +#: src/borrowing/exercise.md +msgid "" +"// TODO: Implement `add_spell` to take ownership of a spell and add it to\n" +" // the wizard's inventory.\n" +msgstr "" +"// TODO : Implémentez `add_spell` pour prendre possession d'un sort et l'ajouter\n" +" // à l'inventaire du sorcier.\n" + +#: src/borrowing/exercise.md +msgid "" +"// TODO: Implement `cast_spell` to borrow a spell from the inventory and\n" +" // cast it. The wizard's mana should decrease by the spell's cost and the\n" +" // number of uses for the spell should decrease by 1.\n" +" //\n" +" // If the wizard doesn't have enough mana, the spell should fail.\n" +" // If the spell has no uses left, it is removed from the inventory.\n" +msgstr "" +"// TODO : Implémentez `cast_spell` pour emprunter un sort de l'inventaire et\n" +" // le lancer. Le mana du sorcier doit diminuer du coût du sort et le\n" +" // nombre d'utilisations du sort doit diminuer de 1.\n" +" //\n" +" // Si le sorcier n'a pas assez de mana, le sort doit échouer.\n" +" // Si le sort n'a plus d'utilisations, il est retiré de l'inventaire.\n" + +#: src/borrowing/exercise.md src/borrowing/solution.md +msgid "\"Fireball\"" +msgstr "\"Boule de feu\"" + +#: src/borrowing/exercise.md src/borrowing/solution.md +msgid "\"Ice Blast\"" +msgstr "\"Souffle glacé\"" + +#: src/borrowing/exercise.md src/borrowing/solution.md +msgid "// Casts successfully\n" +msgstr "// Sort lancé avec succès\n" + +#: src/borrowing/exercise.md src/borrowing/solution.md +msgid "// Casts successfully, then removed\n" +msgstr "// Sort lancé avec succès puis enlevé de la lite\n" + +#: src/borrowing/exercise.md src/borrowing/solution.md +msgid "// Fails (not found)\n" +msgstr "// Sort échoue (Sort non trouvé)\n" + +#: src/borrowing/exercise.md +msgid "" +"The goal of this exercise is to practice the core concepts of ownership and borrowing, " +"specifically the rule that you cannot mutate a collection while holding a reference to " +"one of its elements." +msgstr "" +"L'objectif de cet exercice est de mettre en pratique les concepts fondamentaux de " +"propriété et d'emprunt, et plus particulièrement la règle selon laquelle il est " +"impossible de modifier une collection tout en détenant une référence à l'un de ses " +"éléments." + +#: src/borrowing/exercise.md +msgid "" +"`add_spell` should take ownership of a `Spell` and move it into the `Wizard`'s inventory." +msgstr "" +"La fonction `add_spell` devrait prendre possession d'un `Spell` et le déplacer dans " +"l'inventaire du `Wizard`." + +#: src/borrowing/exercise.md +msgid "`cast_spell` is the core of the exercise. It needs to:" +msgstr "`cast_spell` est au cœur de l'exercice. Il doit :" + +#: src/borrowing/exercise.md +msgid "Find the spell (by index or by reference)." +msgstr "Trouvez le sort (par index ou par référence)." + +#: src/borrowing/exercise.md +msgid "Check mana and decrement it." +msgstr "Vérifiez le mana et décrémentez-le." + +#: src/borrowing/exercise.md +msgid "Decrement the spell's `uses`." +msgstr "Décrémentez le nombre d'utilisations du sort." + +#: src/borrowing/exercise.md +msgid "Remove the spell if `uses == 0`." +msgstr "Supprimez le sort si `uses == 0`." + +#: src/borrowing/exercise.md +msgid "" +"**Borrow Checker Conflict:** If students try to hold a reference to the spell (e.g., `let " +"spell = &mut self.spells[i]`) and then call `self.spells.remove(i)` while that reference " +"is still \"alive\" in the same scope, the borrow checker will complain. This is a great " +"opportunity to show how to structure code to satisfy the borrow checker (e.g., by using " +"indices or by ensuring the borrow ends before the mutation)." +msgstr "" +"**Conflit avec le vérificateur d'emprunts :** Si les étudiants tentent de conserver une " +"référence au sort (par exemple, `let spell = &mut self.spells[i]`) puis d'appeler `self." +"spells.remove(i)` alors que cette référence est toujours active dans la même portée, le " +"vérificateur d'emprunts générera une erreur. C'est une excellente occasion de montrer " +"comment structurer le code pour respecter les règles du vérificateur d'emprunts (par " +"exemple, en utilisant des indices ou en s'assurant que l'emprunt se termine avant la " +"mutation)." + +#: src/borrowing/solution.md +msgid "Solution: Wizard's Inventory" +msgstr "Solution : Inventaire du magicien" + +#: src/borrowing/solution.md +msgid "\"Spell {} not found!\"" +msgstr "\"Sort {} non trouvé !\"" + +#: src/borrowing/solution.md +msgid "\"Casting {}! Mana left: {}. Uses left: {}\"" +msgstr "\"Lance le sort {}! Mana restant : {}. Utilisations restantes : {}\"" + +#: src/borrowing/solution.md +msgid "\"Not enough mana to cast {}!\"" +msgstr "\"Pas assez de mana pour lancer {}!\"" + +#: src/lifetimes.md +msgid "This segment should take about 1 hour and 5 minutes. It contains:" +msgstr "Ce segment devrait durer environ 1 heure et 5 minutes. Il contient :" + +#: src/lifetimes/simple-borrows.md +msgid "Borrowing with Functions" +msgstr "Emprunts avec fonctions" + +#: src/lifetimes/simple-borrows.md +msgid "" +"As part of borrow checking, the compiler needs to reason about how borrows flow into and " +"out of functions. In the simplest case borrows last for the duration of the function call:" +msgstr "" +"Dans le cadre de la vérification des emprunts, le compilateur doit analyser la manière " +"dont les emprunts entrent et sortent des fonctions. Dans le cas le plus simple, les " +"emprunts durent le temps de l'appel de fonction." + +#: src/lifetimes/simple-borrows.md +msgid "// Borrow `val` for the function call.\n" +msgstr "// La valeur de Borrow `val` pour l'appel de la fonction.\n" + +#: src/lifetimes/simple-borrows.md +msgid "// Borrow has ended and we're free to mutate.\n" +msgstr "// L'emprunt s'est terminé et nous sommes libres de muter.\n" + +#: src/lifetimes/simple-borrows.md +msgid "" +"In this example we borrow `val` for the call to `borrows`. This would limit our ability " +"to mutate `val`, but once the function call returns the borrow has ended and we're free " +"to mutate again." +msgstr "" +"Dans cet exemple, nous empruntons `val` pour l'appel à `borrows`. Cela limite notre " +"capacité à modifier `val`, mais une fois l'appel de fonction terminé, l'emprunt prend fin " +"et nous pouvons à nouveau le modifier." + +#: src/lifetimes/returning-borrows.md +msgid "" +"But we can also have our function return a reference! This means that a borrow flows back " +"out of a function:" +msgstr "" +"Mais notre fonction peut aussi renvoyer une référence ! Cela signifie qu’un emprunt peut " +"être renvoyé par la fonction :" + +#: src/lifetimes/returning-borrows.md +msgid "// x = 5; // 🛠️❌ `x` is still borrowed!\n" +msgstr "// x = 5; // 🛠️❌ `x` est toujours emprunté !\n" + +#: src/lifetimes/returning-borrows.md +msgid "" +"Rust functions can return references, meaning that a borrow can flow back out of a " +"function." +msgstr "" +"Les fonctions Rust peuvent renvoyer des références, ce qui signifie qu'un emprunt peut " +"sortir d'une fonction." + +#: src/lifetimes/returning-borrows.md +msgid "" +"If a function returns a reference (or another kind of borrow), it was likely derived from " +"one of its arguments. This means that the return value of the function will extend the " +"borrow for one or more argument borrows." +msgstr "" +"Si une fonction renvoie une référence (ou un autre type d'emprunt), celle-ci provient " +"probablement d'un de ses arguments. Cela signifie que la valeur de retour de la fonction " +"étend l'emprunt pour un ou plusieurs arguments." + +#: src/lifetimes/returning-borrows.md +msgid "" +"This case is still fairly simple, in that only one borrow is passed into the function, so " +"the returned borrow has to be the same one." +msgstr "" +"Ce cas reste relativement simple, dans la mesure où un seul emprunt est passé à la " +"fonction, donc l'emprunt renvoyé doit être le même." + +#: src/lifetimes/multiple-borrows.md +msgid "" +"But what about when there are multiple borrows passed into a function and one being " +"returned?" +msgstr "" +"Mais que se passe-t-il lorsqu'une fonction reçoit plusieurs emprunts et qu'une seule est " +"renvoyée ?" + +#: src/lifetimes/multiple-borrows.md +msgid "\"Return either `a` or `b`\"" +msgstr "\"Retourne `a` ou `b`\"" + +#: src/lifetimes/multiple-borrows.md +msgid "" +"// Which one is still borrowed?\n" +" // Should either mutation be allowed?\n" +msgstr "" +"// Laquelle des deux valeurs est toujours empruntée ?\n" +" // Est-ce que l'une ou l'autre des mutations devrait être autorisée ?\n" + +#: src/lifetimes/multiple-borrows.md +msgid "" +"This code does not compile right now because it is missing lifetime annotations. Before " +"we get it to compile, use this opportunity to have students to think about which of our " +"argument borrows should be extended by the return value." +msgstr "" +"Ce code ne compile pas actuellement car il manque les annotations de durée de vie. Avant " +"de tenter de le compiler, profitez-en pour amener les étudiants à réfléchir aux emprunts " +"d'arguments qui devraient être étendus par la valeur de retour." + +#: src/lifetimes/multiple-borrows.md +msgid "" +"We pass two borrows into `multiple` and one is going to come back out, which means we " +"will need to extend the borrow of one of the argument lifetimes. Which one should be " +"extended? Do we need to see the body of `multiple` to figure this out?" +msgstr "" +"On passe deux emprunts à `multiple` et l'un d'eux sera réutilisé. Il faudra donc " +"prolonger la durée de vie d'un des arguments. Lequel ? Faut-il examiner le corps de " +"`multiple` pour le déterminer ?" + +#: src/lifetimes/multiple-borrows.md +msgid "" +"When borrow checking, the compiler doesn't look at the body of `multiple` to reason about " +"the borrows flowing out, instead it looks only at the signature of the function for " +"borrow analysis." +msgstr "" +"Lors de la vérification des emprunts, le compilateur n'examine pas le corps de `multiple` " +"pour déduire les emprunts sortants ; il examine uniquement la signature de la fonction " +"pour l'analyse des emprunts." + +#: src/lifetimes/multiple-borrows.md +msgid "" +"In this case there is not enough information to determine if `a` or `b` will be borrowed " +"by the returned reference. Show students the compiler errors and introduce the lifetime " +"syntax:" +msgstr "" +"Dans ce cas, les informations sont insuffisantes pour déterminer si `a` ou `b` sera " +"emprunté par la référence renvoyée. Montrez aux étudiants les erreurs du compilateur et " +"présentez-leur la syntaxe de durée de vie :" + +#: src/lifetimes/borrow-both.md +msgid "" +"In this case, we have a function where either `a` or `b` may be returned. In this case we " +"use the lifetime annotations to tell the compiler that both borrows may flow into the " +"return value." +msgstr "" +"Dans ce cas, nous avons une fonction qui peut renvoyer soit `a`, soit `b`. Nous utilisons " +"alors les annotations de durée de vie pour indiquer au compilateur que les deux emprunts " +"peuvent être inclus dans la valeur de retour." + +#: src/lifetimes/borrow-both.md +msgid "" +"// Which one is still borrowed?\n" +" // Should either mutation be allowed?\n" +" // a += 7;\n" +" // b += 7;\n" +msgstr "" +"// Laquelle de ces deux variables est toujours empruntée ?\n" +" // Est-ce qu'une de ces mutations devrait être autorisée ?\n" +" // a += 7;\n" +" // b += 7;\n" + +#: src/lifetimes/borrow-both.md +msgid "" +"The `pick` function will return either `a` or `b` depending on the value of `c`, which " +"means we can't know at compile time which one will be returned." +msgstr "" +"La fonction `pick` renverra soit `a` soit `b` selon la valeur de `c`, ce qui signifie que " +"nous ne pouvons pas savoir au moment de la compilation lequel sera renvoyé." + +#: src/lifetimes/borrow-both.md +msgid "" +"To express this to the compiler, we use the same lifetime for both `a` and `b`, along " +"with the return type. This means that the returned reference will borrow BOTH `a` and `b`!" +msgstr "" +"Pour indiquer cela au compilateur, nous utilisons la même durée de vie pour `a` et `b`, " +"ainsi que le même type de retour. Cela signifie que la référence retournée empruntera à " +"la fois `a` et `b` !" + +#: src/lifetimes/borrow-both.md +msgid "" +"Uncomment both of the commented lines and show that `r` is borrowing both `a` and `b`, " +"even though at runtime it will only point to one of them." +msgstr "" +"Décommentez les deux lignes commentées et montrez que `r` emprunte à la fois `a` et `b`, " +"même si à l'exécution il ne pointera que vers l'un d'eux." + +#: src/lifetimes/borrow-both.md +msgid "" +"Change the first argument to `pick` to show that the result is the same regardless of if " +"`a` or `b` is returned." +msgstr "" +"Modifiez le premier argument en `pick` pour montrer que le résultat est le même, que ce " +"soit `a` ou `b` qui soit renvoyé." + +#: src/lifetimes/borrow-one.md +msgid "" +"In this example `find_nearest` takes in multiple borrows but returns only one of them. " +"The lifetime annotations explicitly tie the returned borrow to the corresponding argument " +"borrow." +msgstr "" +"Dans cet exemple, `find_nearest` prend plusieurs emprunts en argument, mais n'en renvoie " +"qu'un seul. Les annotations de durée de vie lient explicitement l'emprunt renvoyé à " +"l'emprunt correspondant fourni en argument." + +#: src/lifetimes/borrow-one.md +msgid "" +"/// Searches `points` for the point closest to `query`.\n" +"/// Assumes there's at least one point in `points`.\n" +msgstr "" +"/// Recherche `points` pour le point le plus proche de `query`.\n" +"/// Suppose qu'il y a au moint un point dans `points`.\n" + +#: src/lifetimes/borrow-one.md +msgid "// query // What happens if we do this instead?\n" +msgstr "// query // Que se passe-t-il lorsque nous faisons ça à la place ?\n" + +#: src/lifetimes/borrow-one.md +msgid "// `query` isn't borrowed at this point.\n" +msgstr "// `query` n'est plus emprunté à ce stade.\n" + +#: src/lifetimes/borrow-one.md +msgid "" +"It may be helpful to collapse the definition of `find_nearest` to put more focus on the " +"signature of the function. The actual logic in the function is somewhat complex and isn't " +"important for the purpose of borrow analysis." +msgstr "" +"Il peut être utile de simplifier la définition de `find_nearest` afin de mettre davantage " +"l'accent sur la signature de la fonction. La logique interne de cette fonction est assez " +"complexe et n'est pas pertinente pour l'analyse des emprunts." + +#: src/lifetimes/borrow-one.md +msgid "" +"When we call `find_nearest` the returned reference doesn't borrow `query`, and so we are " +"free to drop it while `nearest` is still active." +msgstr "" +"Lorsque nous appelons `find_nearest`, la référence renvoyée n'emprunte pas `query`, et " +"nous sommes donc libres de la supprimer pendant que `nearest` est toujours actif." + +#: src/lifetimes/borrow-one.md +msgid "" +"But what happens if we return the wrong borrow? Change the last line of `find_nearest` to " +"return `query` instead. Show the compiler error to the students." +msgstr "" +"Mais que se passe-t-il si l'emprunt renvoyé est incorrect ? Modifiez la dernière ligne de " +"`find_nearest` pour qu'elle renvoie `query` à la place. Affichez l'erreur du compilateur " +"aux étudiants." + +#: src/lifetimes/borrow-one.md +msgid "" +"The first thing we have to do is add a lifetime annotation to `query`. Show students that " +"we can add a second lifetime `'b` to `find_nearest`." +msgstr "" +"La première étape consiste à ajouter une annotation de durée de vie à `query`. Montrez " +"aux étudiants qu'il est possible d'ajouter une seconde annotation de durée de vie `'b'` à " +"`find_nearest`." + +#: src/lifetimes/borrow-one.md +msgid "" +"Show the new error to the students. The borrow checker verifies that the logic in the " +"function body actually returns a reference with the correct lifetime, enforcing that the " +"function adheres to the contract set by the function's signature." +msgstr "" +"Affichez la nouvelle erreur aux étudiants. Le vérificateur d'emprunts s'assure que la " +"logique du corps de la fonction renvoie bien une référence avec la durée de vie correcte, " +"garantissant ainsi que la fonction respecte le contrat défini par sa signature." + +#: src/lifetimes/borrow-one.md +msgid "" +"The \"help\" message in the error notes that we can add a lifetime bound `'b: 'a` to say " +"that `'b` will live at least as long as `'a`, which would then allow us to return " +"`query`. This is an example of lifetime subtyping, which allows us to return a longer " +"lifetime where a shorter one is expected." +msgstr "" +"Le message d'aide relatif à l'erreur indique qu'il est possible d'ajouter une contrainte " +"de durée de vie `'b: 'a'` pour préciser que `'b'` aura une durée de vie au moins aussi " +"longue que `'a'`, ce qui nous permettrait alors de renvoyer `query`. Il s'agit d'un " +"exemple de sous-typage de durée de vie, qui permet de renvoyer une durée de vie plus " +"longue alors qu'une durée plus courte est attendue." + +#: src/lifetimes/borrow-one.md +msgid "" +"We can do something similar by returning a `'static` lifetime, e.g., a reference to a " +"`static` variable. The `'static` lifetime is guaranteed to be longer than any other " +"lifetime, so it's always safe to return in place of a shorter lifetime." +msgstr "" +"On peut procéder de manière similaire en renvoyant une durée de vie « statique », par " +"exemple une référence à une variable « statique ». La durée de vie « statique » est " +"garantie plus longue que toute autre durée de vie ; il est donc toujours possible de la " +"retourner sans risque à la place d'une durée de vie plus courte." + +#: src/lifetimes/lifetime-elision.md +msgid "" +"Lifetimes for function arguments and return values must be fully specified, but Rust " +"allows lifetimes to be elided in most cases with [a few simple rules](https://doc.rust-" +"lang.org/nomicon/lifetime-elision.html). This is not inference -- it is just a syntactic " +"shorthand." +msgstr "" +"La durée de vie des arguments et des valeurs de retour d'une fonction doit être " +"entièrement spécifiée, mais Rust permet de l'omettre dans la plupart des cas grâce à " +"quelques règles simples. Il ne s'agit pas d'inférence, mais d'une simple convention " +"syntaxique." + +#: src/lifetimes/lifetime-elision.md +msgid "Each argument which does not have a lifetime annotation is given one." +msgstr "Chaque argument qui ne possède pas d'annotation de durée de vie en reçoit une." + +#: src/lifetimes/lifetime-elision.md +msgid "" +"If there is only one argument lifetime, it is given to all un-annotated return values." +msgstr "" +"S'il n'existe qu'une seule durée de vie pour les arguments, elle est attribuée à toutes " +"les valeurs de retour non annotées." + +#: src/lifetimes/lifetime-elision.md +msgid "" +"If there are multiple argument lifetimes, but the first one is for `self`, that lifetime " +"is given to all un-annotated return values." +msgstr "" +"S'il existe plusieurs durées de vie d'arguments, mais que la première concerne `self`, " +"cette durée de vie est attribuée à toutes les valeurs de retour non annotées." + +#: src/lifetimes/lifetime-elision.md +msgid "" +"Walk through applying the lifetime elision rules to each of the example functions. " +"`only_args` is completed by the first rule, `identity` is completed by the second, and " +"`Foo::get` is completed by the third." +msgstr "" +"Appliquez les règles d'élision de durée de vie à chacune des fonctions d'exemple. " +"`only_args` est complétée par la première règle, `identity` par la deuxième et `Foo::get` " +"par la troisième." + +#: src/lifetimes/lifetime-elision.md +msgid "" +"If all lifetimes have not been filled in by applying the three elision rules then you " +"will get a compiler error telling you to add annotations manually." +msgstr "" +"Si toutes les durées de vie n'ont pas été renseignées en appliquant les trois règles " +"d'élision, vous obtiendrez une erreur du compilateur vous demandant d'ajouter les " +"annotations manuellement." + +#: src/lifetimes/struct-lifetimes.md +msgid "If a data type stores borrowed data, it must be annotated with a lifetime:" +msgstr "" +"Si un type de données stocke des données empruntées, il doit être annoté avec une durée " +"de vie :" + +#: src/lifetimes/struct-lifetimes.md +msgid "\"The quick brown fox jumps over the lazy dog.\"" +msgstr "\"Le renard marron rapide saute par-dessus le chien parresseux.\"" + +#: src/lifetimes/struct-lifetimes.md +msgid "// drop(doc);\n" +msgstr "// drop(doc);\n" + +#: src/lifetimes/struct-lifetimes.md +msgid "" +"In the above example, the annotation on `Highlight` enforces that the data underlying the " +"contained `&str` lives at least as long as any instance of `Highlight` that uses that " +"data. A struct cannot live longer than the data it references." +msgstr "" +"Dans l'exemple ci-dessus, l'annotation sur `Highlight` garantit que les données sous-" +"jacentes à la structure `&str` qu'elle contient ont une durée de vie au moins égale à " +"celle de toute instance de `Highlight` utilisant ces données. Une structure ne peut pas " +"survivre aux données qu'elle référence." + +#: src/lifetimes/struct-lifetimes.md +msgid "" +"If `doc` is dropped before the end of the lifetime of `noun` or `verb`, the borrow " +"checker throws an error." +msgstr "" +"Si `doc` est supprimé avant la fin de la durée de vie de `noun` ou `verb`, le " +"vérificateur d'emprunt génère une erreur." + +#: src/lifetimes/struct-lifetimes.md +msgid "" +"Types with borrowed data force users to hold on to the original data. This can be useful " +"for creating lightweight views, but it generally makes them somewhat harder to use." +msgstr "" +"Les types utilisant des données empruntées obligent les utilisateurs à conserver les " +"données originales. Cela peut s'avérer utile pour créer des vues allégées, mais les rend " +"généralement plus difficiles à utiliser." + +#: src/lifetimes/struct-lifetimes.md +msgid "When possible, make data structures own their data directly." +msgstr "" +"Dans la mesure du possible, faites en sorte que les structures de données gèrent " +"directement leurs données." + +#: src/lifetimes/struct-lifetimes.md +msgid "" +"Some structs with multiple references inside can have more than one lifetime annotation. " +"This can be necessary if there is a need to describe lifetime relationships between the " +"references themselves, in addition to the lifetime of the struct itself. Those are very " +"advanced use cases." +msgstr "" +"Certaines structures contenant plusieurs références peuvent comporter plusieurs " +"annotations de durée de vie. Cela peut s'avérer nécessaire pour décrire les relations de " +"durée de vie entre les références elles-mêmes, en plus de la durée de vie de la " +"structure. Il s'agit là de cas d'utilisation très avancés." + +#: src/lifetimes/exercise.md +msgid "" +"In this exercise, you will build a parser for the [protobuf binary encoding](https://" +"protobuf.dev/programming-guides/encoding/). Don't worry, it's simpler than it seems! This " +"illustrates a common parsing pattern, passing slices of data. The underlying data itself " +"is never copied." +msgstr "" +"Dans cet exercice, vous allez créer un analyseur syntaxique pour l'encodage binaire " +"Protobuf. Rassurez-vous, c'est plus simple qu'il n'y paraît ! Cet exemple illustre un " +"schéma d'analyse syntaxique courant, consistant à passer des tranches de données. Les " +"données elles-mêmes ne sont jamais copiées." + +#: src/lifetimes/exercise.md +msgid "" +"Fully parsing a protobuf message requires knowing the types of the fields, indexed by " +"their field numbers. That is typically provided in a `proto` file. In this exercise, " +"we'll encode that information into `match` statements in functions that get called for " +"each field." +msgstr "" +"L'analyse complète d'un message protobuf nécessite de connaître le type des champs, " +"indexés par leur numéro. Ces informations sont généralement fournies dans un fichier " +"`proto`. Dans cet exercice, nous allons encoder ces informations dans des instructions " +"`match` au sein de fonctions appelées pour chaque champ." + +#: src/lifetimes/exercise.md +msgid "We'll use the following proto:" +msgstr "Nous utiliserons le proto suivant :" + +#: src/lifetimes/exercise.md +msgid "Messages" +msgstr "Messages" + +#: src/lifetimes/exercise.md +msgid "" +"A proto message is encoded as a series of fields, one after the next. Each is implemented " +"as a \"tag\" followed by the value. The tag contains a field number (e.g., `2` for the " +"`id` field of a `Person` message) and a wire type defining how the payload should be " +"determined from the byte stream. These are combined into a single integer, as decoded in " +"`unpack_tag` below." +msgstr "" +"Un message proto est encodé sous forme d'une série de champs, les uns après les autres. " +"Chaque champ est implémenté comme une « étiquette » suivie de sa valeur. L'étiquette " +"contient un numéro de champ (par exemple, `2` pour le champ `id` d'un message `Person`) " +"et un type de transmission définissant comment la charge utile doit être déterminée à " +"partir du flux d'octets. Ces éléments sont combinés en un seul entier, comme décodé dans " +"`unpack_tag` ci-dessous." + +#: src/lifetimes/exercise.md +msgid "Varint" +msgstr "Varint" + +#: src/lifetimes/exercise.md +msgid "" +"Integers, including the tag, are represented with a variable-length encoding called " +"VARINT. Luckily, `parse_varint` is defined for you below." +msgstr "" +"Les entiers, y compris l'étiquette, sont représentés par un encodage de longueur variable " +"appelé VARINT. Heureusement, la fonction `parse_varint` est définie ci-dessous." + +#: src/lifetimes/exercise.md +msgid "Wire Types" +msgstr "Types fils" + +#: src/lifetimes/exercise.md +msgid "Proto defines several wire types, only two of which are used in this exercise." +msgstr "" +"Proto définit plusieurs types de fils, dont seulement deux sont utilisés dans cet " +"exercice." + +#: src/lifetimes/exercise.md +msgid "" +"The `Varint` wire type contains a single varint, and is used to encode proto values of " +"type `int32` such as `Person.id`." +msgstr "" +"Le type de fil `Varint` contient un seul varint et est utilisé pour encoder les valeurs " +"proto de type `int32` telles que `Person.id`." + +#: src/lifetimes/exercise.md +msgid "" +"The `Len` wire type contains a length expressed as a varint, followed by a payload of " +"that number of bytes. This is used to encode proto values of type `string` such as " +"`Person.name`. It is also used to encode proto values containing sub-messages such as " +"`Person.phones`, where the payload contains an encoding of the sub-message." +msgstr "" +"Le type de fil `Len` contient une longueur exprimée sous forme de varint, suivie d'une " +"charge utile de ce nombre d'octets. Il sert à encoder les valeurs proto de type `string` " +"telles que `Person.name`. Il est également utilisé pour encoder les valeurs proto " +"contenant des sous-messages, comme `Person.phones`, où la charge utile contient " +"l'encodage du sous-message." + +#: src/lifetimes/exercise.md +msgid "" +"The given code also defines callbacks to handle `Person` and `PhoneNumber` fields, and to " +"parse a message into a series of calls to those callbacks." +msgstr "" +"Le code fourni définit également des fonctions de rappel pour gérer les champs `Person` " +"et `PhoneNumber`, et pour analyser un message en une série d'appels à ces fonctions de " +"rappel." + +#: src/lifetimes/exercise.md +msgid "" +"What remains for you is to implement the `parse_field` function and the `ProtoMessage` " +"trait for `Person` and `PhoneNumber`." +msgstr "" +"Il vous reste à implémenter la fonction `parse_field` et le trait `ProtoMessage` pour " +"`Person` et `PhoneNumber`." + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "/// A wire type as seen on the wire.\n" +msgstr "/// Un type fil comme il apparaît à la transmission.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "/// The Varint WireType indicates the value is a single VARINT.\n" +msgstr "/// Le WireType Varint indique que la valeur est un VARINT unique.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "" +"// The I64 WireType indicates that the value is precisely 8 bytes in\n" +" // little-endian order containing a 64-bit signed integer or double type.\n" +" //I64, -- not needed for this exercise\n" +" /// The Len WireType indicates that the value is a length represented as a\n" +" /// VARINT followed by exactly that number of bytes.\n" +msgstr "" +"// Le WireType I64 indique que la valeur fait exactement 8 octets en\n" +" // ordre little-endian contenant un entier signé 64 bits ou un type double.\n" +" //I64, -- pas nécessaire pour cet exercice\n" +" /// Le WireType Len indique que la valeur est une longueur représentée sous forme de \n" +" /// VARINT suivi d'exactement cenombre d'octets.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "" +"// The I32 WireType indicates that the value is precisely 4 bytes in\n" +" // little-endian order containing a 32-bit signed integer or float type.\n" +" //I32, -- not needed for this exercise\n" +msgstr "" +"// Le WireType I32 indique que la valeur est précisément de 4 octets en\n" +" // ordre little-endian contenant un type entier ou flottant signé de 32-bits.\n" +" //I32, -- non nécessaire pour cet exercice\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "/// A field's value, typed based on the wire type.\n" +msgstr "/// Une valeur de champ type basé sur le type fil.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "//I64(i64), -- not needed for this exercise\n" +msgstr "//I64(i64), -- non nécessaire pour cet exercice\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "//I32(i32), -- not needed for this exercise\n" +msgstr "//I32(i32), -- non nécessaire pour cet exercice\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "/// A field, containing the field number and its value.\n" +msgstr "/// Un champ contenant le numéro de champ et sa valeur.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "//1 => WireType::I64, -- not needed for this exercise\n" +msgstr "//1 => WireType::I64, -- non nécessaire pour cet exercice\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "//5 => WireType::I32, -- not needed for this exercise\n" +msgstr "//5 => WireType::I32, -- non nécessaire pour cet exercice\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Invalid wire type: {value}\"" +msgstr "\"type fil invalide : {value}\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Expected string to be a `Len` field\"" +msgstr "\"La chaîne doit être un champ `Len`\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Invalid string\"" +msgstr "\"Chaîne invalide\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Expected bytes to be a `Len` field\"" +msgstr "\"Les octets attendus sont du champ `Len`\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Expected `u64` to be a `Varint` field\"" +msgstr "\"On s'attend à ce que `u64` soit un champ `Varint`\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "/// Parse a VARINT, returning the parsed value and the remaining bytes.\n" +msgstr "/// Parse un VARINT, retournant la valeur parsée et les octets restants.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Not enough bytes for varint\"" +msgstr "\"Pas assez d'octets pour varint\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "" +"// This is the last byte of the VARINT, so convert it to\n" +" // a u64 and return it.\n" +msgstr "" +"// Ceci est le dernier octet de VARINT, donc on le convertit\n" +" // en u64 et on le retourne.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "// More than 7 bytes is invalid.\n" +msgstr "// Plus de 7 octets sont invalides.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Too many bytes for varint\"" +msgstr "\"Trop d'octets pour varint\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "/// Convert a tag into a field number and a WireType.\n" +msgstr "/// On convertit un tag en un numéro de champ et un WireType.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "/// Parse a field, returning the remaining bytes\n" +msgstr "/// Parse un champ, retournant la valeur parsée et les octets restants.\n" + +#: src/lifetimes/exercise.md +msgid "\"Based on the wire type, build a Field, consuming as many bytes as necessary.\"" +msgstr "" +"\"En se basant sur le type fil on construit un Champ en consommant autant d'octets que nécessaire.\"" + + +#: src/lifetimes/exercise.md +msgid "\"Return the field, and any un-consumed bytes.\"" +msgstr "\"Retourne le champ et les octets non consommés.\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "" +"/// Parse a message in the given data, calling `T::add_field` for each field in\n" +"/// the message.\n" +"///\n" +"/// The entire input is consumed.\n" +msgstr "" +"/// Parse un message dans les données, appelle `T::add_field` sur chaque champ\n" +"/// du message.\n" +"///\n" +"/// L'entièreté de l'entrée est consommée.\n" + +#: src/lifetimes/exercise.md +msgid "// TODO: Implement ProtoMessage for Person and PhoneNumber.\n" +msgstr "// TODO: Implémentez ProtoMessage pour Person et PhoneNumber.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md src/modules/exercise.md +#: src/modules/solution.md src/testing/unit-tests.md src/testing/solution.md +msgid "\"\"" +msgstr "\"\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"beautiful name\"" +msgstr "\"magnifique nom\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"Evan\"" +msgstr "\"Evan\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"+1234-777-9090\"" +msgstr "\"+1234-777-9090\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"home\"" +msgstr "\"domicile\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "// Put that all together into a single parse.\n" +msgstr "// Mettez tout cela dans un seul parse.\n" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"maxwell\"" +msgstr "\"maxwell\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"+1202-555-1212\"" +msgstr "\"+1202-555-1212\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"+1800-867-5308\"" +msgstr "\"+1800-867-5308\"" + +#: src/lifetimes/exercise.md src/lifetimes/solution.md +msgid "\"mobile\"" +msgstr "\"mobile\"" + +#: src/lifetimes/exercise.md +msgid "" +"In this exercise there are various cases where protobuf parsing might fail, e.g. if you " +"try to parse an `i32` when there are fewer than 4 bytes left in the data buffer. In " +"normal Rust code we'd handle this with the `Result` enum, but for simplicity in this " +"exercise we panic if any errors are encountered. On day 4 we'll cover error handling in " +"Rust in more detail." +msgstr "" +"Dans cet exercice, plusieurs cas peuvent entraîner des échecs lors de l'analyse de " +"protobuf, par exemple si vous tentez d'analyser un `i32` alors qu'il reste moins de 4 " +"octets dans le tampon de données. En Rust classique, nous gérerions cela avec " +"l'énumération `Result`, mais par souci de simplicité, nous générons une exception en cas " +"d'erreur. Le quatrième jour, nous aborderons plus en détail la gestion des erreurs en " +"Rust." + +#: src/lifetimes/solution.md +msgid "// cast for simplicity\n" +msgstr "// on caste pour plus de simplicité\n" + +#: src/lifetimes/solution.md +msgid "// skip everything else\n" +msgstr "// on saute tout le reste\n" + +#: src/welcome-day-4.md +msgid "Welcome to Day 4" +msgstr "Bienvenue au Jour 4" + +#: src/welcome-day-4.md +msgid "We have mastered the core language and its unique safety model:" +msgstr "Nous maîtrisons le langage fondamental et son modèle de sécurité unique :" + +#: src/welcome-day-4.md +msgid "**Foundations & Abstraction:** Traits, generics, and the standard library." +msgstr "**Fondements et abstraction :** Traits, génériques et bibliothèque standard." + +#: src/welcome-day-4.md +msgid "**Ownership:** Move semantics and the `Drop` trait." +msgstr "**Propriété :** Sémantique de déplacement et trait `Drop`." + +#: src/welcome-day-4.md +msgid "**Memory Management:** Borrowing rules (`&` vs `&mut`) and lifetimes." +msgstr "**Gestion de la mémoire :** Règles d'emprunt (`&` vs `&mut`) et durées de vie." + +#: src/welcome-day-4.md +msgid "**Smart Pointers:** `Box`, `Rc`, and `RefCell` for complex data structures." +msgstr "" +"**Pointeurs intelligents :** `Box`, `Rc` et `RefCell` pour les structures de données " +"complexes." + +#: src/welcome-day-4.md +msgid "" +"You now understand how Rust guarantees memory safety at compile time! Today we focus on " +"applying this knowledge to build robust, large-scale applications." +msgstr "" +"Vous comprenez maintenant comment Rust garantit la sécurité de la mémoire dès la " +"compilation ! Aujourd’hui, nous allons appliquer ces connaissances pour créer des " +"applications robustes et à grande échelle." + +#: src/iterators.md +msgid "Iterator Trait" +msgstr "Trait Iterator" + +#: src/iterators.md +msgid "Iterator Helper Methods" +msgstr "Méthodes d'itération" + +#: src/iterators.md +msgid "collect" +msgstr "collect" + +#: src/iterators.md +msgid "IntoIterator" +msgstr "IntoIterator" + +#: src/iterators/motivation.md +msgid "Motivating Iterators" +msgstr "Motivating Iterators" + +#: src/iterators/motivation.md +msgid "If you want to iterate over the contents of an array, you'll need to define:" +msgstr "Si vous souhaitez parcourir le contenu d'un tableau, vous devrez définir :" + +#: src/iterators/motivation.md +msgid "Some state to keep track of where you are in the iteration process, e.g. an index." +msgstr "" +"Un état permettant de suivre votre progression dans le processus d'itération, par exemple " +"un index." + +#: src/iterators/motivation.md +msgid "A condition to determine when iteration is done." +msgstr "Une condition permettant de déterminer quand l'itération est terminée." + +#: src/iterators/motivation.md +msgid "Logic for updating the state of iteration each loop." +msgstr "Logique de mise à jour de l'état de l'itération à chaque boucle." + +#: src/iterators/motivation.md +msgid "Logic for fetching each element using that iteration state." +msgstr "Logique permettant de récupérer chaque élément en utilisant cet état d'itération." + +#: src/iterators/motivation.md +msgid "In a C-style for loop you declare these things directly:" +msgstr "Dans une boucle for de style C, vous déclarez directement ces éléments :" + +#: src/iterators/motivation.md +msgid "" +"In Rust we bundle this state and logic together into an object known as an \"iterator\"." +msgstr "" +"En Rust, nous regroupons cet état et cette logique dans un objet appelé « itérateur »." + +#: src/iterators/motivation.md +msgid "" +"This slide provides context for what Rust iterators do under the hood. We use the " +"(hopefully) familiar construct of a C-style `for` loop to show how iteration requires " +"some state and some logic, that way on the next slide we can show how an iterator bundles " +"these together." +msgstr "" +"Cette diapositive explique le fonctionnement interne des itérateurs Rust. Nous utilisons " +"la structure (normalement) familière d'une boucle `for` de style C pour montrer comment " +"l'itération nécessite un état et une logique. Ainsi, sur la diapositive suivante, nous " +"pourrons montrer comment un itérateur combine ces éléments." + +#: src/iterators/motivation.md +msgid "" +"Rust doesn't have a C-style `for` loop, but we can express the same thing with `while`:" +msgstr "" +"Rust ne possède pas de boucle `for` de style C, mais on peut exprimer la même chose avec " +"`while` :" + +#: src/iterators/motivation.md +msgid "" +"There's another way to express array iteration using `for` in C and C++: You can use a " +"pointer to the front and a pointer to the end of the array and then compare those " +"pointers to determine when the loop should end." +msgstr "" +"Il existe une autre façon d'exprimer l'itération sur un tableau à l'aide de `for` en C et " +"C++ : vous pouvez utiliser un pointeur vers le début et un pointeur vers la fin du " +"tableau, puis comparer ces pointeurs pour déterminer quand la boucle doit se terminer." + +#: src/iterators/motivation.md +msgid "" +"If students ask, you can point out that this is how Rust's slice and array iterators work " +"under the hood (though implemented as a Rust iterator)." +msgstr "" +"Si les apprenants posent la question, vous pouvez leur faire remarquer que c'est ainsi que " +"fonctionnent en interne les itérateurs de tranches et de tableaux de Rust (bien " +"qu'implémentés comme un itérateur Rust)." + +#: src/iterators/iterator.md +msgid "" +"The [`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) trait defines " +"how an object can be used to produce a sequence of values. For example, if we wanted to " +"create an iterator that can produce the elements of a slice it might look something like " +"this:" +msgstr "" +"Le trait [`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) définit " +"comment un objet peut être utilisé pour produire une séquence de valeurs. Par exemple, si " +"nous voulions créer un itérateur capable de produire les éléments d'une tranche, cela " +"pourrait ressembler à ceci :" + +#: src/iterators/iterator.md +msgid "" +"The `SliceIter` example implements the same logic as the C-style `for` loop demonstrated " +"on the last slide." +msgstr "" +"L'exemple `SliceIter` implémente la même logique que la boucle `for` de style C présentée " +"sur la diapositive précédente." + +#: src/iterators/iterator.md +msgid "" +"Point out to the students that iterators are lazy: Creating the iterator just initializes " +"the struct but does not otherwise do any work. No work happens until the `next` method is " +"called." +msgstr "" +"Expliquez aux apprenants que les itérateurs sont paresseux : la création d’un itérateur " +"initialise uniquement la structure, sans effectuer d’autre traitement. Aucun traitement " +"n’est effectué tant que la méthode `next` n’est pas appelée." + +#: src/iterators/iterator.md +msgid "" +"Iterators don't need to be finite! It's entirely valid to have an iterator that will " +"produce values forever. For example, a half open range like `0..` will keep going until " +"integer overflow occurs." +msgstr "" +"Les itérateurs n'ont pas besoin d'être finis ! Il est tout à fait possible d'avoir un " +"itérateur qui produit des valeurs indéfiniment. Par exemple, un intervalle semi-ouvert " +"comme `0..` continuera de s'exécuter jusqu'à ce qu'un dépassement de capacité se produise." + +#: src/iterators/iterator.md +msgid "" +"The \"real\" version of `SliceIter` is the [`slice::Iter`](https://doc.rust-lang.org/" +"stable/std/slice/struct.Iter.html) type in the standard library, however the real version " +"uses pointers under the hood instead of an index in order to eliminate bounds checks." +msgstr "" +"La « vraie » version de `SliceIter` est le type [`slice::Iter`](https://doc.rust-lang.org/" +"stable/std/slice/struct.Iter.html) de la bibliothèque standard, cependant la vraie " +"version utilise des pointeurs en interne au lieu d'un index afin d'éliminer les " +"vérifications de limites." + +#: src/iterators/iterator.md +msgid "" +"The `SliceIter` example is a good example of a struct that contains a reference and " +"therefore uses lifetime annotations." +msgstr "" +"L'exemple `SliceIter` est un bon exemple de structure contenant une référence et " +"utilisant donc des annotations de durée de vie." + +#: src/iterators/iterator.md +msgid "" +"You can also demonstrate adding a generic parameter to `SliceIter` to allow it to work " +"with any kind of slice (not just `&[i32]`)." +msgstr "" +"Vous pouvez également montrer comment ajouter un paramètre générique à `SliceIter` pour " +"lui permettre de fonctionner avec n'importe quel type de tranche (et pas seulement " +"`&[i32]`)." + +#: src/iterators/helpers.md +msgid "" +"In addition to the `next` method that defines how an iterator behaves, the `Iterator` " +"trait provides 70+ helper methods that can be used to build customized iterators." +msgstr "" +"En plus de la méthode `next` qui définit le comportement d'un itérateur, le trait " +"`Iterator` fournit plus de 70 méthodes d'assistance qui peuvent être utilisées pour " +"construire des itérateurs personnalisés." + +#: src/iterators/helpers.md +msgid "// Create a range from 1 to 10\n" +msgstr "// Crée un intervalle de 0 à 10\n" + +#: src/iterators/helpers.md +msgid "// Keep only even numbers\n" +msgstr "// Ne garde que les nombres pairs\n" + +#: src/iterators/helpers.md +msgid "// Square each number\n" +msgstr "// Elève chaque nombre au carré\n" + +#: src/iterators/helpers.md +msgid "// Sum up all the squared numbers\n" +msgstr "// Fait la somme des carrés\n" + +#: src/iterators/helpers.md +msgid "\"The sum of squares of even numbers from 1 to 10 is: {}\"" +msgstr "\"La somme des carrés des nombres pairs de 1 à 10 est : {}\"" + +#: src/iterators/helpers.md +msgid "" +"The `Iterator` trait implements many common functional programming operations over " +"collections (e.g. `map`, `filter`, `reduce`, etc). This is the trait where you can find " +"all the documentation about them." +msgstr "" +"Le trait `Iterator` implémente de nombreuses opérations de programmation fonctionnelle " +"courantes sur les collections (par exemple, `map`, `filter`, `reduce`, etc.). C'est dans " +"ce trait que vous trouverez toute la documentation les concernant." + +#: src/iterators/helpers.md +msgid "" +"Many of these helper methods take the original iterator and produce a new iterator with " +"different behavior. These are know as \"iterator adapter methods\"." +msgstr "" +"Bon nombre de ces méthodes auxiliaires prennent l'itérateur d'origine et produisent un " +"nouvel itérateur avec un comportement différent. On les appelle « méthodes d'adaptation " +"d'itérateur »." + +#: src/iterators/helpers.md +msgid "" +"Some methods, like `sum` and `count`, consume the iterator and pull all of the elements " +"out of it." +msgstr "" +"Certaines méthodes, comme `sum` et `count`, consomment l'itérateur et en extraient tous " +"les éléments." + +#: src/iterators/helpers.md +msgid "" +"These methods are designed to be chained together so that it's easy to build a custom " +"iterator that does exactly what you need." +msgstr "" +"Ces méthodes sont conçues pour être enchaînées afin de faciliter la création d'un " +"itérateur personnalisé qui répond exactement à vos besoins." + +#: src/iterators/helpers.md +msgid "" +"Rust's iterators are extremely efficient and highly optimizable. Even complex iterators " +"made by combining many adapter methods will still result in code as efficient as " +"equivalent imperative implementations." +msgstr "" +"Les itérateurs de Rust sont extrêmement efficaces et hautement optimisables. Même les " +"itérateurs complexes, construits en combinant de nombreuses méthodes d'adaptation, " +"produisent un code aussi efficace que les implémentations impératives équivalentes." + +#: src/iterators/collect.md +msgid "" +"The [`collect`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.collect) " +"method lets you build a collection from an [`Iterator`](https://doc.rust-lang.org/std/" +"iter/trait.Iterator.html)." +msgstr "" +"La méthode [`collect`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method." +"collect) vous permet de construire une collection à partir d'un [`Iterator`](https://doc." +"rust-lang.org/std/iter/trait.Iterator.html)." + +#: src/iterators/collect.md +msgid "\"prime_squares: {prime_squares:?}\"" +msgstr "\"prime_squares: {prime_squares:?}\"" + +#: src/iterators/collect.md +msgid "" +"Any iterator can be collected in to a `Vec`, `VecDeque`, or `HashSet`. Iterators that " +"produce key-value pairs (i.e. a two-element tuple) can also be collected into `HashMap` " +"and `BTreeMap`." +msgstr "" +"Tout itérateur peut être stocké dans un `Vec`, un `VecDeque` ou un `HashSet`. Les " +"itérateurs produisant des paires clé-valeur (c'est-à-dire un tuple à deux éléments) " +"peuvent également être stockés dans un `HashMap` ou un `BTreeMap`." + +#: src/iterators/collect.md +msgid "" +"Show the students the definition for `collect` in the standard library docs. There are " +"two ways to specify the generic type `B` for this method:" +msgstr "" +"Montrez aux étudiants la définition de `collect` dans la documentation de la bibliothèque " +"standard. Il existe deux façons de spécifier le type générique `B` pour cette méthode :" + +#: src/iterators/collect.md +msgid "" +"With the \"turbofish\": `some_iterator.collect::()`, as shown. The `_` " +"shorthand used here lets Rust infer the type of the `Vec` elements." +msgstr "" +"Avec le « turbofish » : `some_iterator.collect::()`, comme indiqué. Le " +"raccourci `_` utilisé ici permet à Rust de déduire le type des éléments `Vec`." + +#: src/iterators/collect.md +msgid "" +"With type inference: `let prime_squares: Vec<_> = some_iterator.collect()`. Rewrite the " +"example to use this form." +msgstr "" +"Avec l'inférence de type : `let prime_squares: Vec<_> = some_iterator.collect()`. " +"Réécrivez l'exemple pour utiliser cette forme." + +#: src/iterators/collect.md +msgid "" +"If students are curious about how this works, you can bring up the [`FromIterator`]" +"(https://doc.rust-lang.org/std/iter/trait.FromIterator.html) trait, which defines how " +"each type of collection gets built from an iterator." +msgstr "" +"Si les étudiants sont curieux de savoir comment cela fonctionne, vous pouvez évoquer le " +"trait [`FromIterator`](https://doc.rust-lang.org/std/iter/trait.FromIterator.html), qui " +"définit comment chaque type de collection est construit à partir d'un itérateur." + +#: src/iterators/collect.md +msgid "" +"In addition to the basic implementations of `FromIterator` for `Vec`, `HashMap`, etc., " +"there are also more specialized implementations which let you do cool things like convert " +"an `Iterator>` into a `Result, E>`." +msgstr "" +"En plus des implémentations de base de `FromIterator` pour `Vec`, `HashMap`, etc., il " +"existe également des implémentations plus spécialisées qui vous permettent de faire des " +"choses intéressantes comme convertir un `Iterator>` en un " +"`Result, E>`." + +#: src/iterators/collect.md +msgid "" +"The reason type annotations are often needed with `collect` is because it's generic over " +"its return type. This makes it harder for the compiler to infer the correct type in many " +"cases." +msgstr "" +"L'utilisation fréquente d'annotations de type avec `collect` s'explique par sa généricité " +"vis-à-vis du type de retour. Cela complique souvent la tâche du compilateur pour déduire " +"le type correct." + +#: src/iterators/intoiterator.md +msgid "" +"The `Iterator` trait tells you how to _iterate_ once you have created an iterator. The " +"related trait [`IntoIterator`](https://doc.rust-lang.org/std/iter/trait.IntoIterator." +"html) defines how to create an iterator for a type. It is used automatically by the `for` " +"loop." +msgstr "" +"Le trait `Iterator` indique comment itérer une fois l'itérateur créé. Le trait associé " +"`IntoIterator` définit comment créer un itérateur pour un type donné. Il est utilisé " +"automatiquement par la boucle `for`." + +#: src/iterators/intoiterator.md +msgid "\"point = {x}, {y}\"" +msgstr "\"point = {x}, {y}\"" + +#: src/iterators/intoiterator.md +msgid "" +"`IntoIterator` is the trait that makes for loops work. It is implemented by collection " +"types such as `Vec` and references to them such as `&Vec` and `&[T]`. Ranges also " +"implement it. This is why you can iterate over a vector with `for i in some_vec { .. }` " +"but `some_vec.next()` doesn't exist." +msgstr "" +"Le trait `IntoIterator` permet le fonctionnement des boucles `for`. Il est implémenté par " +"les types de collections tels que `Vec` et les références à ces collections comme " +"`&Vec` et `&[T]`. Les intervalles l'implémentent également. C'est pourquoi vous pouvez " +"itérer sur un vecteur avec `for i in some_vec { .. }`, mais `some_vec.next()` n'existe " +"pas." + +#: src/iterators/intoiterator.md +msgid "" +"Click through to the docs for `IntoIterator`. Every implementation of `IntoIterator` must " +"declare two types:" +msgstr "" +"Cliquez ici pour accéder à la documentation de `IntoIterator`. Chaque implémentation de " +"`IntoIterator` doit déclarer deux types :" + +#: src/iterators/intoiterator.md +msgid "`Item`: the type to iterate over, such as `i8`," +msgstr "`Item` : le type sur lequel itérer, tel que `i8`," + +#: src/iterators/intoiterator.md +msgid "`IntoIter`: the `Iterator` type returned by the `into_iter` method." +msgstr "`IntoIter` : le type `Iterator` renvoyé par la méthode `into_iter`." + +#: src/iterators/intoiterator.md +msgid "" +"Note that `IntoIter` and `Item` are linked: the iterator must have the same `Item` type, " +"which means that it returns `Option`" +msgstr "" +"Notez que `IntoIter` et `Item` sont liés : l’itérateur doit avoir le même type `Item`, ce " +"qui signifie qu’il renvoie `Option`." + +#: src/iterators/intoiterator.md +msgid "The example iterates over all combinations of x and y coordinates." +msgstr "L'exemple parcourt toutes les combinaisons de coordonnées x et y." + +#: src/iterators/intoiterator.md +msgid "" +"Try iterating over the grid twice in `main`. Why does this fail? Note that `IntoIterator::" +"into_iter` takes ownership of `self`." +msgstr "" +"Essayez d'itérer deux fois sur la grille dans `main`. Pourquoi cela échoue-t-il ? Notez " +"que `IntoIterator::into_iter` prend possession de `self`." + +#: src/iterators/intoiterator.md +msgid "" +"Fix this issue by implementing `IntoIterator` for `&Grid` and creating a `GridRefIter` " +"that iterates by reference. A version with both `GridIter` and `GridRefIter` is available " +"[in this playground](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=947e371c7295af758504f01f149023a1)." +msgstr "" +"Pour résoudre ce problème, implémentez `IntoIterator` pour `&Grid` et créez un " +"`GridRefIter` qui itère par référence. Une version incluant `GridIter` et `GridRefIter` " +"est disponible [dans cet environnement de test](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=947e371c7295af758504f01f149023a1)." + +#: src/iterators/intoiterator.md +msgid "" +"The same problem can occur for standard library types: `for e in some_vector` will take " +"ownership of `some_vector` and iterate over owned elements from that vector. Use `for e " +"in &some_vector` instead, to iterate over references to elements of `some_vector`." +msgstr "" +"Le même problème peut survenir avec les types de la bibliothèque standard : `for e in " +"some_vector` prend possession de `some_vector` et itère sur les éléments de ce vecteur. " +"Utilisez plutôt `for e in &some_vector` pour itérer sur les références aux éléments de " +"`some_vector`." + +#: src/iterators/exercise.md +msgid "" +"In this exercise, you will need to find and use some of the provided methods in the " +"[`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) trait to implement a " +"complex calculation." +msgstr "" +"Dans cet exercice, vous devrez trouver et utiliser certaines des méthodes fournies dans " +"le trait [`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) pour " +"implémenter un calcul complexe." + +#: src/iterators/exercise.md +msgid "" +"Copy the following code to and make the tests pass. Use an " +"iterator expression and `collect` the result to construct the return value." +msgstr "" +"Copiez le code suivant sur et assurez-vous que les tests " +"réussissent. Utilisez une expression d'itération et collectez le résultat pour construire " +"la valeur de retour." + +#: src/iterators/exercise.md src/iterators/solution.md +msgid "" +"/// Calculate the differences between elements of `values` offset by `offset`,\n" +"/// wrapping around from the end of `values` to the beginning.\n" +"///\n" +"/// Element `n` of the result is `values[(n+offset)%len] - values[n]`.\n" +msgstr "" +"/// Calculez les différences entre les éléments de `values` décalés de `offset`,\n" +"/// en revenant au début de `values` après la fin.\n" +"///\n" +"/// L'élément `n` du résultat est `values[(n+offset)%len] - values[n]`.\n" + +#: src/modules.md src/modules/paths.md +msgid "use, super, self" +msgstr "use, super, self" + +#: src/modules/modules.md +msgid "We have seen how `impl` blocks let us namespace functions to a type." +msgstr "" +"Nous avons vu comment les blocs `impl` nous permettent d'associer des fonctions à un type." + +#: src/modules/modules.md +msgid "Similarly, `mod` lets us namespace types and functions:" +msgstr "De même, `mod` nous permet de nommer les types et les fonctions :" + +#: src/modules/modules.md +msgid "\"In the foo module\"" +msgstr "\"Dans le module foo\"" + +#: src/modules/modules.md +msgid "\"In the bar module\"" +msgstr "\"Dans le module bar\"" + +#: src/modules/modules.md +msgid "" +"Packages provide functionality and include a `Cargo.toml` file that describes how to " +"build a bundle of 1+ crates." +msgstr "" +"Les paquets fournissent des fonctionnalités et incluent un fichier `Cargo.toml` qui " +"décrit comment construire un ensemble d'une ou plusieurs caisses." + +#: src/modules/modules.md +msgid "" +"Crates are a tree of modules, where a binary crate creates an executable and a library " +"crate compiles to a library." +msgstr "" +"Les crates sont une arborescence de modules, où une crate binaire crée un exécutable et " +"une crate de bibliothèque compile en une bibliothèque." + +#: src/modules/modules.md +msgid "Modules define organization, scope, and are the focus of this section." +msgstr "Les modules définissent l'organisation, la portée et sont au cœur de cette section." + +#: src/modules/filesystem.md +msgid "Omitting the module content will tell Rust to look for it in another file:" +msgstr "" +"Omettre le contenu du module indiquera à Rust de le rechercher dans un autre fichier :" + +#: src/modules/filesystem.md +msgid "" +"This tells Rust that the `garden` module content is found at `src/garden.rs`. Similarly, " +"a `garden::vegetables` module can be found at `src/garden/vegetables.rs`." +msgstr "" +"Cela indique à Rust que le contenu du module `garden` se trouve dans `src/garden.rs`. De " +"même, un module `garden::vegetables` se trouve dans `src/garden/vegetables.rs`." + +#: src/modules/filesystem.md +msgid "The `crate` root is in:" +msgstr "La racine `crate` se trouve dans :" + +#: src/modules/filesystem.md +msgid "`src/lib.rs` (for a library crate)" +msgstr "`src/lib.rs` (pour une bibliothèque)" + +#: src/modules/filesystem.md +msgid "`src/main.rs` (for a binary crate)" +msgstr "`src/main.rs` (pour une crate binaire)" + +#: src/modules/filesystem.md +msgid "" +"Modules defined in files can be documented, too, using \"inner doc comments\". These " +"document the item that contains them -- in this case, a module." +msgstr "" +"Les modules définis dans des fichiers peuvent également être documentés à l'aide de « " +"commentaires de documentation internes ». Ces commentaires documentent l'élément qui les " +"contient, en l'occurrence un module." + +#: src/modules/filesystem.md +msgid "" +"//! This module implements the garden, including a highly performant germination\n" +"//! implementation.\n" +msgstr "" +"//! Ce module implémente le jardin. Il inclut une implémentation performant de\n" +"//! la germination.\n" + +#: src/modules/filesystem.md +msgid "// Re-export types from this module.\n" +msgstr "// Réexporte les types de ce module.\n" + +#: src/modules/filesystem.md +msgid "/// Sow the given seed packets.\n" +msgstr "/// Sème les paquets de semence donnés.\n" + +#: src/modules/filesystem.md +msgid "/// Harvest the produce in the garden that is ready.\n" +msgstr "/// Récolte les produits qui sont prêts dans le jardin.\n" + +#: src/modules/filesystem.md +msgid "" +"Before Rust 2018, modules needed to be located at `module/mod.rs` instead of `module.rs`, " +"and this is still a working alternative for editions after 2018." +msgstr "" +"Avant Rust 2018, les modules devaient être situés dans `module/mod.rs` au lieu de `module." +"rs`, et cela reste une alternative fonctionnelle pour les éditions postérieures à 2018." + +#: src/modules/filesystem.md +msgid "" +"The main reason to introduce `filename.rs` as alternative to `filename/mod.rs` was " +"because many files named `mod.rs` can be hard to distinguish in IDEs." +msgstr "" +"La principale raison d'introduire `filename.rs` comme alternative à `filename/mod.rs` est " +"que de nombreux fichiers nommés `mod.rs` peuvent être difficiles à distinguer dans les " +"IDE." + +#: src/modules/filesystem.md +msgid "Deeper nesting can use folders, even if the main module is a file:" +msgstr "" +"Une imbrication plus profonde peut utiliser des dossiers, même si le module principal est " +"un fichier :" + +#: src/modules/filesystem.md +msgid "The place Rust will look for modules can be changed with a compiler directive:" +msgstr "" +"L'emplacement où Rust recherchera les modules peut être modifié à l'aide d'une directive " +"du compilateur :" + +#: src/modules/filesystem.md +msgid "\"some/path.rs\"" +msgstr "\"some/path.rs\"" + +#: src/modules/filesystem.md +msgid "" +"This is useful, for example, if you would like to place tests for a module in a file " +"named `some_module_test.rs`, similar to the convention in Go." +msgstr "" +"Ceci est utile, par exemple, si vous souhaitez placer les tests d'un module dans un " +"fichier nommé `some_module_test.rs`, comme le veut la convention en Go." + +#: src/modules/visibility.md +msgid "Modules are a privacy boundary:" +msgstr "Les modules constituent une frontière de confidentialité :" + +#: src/modules/visibility.md +msgid "Module items are private by default (hides implementation details)." +msgstr "" +"Les éléments du module sont privés par défaut (masquent les détails d'implémentation)." + +#: src/modules/visibility.md +msgid "Parent and sibling items are always visible." +msgstr "Les objets parents et frères et sœurs sont toujours visibles." + +#: src/modules/visibility.md +msgid "" +"In other words, if an item is visible in module `foo`, it's visible in all the " +"descendants of `foo`." +msgstr "" +"Autrement dit, si un élément est visible dans le module `foo`, il est visible dans tous " +"les descendants de `foo`." + +#: src/modules/visibility.md +msgid "\"outer::private\"" +msgstr "\"outer::private\"" + +#: src/modules/visibility.md +msgid "\"outer::public\"" +msgstr "\"outer::public\"" + +#: src/modules/visibility.md +msgid "\"outer::inner::private\"" +msgstr "\"outer::inner::private\"" + +#: src/modules/visibility.md +msgid "\"outer::inner::public\"" +msgstr "\"outer::inner::public\"" + +#: src/modules/visibility.md +msgid "Use the `pub` keyword to make modules public." +msgstr "Utilise le mot-clé `pub` pour rendre les modules publics." + +#: src/modules/visibility.md +msgid "" +"Additionally, there are advanced `pub(...)` specifiers to restrict the scope of public " +"visibility." +msgstr "" +"De plus, il existe des spécificateurs avancés `pub(...)` pour restreindre la portée de la " +"visibilité publique." + +#: src/modules/visibility.md +msgid "" +"See the [Rust Reference](https://doc.rust-lang.org/reference/visibility-and-privacy." +"html#pubin-path-pubcrate-pubsuper-and-pubself)." +msgstr "" +"Voir la [Référence Rust](https://doc.rust-lang.org/reference/visibility-and-privacy." +"html#pubin-path-pubcrate-pubsuper-and-pubself)." + +#: src/modules/visibility.md +msgid "Configuring `pub(crate)` visibility is a common pattern." +msgstr "Configurer la visibilité de `pub(crate)` est un modèle courant." + +#: src/modules/visibility.md +msgid "Less commonly, you can give visibility to a specific path." +msgstr "Plus rarement, vous pouvez rendre visible un chemin spécifique." + +#: src/modules/visibility.md +msgid "" +"In any case, visibility must be granted to an ancestor module (and all of its " +"descendants)." +msgstr "" +"Dans tous les cas, la visibilité doit être accordée à un module ancêtre (et à tous ses " +"descendants)." + +#: src/modules/encapsulation.md +msgid "Visibility and Encapsulation" +msgstr "Visibilité et encapsulation" + +#: src/modules/encapsulation.md +msgid "" +"Like with items in a module, struct fields are also private by default. Private fields " +"are likewise visible within the rest of the module (including child modules). This allows " +"us to encapsulate implementation details of struct, controlling what data and " +"functionality is visible externally." +msgstr "" +"Comme les éléments d'un module, les champs d'une structure sont privés par défaut. Ces " +"champs privés restent visibles dans le reste du module (y compris les modules enfants). " +"Cela permet d'encapsuler les détails d'implémentation de la structure et de contrôler les " +"données et fonctionnalités accessibles de l'extérieur." + +#: src/modules/encapsulation.md +msgid "\"Is {} big? {}\"" +msgstr "\"Is {} big? {}\"" + +#: src/modules/encapsulation.md +msgid "\"foo.val = {}\"" +msgstr "\"foo.val = {}\"" + +#: src/modules/encapsulation.md +msgid "// let foo = Foo { val: 42, is_big: true };\n" +msgstr "// let foo = Foo { val: 42, is_big: true };\n" + +#: src/modules/encapsulation.md +msgid "// println!(\"Is {} big? {}\", foo.val, foo.is_big);\n" +msgstr "// println!(\"Is {} big? {}\", foo.val, foo.is_big);\n" + +#: src/modules/encapsulation.md +msgid "" +"This slide demonstrates how privacy in structs is module-based. Students coming from " +"object-oriented languages may be used to types being the encapsulation boundary, so this " +"demonstrates how Rust behaves differently while showing how we can still achieve " +"encapsulation." +msgstr "" +"Cette diapositive montre comment la confidentialité dans les structures est basée sur les " +"modules. Les étudiants habitués aux langages orientés objet considèrent souvent les types " +"comme la limite d'encapsulation ; cette diapositive explique donc en quoi Rust fonctionne " +"différemment, tout en démontrant comment l'encapsulation reste possible." + +#: src/modules/encapsulation.md +msgid "" +"Note how the `is_big` field is fully controlled by `Foo`, allowing `Foo` to control how " +"it's initialized and enforce any invariants it needs to (e.g. that `is_big` is only " +"`true` if `val > 100`)." +msgstr "" +"Notez comment le champ `is_big` est entièrement contrôlé par `Foo`, permettant à `Foo` de " +"contrôler comment il est initialisé et d'appliquer tous les invariants dont il a besoin " +"(par exemple, que `is_big` n'est `true` que si `val > 100`)." + +#: src/modules/encapsulation.md +msgid "" +"Point out how helper functions can be defined in the same module (including child " +"modules) in order to get access to the type's private fields/methods." +msgstr "" +"Indiquez comment des fonctions d'assistance peuvent être définies dans le même module (y " +"compris les modules enfants) afin d'accéder aux champs/méthodes privés du type." + +#: src/modules/encapsulation.md +msgid "" +"The first commented out line demonstrates that you cannot initialize a struct with " +"private fields. The second one demonstrates that you also can't directly access private " +"fields." +msgstr "" +"La première ligne commentée montre qu'il est impossible d'initialiser une structure avec " +"des champs privés. La seconde montre qu'il est également impossible d'accéder directement " +"aux champs privés." + +#: src/modules/encapsulation.md +msgid "" +"Enums do not support privacy: Variants and data within those variants is always public." +msgstr "" +"Les énumérations ne prennent pas en charge la confidentialité : les variantes et les " +"données qu’elles contiennent sont toujours publiques." + +#: src/modules/encapsulation.md +msgid "" +"If students want more information about privacy (or lack thereof) in enums, you can bring " +"up `#[doc_hidden]` and `#[non_exhaustive]` and show how they're used to limit what can be " +"done with an enum." +msgstr "" +"Si les étudiants veulent plus d'informations sur la confidentialité (ou son absence) dans " +"les énumérations, vous pouvez évoquer `#[doc_hidden]` et `#[non_exhaustive]` et montrer " +"comment ils sont utilisés pour limiter ce qui peut être fait avec une énumération." + +#: src/modules/encapsulation.md +msgid "" +"Module privacy still applies when there are `impl` blocks in other modules [(example in " +"the playground)](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=3e61f43c88de12bcdf69c1d6df9ab3da)." +msgstr "" +"La confidentialité des modules s'applique toujours lorsqu'il y a des blocs `impl` dans " +"d'autres modules [(exemple dans le playground)](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=3e61f43c88de12bcdf69c1d6df9ab3da)." + +#: src/modules/paths.md +msgid "" +"A module can bring symbols from another module into scope with `use`. You will typically " +"see something like this at the top of each module:" +msgstr "" +"Un module peut importer des symboles d'un autre module grâce à `use`. Vous verrez " +"généralement quelque chose comme ceci en haut de chaque module :" + +#: src/modules/paths.md +msgid "Paths" +msgstr "Chemins" + +#: src/modules/paths.md +msgid "Paths are resolved as follows:" +msgstr "Les chemins sont résolus comme suit :" + +#: src/modules/paths.md +msgid "As a relative path:" +msgstr "En tant que chemin relatif :" + +#: src/modules/paths.md +msgid "`foo` or `self::foo` refers to `foo` in the current module," +msgstr "`foo` ou `self::foo` fait référence à `foo` dans le module actuel," + +#: src/modules/paths.md +msgid "`super::foo` refers to `foo` in the parent module." +msgstr "`super::foo` fait référence à `foo` dans le module parent." + +#: src/modules/paths.md +msgid "As an absolute path:" +msgstr "En tant que chemin absolu :" + +#: src/modules/paths.md +msgid "`crate::foo` refers to `foo` in the root of the current crate," +msgstr "`crate::foo` fait référence à `foo` à la racine du crate actuel," + +#: src/modules/paths.md +msgid "`bar::foo` refers to `foo` in the `bar` crate." +msgstr "`bar::foo` fait référence à `foo` dans le crate `bar`." + +#: src/modules/paths.md +msgid "" +"It is common to \"re-export\" symbols at a shorter path. For example, the top-level `lib." +"rs` in a crate might have" +msgstr "" +"Il est courant de « réexporter » les symboles à un chemin plus court. Par exemple, le " +"fichier `lib.rs` de niveau supérieur dans une crate peut contenir" + +#: src/modules/paths.md +msgid "" +"making `DiskStorage` and `NetworkStorage` available to other crates with a convenient, " +"short path." +msgstr "" +"rendre `DiskStorage` et `NetworkStorage` disponibles pour d'autres crates avec un chemin " +"court et pratique." + +#: src/modules/paths.md +msgid "" +"For the most part, only items that appear in a module need to be `use`'d. However, a " +"trait must be in scope to call any methods on that trait, even if a type implementing " +"that trait is already in scope. For example, to use the `read_to_string` method on a type " +"implementing the `Read` trait, you need to `use std::io::Read`." +msgstr "" +"En règle générale, seuls les éléments présents dans un module doivent être utilisés avec " +"`use`. Cependant, un trait doit être accessible pour pouvoir appeler ses méthodes, même " +"si un type implémentant ce trait est déjà accessible. Par exemple, pour utiliser la " +"méthode `read_to_string` sur un type implémentant le trait `Read`, il faut utiliser `use " +"std::io::Read`." + +#: src/modules/paths.md +msgid "" +"The `use` statement can have a wildcard: `use std::io::*`. This is discouraged because it " +"is not clear which items are imported, and those might change over time." +msgstr "" +"L'instruction `use` peut contenir un caractère générique : `use std::io::*`. Cette " +"pratique est déconseillée car les éléments importés ne sont pas clairement définis et " +"peuvent évoluer." + +#: src/modules/exercise.md +msgid "" +"In this exercise, you will reorganize a small GUI Library implementation. This library " +"defines a `Widget` trait and a few implementations of that trait, as well as a `main` " +"function." +msgstr "" +"Dans cet exercice, vous allez réorganiser une petite implémentation de bibliothèque " +"d'interface graphique. Cette bibliothèque définit un trait `Widget` et quelques " +"implémentations de ce trait, ainsi qu'une fonction `main`." + +#: src/modules/exercise.md +msgid "" +"It is typical to put each type or set of closely-related types into its own module, so " +"each widget type should get its own module." +msgstr "" +"Il est courant de placer chaque type ou ensemble de types étroitement liés dans son " +"propre module ; chaque type de widget devrait donc avoir son propre module." + +#: src/modules/exercise.md +msgid "Cargo Setup" +msgstr "Cargo Setup" + +#: src/modules/exercise.md +msgid "" +"The Rust playground only supports one file, so you will need to make a Cargo project on " +"your local filesystem:" +msgstr "" +"L'environnement de test Rust ne prend en charge qu'un seul fichier ; vous devrez donc " +"créer un projet Cargo sur votre système de fichiers local :" + +#: src/modules/exercise.md +msgid "" +"Edit the resulting `src/main.rs` to add `mod` statements, and add additional files in the " +"`src` directory." +msgstr "" +"Modifiez le fichier `src/main.rs` résultant pour ajouter des instructions `mod` et " +"ajoutez des fichiers supplémentaires dans le répertoire `src`." + +#: src/modules/exercise.md +msgid "Source" +msgstr "Source" + +#: src/modules/exercise.md +msgid "Here's the single-module implementation of the GUI library:" +msgstr "Voici l'implémentation à module unique de la bibliothèque d'interface graphique :" + +#: src/modules/exercise.md src/modules/solution.md +msgid "/// Natural width of `self`.\n" +msgstr "/// Largeur naturelle de `self`.\n" + +#: src/modules/exercise.md src/modules/solution.md +msgid "/// Draw the widget into a buffer.\n" +msgstr "/// Dessinez le widget dans un tampon.\n" + +#: src/modules/exercise.md src/modules/solution.md +msgid "/// Draw the widget on standard output.\n" +msgstr "/// Dessinez le widget dans la sortie standard.\n" + +#: src/modules/exercise.md src/modules/solution.md +msgid "\"{buffer}\"" +msgstr "\"{buffer}\"" + +#: src/modules/exercise.md +msgid "// Add 4 paddings for borders\n" +msgstr "// Ajoutez 4 espaces pour les bords\n" + +#: src/modules/exercise.md +msgid "" +"// TODO: Change draw_into to return Result<(), std::fmt::Error>. Then use the\n" +" // ?-operator here instead of .unwrap().\n" +msgstr "" +"// TODO: Modifiez draw_into pour retourner Result<(), std::fmt::Error>. Ensuite, \n" +" // utiliez l'opérateur ? au lieu d'`unwrap()`\n" + +#: src/modules/exercise.md src/modules/solution.md +msgid "\"+-{:-. Then use\n" +" // the ?-operator here instead of .unwrap().\n" +msgstr "" +"// TODO: aprèes avoir entendu parler de gestion d'erreur, vous pouvez\n" +" // changer draw_into pour retourner Result<(), std::fmt::Error>.\n" +" // Puis, utilisez l'opérateur ? au lieu de .unwrap().\n" + +#: src/modules/solution.md +msgid "// ---- src/main.rs ----\n" +msgstr "// ---- src/main.rs ----\n" + +#: src/testing/unit-tests.md +msgid "" +"Rust and Cargo come with a simple unit test framework. Tests are marked with `#[test]`. " +"Unit tests are often put in a nested `tests` module, using `#[cfg(test)]` to " +"conditionally compile them only when building tests." +msgstr "" +"Rust et Cargo intègrent un framework de tests unitaires simple. Les tests sont marqués " +"avec `#[test]`. Ils sont souvent placés dans un module `tests` imbriqué, et compilés " +"conditionnellement uniquement lors de la compilation des tests grâce à `#[cfg(test)]`." + +#: src/testing/unit-tests.md +msgid "\"Hello World\"" +msgstr "\"Hello World\"" + +#: src/testing/unit-tests.md +msgid "This lets you unit test private helpers." +msgstr "Cela vous permet de tester unitairement les fonctions d'assistance privées." + +#: src/testing/unit-tests.md +msgid "The `#[cfg(test)]` attribute is only active when you run `cargo test`." +msgstr "L'attribut `#[cfg(test)]` n'est actif que lorsque vous exécutez `cargo test`." + +#: src/testing/other.md +msgid "Integration Tests" +msgstr "Tests d'intégration" + +#: src/testing/other.md +msgid "If you want to test your library as a client, use an integration test." +msgstr "" +"Si vous souhaitez tester votre bibliothèque en tant que client, utilisez un test " +"d'intégration." + +#: src/testing/other.md +msgid "Create a `.rs` file under `tests/`:" +msgstr "Créez un fichier `.rs` sous `tests/` :" + +#: src/testing/other.md +msgid "// tests/my_library.rs\n" +msgstr "// tests/my_library.rs\n" + +#: src/testing/other.md +msgid "These tests only have access to the public API of your crate." +msgstr "Ces tests ont uniquement accès à l'API publique de votre crate." + +#: src/testing/other.md +msgid "Documentation Tests" +msgstr "Tests de documentation" + +#: src/testing/other.md +msgid "Rust has built-in support for documentation tests:" +msgstr "Rust intègre une prise en charge des tests de documentation :" + +#: src/testing/other.md +msgid "" +"/// Shortens a string to the given length.\n" +"///\n" +"/// ```\n" +"/// # use playground::shorten_string;\n" +"/// assert_eq!(shorten_string(\"Hello World\", 5), \"Hello\");\n" +"/// assert_eq!(shorten_string(\"Hello World\", 20), \"Hello World\");\n" +"/// ```\n" +msgstr "" +"/// Shortens a string to the given length.\n" +"///\n" +"/// ```\n" +"/// # use playground::shorten_string;\n" +"/// assert_eq!(shorten_string(\"Hello World\", 5), \"Hello\");\n" +"/// assert_eq!(shorten_string(\"Hello World\", 20), \"Hello World\");\n" +"/// ```\n" + +#: src/testing/other.md +msgid "Code blocks in `///` comments are automatically seen as Rust code." +msgstr "" +"Les blocs de code dans les commentaires `///` sont automatiquement considérés comme du " +"code Rust." + +#: src/testing/other.md +msgid "The code will be compiled and executed as part of `cargo test`." +msgstr "Le code sera compilé et exécuté dans le cadre du test `cargo`." + +#: src/testing/other.md +msgid "Adding `#` in the code will hide it from the docs, but will still compile/run it." +msgstr "" +"L'ajout de `#` dans le code le masquera dans la documentation, mais il sera tout de même " +"compilé et exécuté." + +#: src/testing/other.md +msgid "" +"Test the above code on the [Rust Playground](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=3ce2ad13ea1302f6572cb15cd96becf0)." +msgstr "" +"Testez le code ci-dessus sur le [Rust Playground](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=3ce2ad13ea1302f6572cb15cd96becf0)." + +#: src/testing/lints.md +msgid "" +"The Rust compiler produces fantastic error messages, as well as helpful built-in lints. " +"[Clippy](https://doc.rust-lang.org/clippy/) provides even more lints, organized into " +"groups that can be enabled per-project." +msgstr "" +"Le compilateur Rust génère des messages d'erreur très clairs, ainsi que des outils " +"d'analyse statique de code intégrés très utiles. Clippy offre encore plus d'outils " +"d'analyse statique, organisés en groupes activables par projet." + +#: src/testing/lints.md +msgid "\"X probably fits in a u16, right? {}\"" +msgstr "\"X probably fits in a u16, right? {}\"" + +#: src/testing/lints.md +msgid "" +"There are compiler lints visible here, but not clippy lints. Run `clippy` on the " +"playground site to show clippy warnings. Clippy has extensive documentation of its lints, " +"and adds new lints (including default-deny lints) all the time." +msgstr "" +"Des alertes du compilateur sont visibles ici, mais pas celles de Clippy. Exécutez " +"`clippy` sur le site de test pour afficher les avertissements de Clippy. Clippy possède " +"une documentation complète de ses alertes et en ajoute régulièrement de nouvelles (y " +"compris des alertes de refus par défaut)." + +#: src/testing/lints.md +msgid "" +"Note that errors or warnings with `help: ...` can be fixed with `cargo fix` or via your " +"editor." +msgstr "" +"Notez que les erreurs ou les avertissements avec `help: ...` peuvent être corrigés avec " +"`cargo fix` ou via votre éditeur." + +#: src/testing/exercise.md +msgid "" +"The [Luhn algorithm](https://en.wikipedia.org/wiki/Luhn_algorithm) is used to validate " +"credit card numbers. The algorithm takes a string as input and does the following to " +"validate the credit card number:" +msgstr "" +"L'algorithme de Luhn est utilisé pour valider les numéros de carte bancaire. Il prend une " +"chaîne de caractères en entrée et effectue les opérations suivantes pour valider le " +"numéro de carte :" + +#: src/testing/exercise.md +msgid "" +"Ignore all spaces. Reject numbers with fewer than two digits. Reject letters and other " +"non-digit characters." +msgstr "" +"Ignorer les espaces. Rejeter les nombres de moins de deux chiffres. Rejeter les lettres " +"et autres caractères non numériques." + +#: src/testing/exercise.md +msgid "" +"Moving from **right to left**, double every second digit: for the number `1234`, we " +"double `3` and `1`. For the number `98765`, we double `6` and `8`." +msgstr "" +"En partant de la **droite vers la gauche**, doublez un chiffre sur deux : pour le nombre " +"`1234`, on double `3` et `1`. Pour le nombre `98765`, on double `6` et `8`." + +#: src/testing/exercise.md +msgid "" +"After doubling a digit, sum the digits if the result is greater than 9. So doubling `7` " +"becomes `14` which becomes `1 + 4 = 5`." +msgstr "" +"Après avoir doublé un chiffre, additionnez les chiffres si le résultat est supérieur à 9. " +"Ainsi, doubler `7` devient `14` qui devient `1 + 4 = 5`." + +#: src/testing/exercise.md +msgid "Sum all the undoubled and doubled digits." +msgstr "Additionnez tous les chiffres non doublés et doublés." + +#: src/testing/exercise.md +msgid "The credit card number is valid if the sum ends with `0`." +msgstr "Le numéro de carte de crédit est valide si la somme se termine par '0'." + +#: src/testing/exercise.md +msgid "" +"The provided code provides a buggy implementation of the Luhn algorithm, along with two " +"basic unit tests that confirm that most of the algorithm is implemented correctly." +msgstr "" +"Le code fourni propose une implémentation boguée de l'algorithme de Luhn, ainsi que deux " +"tests unitaires de base qui confirment que la majeure partie de l'algorithme est " +"correctement implémentée." + +#: src/testing/exercise.md +msgid "" +"Copy the code below to and write additional tests to " +"uncover bugs in the provided implementation, fixing any bugs you find." +msgstr "" +"Copiez le code ci-dessous sur et écrivez des tests " +"supplémentaires pour déceler les bogues dans l'implémentation fournie, en corrigeant ceux " +"que vous trouvez." + +#: src/testing/exercise.md src/testing/solution.md +msgid "\"4263 9826 4026 9299\"" +msgstr "\"4263 9826 4026 9299\"" + +#: src/testing/exercise.md src/testing/solution.md +msgid "\"4539 3195 0343 6467\"" +msgstr "\"4539 3195 0343 6467\"" + +#: src/testing/exercise.md src/testing/solution.md +msgid "\"7992 7398 713\"" +msgstr "\"7992 7398 713\"" + +#: src/testing/exercise.md src/testing/solution.md +msgid "\"4223 9826 4026 9299\"" +msgstr "\"4223 9826 4026 9299\"" + +#: src/testing/exercise.md src/testing/solution.md +msgid "\"4539 3195 0343 6476\"" +msgstr "\"4539 3195 0343 6476\"" + +#: src/testing/exercise.md src/testing/solution.md +msgid "\"8273 1232 7352 0569\"" +msgstr "\"8273 1232 7352 0569\"" + +#: src/testing/solution.md +msgid "// New: accept whitespace.\n" +msgstr "// New: accepte les espaces.\n" + +#: src/testing/solution.md +msgid "// New: reject all other characters.\n" +msgstr "// New: rejète les autres caractères.\n" + +#: src/testing/solution.md +msgid "// New: check that we have at least two digits\n" +msgstr "// New: vérifiez qu'il y a au moin deux chiffres\n" + +#: src/testing/solution.md +msgid "\"foo 0 0\"" +msgstr "\"foo 0 0\"" + +#: src/testing/solution.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +msgid "\" \"" +msgstr "\" \"" + +#: src/testing/solution.md +msgid "\" \"" +msgstr "\" \"" + +#: src/testing/solution.md +msgid "\" \"" +msgstr "\" \"" + +#: src/testing/solution.md +msgid "\"0\"" +msgstr "\"0\"" + +#: src/testing/solution.md +msgid "\" 0 0 \"" +msgstr "\" 0 0 \"" + +#: src/error-handling.md +msgid "Error Trait" +msgstr "Trait Error" + +#: src/error-handling.md +msgid "thiserror" +msgstr "thiserror" + +#: src/error-handling.md +msgid "anyhow" +msgstr "anyhow" + +#: src/error-handling.md src/error-handling/exercise.md +msgid "Exercise: Rewriting with Result" +msgstr "Exercice : Réécriture avec Result" + +#: src/error-handling/panics.md +msgid "In case of a fatal runtime error, Rust triggers a \"panic\":" +msgstr "En cas d'erreur d'exécution fatale, Rust déclenche une \"panique\" :" + +#: src/error-handling/panics.md +msgid "Panics are for unrecoverable and unexpected errors." +msgstr "Les alertes paniques sont réservées aux erreurs irrécupérables et inattendues." + +#: src/error-handling/panics.md +msgid "Panics are symptoms of bugs in the program." +msgstr "Les plantages sont des symptômes de bogues dans le programme." + +#: src/error-handling/panics.md +msgid "Runtime failures like failed bounds checks can panic." +msgstr "" +"Les erreurs d'exécution, comme les échecs de vérification des limites, peuvent provoquer " +"une panique." + +#: src/error-handling/panics.md +msgid "Assertions (such as `assert!`) panic on failure." +msgstr "Les assertions (telles que `assert!`) provoquent une panique en cas d'échec." + +#: src/error-handling/panics.md +msgid "Purpose-specific panics can use the `panic!` macro." +msgstr "Les paniques spécifiques à un objectif peuvent utiliser la macro `panic!`." + +#: src/error-handling/panics.md +msgid "" +"A panic will \"unwind\" the stack, dropping values just as if the functions had returned." +msgstr "" +"Une panique va « dérouler » la pile, en supprimant les valeurs comme si les fonctions " +"avaient renvoyé une valeur." + +#: src/error-handling/panics.md +msgid "Use non-panicking APIs (such as `Vec::get`) if crashing is not acceptable." +msgstr "" +"Utilisez des API qui ne provoquent pas de plantage (telles que `Vec::get`) si un plantage " +"n'est pas acceptable." + +#: src/error-handling/panics.md +msgid "By default, a panic will cause the stack to unwind. The unwinding can be caught:" +msgstr "" +"Par défaut, une panique entraîne le déroulement de la pile. Ce déroulement peut être " +"intercepté :" + +#: src/error-handling/panics.md +msgid "\"No problem here!\"" +msgstr "\"Pas de problèmeci !\"" + +#: src/error-handling/panics.md +msgid "\"oh no!\"" +msgstr "\"oh non!\"" + +#: src/error-handling/panics.md +msgid "Catching is unusual; do not attempt to implement exceptions with `catch_unwind`!" +msgstr "" +"La capture est inhabituelle ; n'essayez pas d'implémenter des exceptions avec " +"`catch_unwind` !" + +#: src/error-handling/panics.md +msgid "" +"This can be useful in servers which should keep running even if a single request crashes." +msgstr "" +"Cela peut s'avérer utile pour les serveurs qui doivent continuer à fonctionner même en " +"cas de plantage d'une seule requête." + +#: src/error-handling/panics.md +msgid "This does not work if `panic = 'abort'` is set in your `Cargo.toml`." +msgstr "Cela ne fonctionne pas si `panic = 'abort'` est défini dans votre `Cargo.toml`." + +#: src/error-handling/result.md +msgid "" +"Our primary mechanism for error handling in Rust is the [`Result`](https://doc.rust-lang." +"org/stable/std/result/enum.Result.html) enum, which we briefly saw when discussing " +"standard library types." +msgstr "" +"Notre principal mécanisme de gestion des erreurs en Rust est l'énumération [`Result`]" +"(https://doc.rust-lang.org/stable/std/result/enum.Result.html), que nous avons brièvement " +"vue lors de la discussion sur les types de la bibliothèque standard." + +#: src/error-handling/result.md +msgid "" +"`Result` has two variants: `Ok` which contains the success value, and `Err` which " +"contains an error value of some kind." +msgstr "" +"`Result` a deux variantes : `Ok` qui contient la valeur de succès et `Err` qui contient " +"une valeur d’erreur quelconque." + +#: src/error-handling/result.md +msgid "" +"Whether or not a function can produce an error is encoded in the function's type " +"signature by having the function return a `Result` value." +msgstr "" +"Le fait qu'une fonction puisse ou non produire une erreur est codé dans sa signature de " +"type en faisant en sorte que la fonction renvoie une valeur `Result`." + +#: src/error-handling/result.md +msgid "" +"Like with `Option`, there is no way to forget to handle an error: You cannot access " +"either the success value or the error value without first pattern matching on the " +"`Result` to check which variant you have. Methods like `unwrap` make it easier to write " +"quick-and-dirty code that doesn't do robust error handling, but means that you can always " +"see in your source code where proper error handling is being skipped." +msgstr "" +"Comme pour `Option`, il est impossible d'oublier de gérer une erreur : vous ne pouvez " +"accéder ni à la valeur de succès ni à celle d'erreur sans avoir préalablement effectué " +"une correspondance de motifs sur `Result` afin de déterminer la variante rencontrée. Des " +"méthodes comme `unwrap` facilitent l'écriture de code rapide et imparfait qui ne gère pas " +"les erreurs de manière robuste, mais permettent de toujours repérer dans votre code " +"source les cas où une gestion d'erreurs appropriée est omise." + +#: src/error-handling/result.md +msgid "" +"It may be helpful to compare error handling in Rust to error handling conventions that " +"students may be familiar with from other programming languages." +msgstr "" +"Il peut être utile de comparer la gestion des erreurs en Rust aux conventions de gestion " +"des erreurs que les étudiants connaissent peut-être grâce à d'autres langages de " +"programmation." + +#: src/error-handling/result.md +msgid "Many languages use exceptions, e.g. C++, Java, Python." +msgstr "De nombreux langages utilisent des exceptions, par exemple C++, Java, Python." + +#: src/error-handling/result.md +msgid "" +"In most languages with exceptions, whether or not a function can throw an exception is " +"not visible as part of its type signature. This generally means that you can't tell when " +"calling a function if it may throw an exception or not." +msgstr "" +"Dans la plupart des langages gérant les exceptions, la capacité d'une fonction à lever " +"une exception n'est pas indiquée dans sa signature de type. Cela signifie généralement " +"qu'il est impossible de savoir, lors de l'appel d'une fonction, si elle est susceptible " +"de lever une exception." + +#: src/error-handling/result.md +msgid "" +"Exceptions generally unwind the call stack, propagating upward until a `try` block is " +"reached. An error originating deep in the call stack may impact an unrelated function " +"further up." +msgstr "" +"Les exceptions déroulent généralement la pile d'appels, se propageant vers le haut " +"jusqu'à atteindre un bloc `try`. Une erreur survenant profondément dans la pile d'appels " +"peut affecter une fonction sans lien avec la précédente, située plus haut dans la pile." + +#: src/error-handling/result.md +msgid "Error Numbers" +msgstr "Numéros d'erreur" + +#: src/error-handling/result.md +msgid "" +"Some languages have functions return an error number (or some other error value) " +"separately from the successful return value of the function. Examples include C and Go." +msgstr "" +"Certains langages font en sorte que les fonctions renvoient un numéro d'erreur (ou une " +"autre valeur d'erreur) séparément de la valeur de retour en cas de succès. C et Go en " +"sont des exemples." + +#: src/error-handling/result.md +msgid "" +"Depending on the language it may be possible to forget to check the error value, in which " +"case you may be accessing an uninitialized or otherwise invalid success value." +msgstr "" +"Selon la langue, il est possible d'oublier de vérifier la valeur d'erreur, auquel cas " +"vous risquez d'accéder à une valeur de succès non initialisée ou invalide." + +#: src/error-handling/try.md +msgid "" +"Runtime errors like connection-refused or file-not-found are handled with the `Result` " +"type, but matching this type on every call can be cumbersome. The try-operator `?` is " +"used to return errors to the caller. It lets you turn the common" +msgstr "" +"Les erreurs d'exécution telles que « connexion refusée » ou « fichier introuvable » sont " +"gérées avec le type `Result`, mais vérifier ce type à chaque appel peut s'avérer " +"fastidieux. L'opérateur try `?` permet de renvoyer les erreurs à l'appelant. Il permet de " +"transformer le comportement courant" + +#: src/error-handling/try.md +msgid "into the much simpler" +msgstr "plus simplement" + +#: src/error-handling/try.md +msgid "We can use this to simplify our error handling code:" +msgstr "Nous pouvons utiliser cela pour simplifier notre code de gestion des erreurs :" + +#: src/error-handling/try.md +msgid "//fs::write(\"config.dat\", \"alice\").unwrap();\n" +msgstr "//fs::write(\"config.dat\", \"alice\").unwrap();\n" + +#: src/error-handling/try.md src/error-handling/try-conversions.md +#: src/error-handling/thiserror.md src/error-handling/anyhow.md +msgid "\"config.dat\"" +msgstr "\"config.dat\"" + +#: src/error-handling/try.md src/error-handling/try-conversions.md +msgid "\"username or error: {username:?}\"" +msgstr "\"username ou erreur : {username:?}\"" + +#: src/error-handling/try.md +msgid "Simplify the `read_username` function to use `?`." +msgstr "Simplifiez la fonction `read_username` pour utiliser `?`." + +#: src/error-handling/try.md +msgid "The `username` variable can be either `Ok(string)` or `Err(error)`." +msgstr "La variable `username` peut être soit `Ok(string)` soit `Err(error)`." + +#: src/error-handling/try.md +msgid "" +"Use the `fs::write` call to test out the different scenarios: no file, empty file, file " +"with username." +msgstr "" +"Utilisez l'appel `fs::write` pour tester les différents scénarios : aucun fichier, " +"fichier vide, fichier avec nom d'utilisateur." + +#: src/error-handling/try.md +msgid "" +"Note that `main` can return a `Result<(), E>` as long as it implements `std::process::" +"Termination`. In practice, this means that `E` implements `Debug`. The executable will " +"print the `Err` variant and return a nonzero exit status on error." +msgstr "" +"Notez que `main` peut retourner un `Result<(), E>` à condition qu'il implémente `std::" +"process::Termination`. En pratique, cela signifie que `E` implémente `Debug`. " +"L'exécutable affichera la variante `Err` et retournera un code de sortie différent de " +"zéro en cas d'erreur." + +#: src/error-handling/try-conversions.md +msgid "" +"The effective expansion of `?` is a little more complicated than previously indicated:" +msgstr "" +"Le développement effectif de `?` est un peu plus compliqué que ce qui a été indiqué " +"précédemment :" + +#: src/error-handling/try-conversions.md +msgid "works the same as" +msgstr "fonctionne de la même manière que" + +#: src/error-handling/try-conversions.md +msgid "" +"The `From::from` call here means we attempt to convert the error type to the type " +"returned by the function. This makes it easy to encapsulate errors into higher-level " +"errors." +msgstr "" +"L'appel `From::from` ici signifie que nous tentons de convertir le type d'erreur vers le " +"type renvoyé par la fonction. Cela facilite l'encapsulation des erreurs dans des erreurs " +"de plus haut niveau." + +#: src/error-handling/try-conversions.md +msgid "\"I/O error: {e}\"" +msgstr "\"Erreur I/O : {e}\"" + +#: src/error-handling/try-conversions.md +msgid "\"Found no username in {path}\"" +msgstr "\"Aucun username trouvé dans {path}\"" + +#: src/error-handling/try-conversions.md +msgid "//std::fs::write(\"config.dat\", \"\").unwrap();\n" +msgstr "//std::fs::write(\"config.dat\", \"\").unwrap();\n" + +#: src/error-handling/try-conversions.md +msgid "" +"The `?` operator must return a value compatible with the return type of the function. For " +"`Result`, it means that the error types have to be compatible. A function that returns " +"`Result` can only use `?` on a value of type `Result` if " +"`ErrorOuter` and `ErrorInner` are the same type or if `ErrorOuter` implements " +"`From`." +msgstr "" +"L'opérateur `?` doit renvoyer une valeur compatible avec le type de retour de la " +"fonction. Pour `Result`, cela signifie que les types d'erreur doivent être compatibles. " +"Une fonction qui renvoie `Result` ne peut utiliser `?` sur une valeur de " +"type `Result` que si `ErrorOuter` et `ErrorInner` sont du même type ou si " +"`ErrorOuter` implémente `From`." + +#: src/error-handling/try-conversions.md +msgid "" +"A common alternative to a `From` implementation is `Result::map_err`, especially when the " +"conversion only happens in one place." +msgstr "" +"Une alternative courante à une implémentation `From` est `Result::map_err`, en " +"particulier lorsque la conversion n'a lieu qu'à un seul endroit." + +#: src/error-handling/try-conversions.md +msgid "" +"There is no compatibility requirement for `Option`. A function returning `Option` can " +"use the `?` operator on `Option` for arbitrary `T` and `U` types." +msgstr "" +"Il n'existe aucune exigence de compatibilité pour `Option`. Une fonction renvoyant " +"`Option` peut utiliser l'opérateur `?` sur `Option` pour des types `T` et `U` " +"arbitraires." + +#: src/error-handling/try-conversions.md +msgid "" +"A function that returns `Result` cannot use `?` on `Option` and vice versa. However, " +"`Option::ok_or` converts `Option` to `Result` whereas `Result::ok` turns `Result` into " +"`Option`." +msgstr "" +"Une fonction qui renvoie `Result` ne peut pas utiliser `?` sur `Option` et inversement. " +"Cependant, `Option::ok_or` convertit `Option` en `Result` tandis que `Result::ok` " +"transforme `Result` en `Option`." + +#: src/error-handling/error.md +msgid "Dynamic Error Types" +msgstr "Types d'erreurs dynamiques" + +#: src/error-handling/error.md +msgid "" +"Sometimes we want to allow any type of error to be returned without writing our own enum " +"covering all the different possibilities. The `std::error::Error` trait makes it easy to " +"create a trait object that can contain any error." +msgstr "" +"Parfois, nous souhaitons autoriser le retour de tout type d'erreur sans avoir à créer " +"notre propre énumération couvrant toutes les possibilités. Le trait `std::error::Error` " +"simplifie la création d'un objet trait pouvant contenir n'importe quelle erreur." + +#: src/error-handling/error.md +msgid "\"count.dat\"" +msgstr "\"count.dat\"" + +#: src/error-handling/error.md +msgid "\"1i3\"" +msgstr "\"1i3\"" + +#: src/error-handling/error.md +msgid "\"Count: {count}\"" +msgstr "\"Count: {count}\"" + +#: src/error-handling/error.md +msgid "\"Error: {err}\"" +msgstr "\"Error: {err}\"" + +#: src/error-handling/error.md +msgid "" +"The `read_count` function can return `std::io::Error` (from file operations) or `std::" +"num::ParseIntError` (from `String::parse`)." +msgstr "" +"La fonction `read_count` peut renvoyer `std::io::Error` (à partir d'opérations sur les " +"fichiers) ou `std::num::ParseIntError` (à partir de `String::parse`)." + +#: src/error-handling/error.md +msgid "" +"Boxing errors saves on code, but gives up the ability to cleanly handle different error " +"cases differently in the program. As such it's generally not a good idea to use `Box` in the public API of a library, but it can be a good option in a program where " +"you just want to display the error message somewhere." +msgstr "" +"L'encapsulation des erreurs permet de gagner du code, mais empêche de gérer proprement " +"différents cas d'erreur dans le programme. Par conséquent, il est généralement " +"déconseillé d'utiliser `Box` dans l'API publique d'une bibliothèque, mais cela " +"peut s'avérer utile dans un programme où l'on souhaite simplement afficher le message " +"d'erreur." + +#: src/error-handling/error.md +msgid "" +"Make sure to implement the `std::error::Error` trait when defining a custom error type so " +"it can be boxed." +msgstr "" +"Veillez à implémenter le trait `std::error::Error` lors de la définition d'un type " +"d'erreur personnalisé afin qu'il puisse être encapsulé." + +#: src/error-handling/thiserror.md +msgid "" +"The [`thiserror`](https://docs.rs/thiserror/) crate provides macros to help avoid " +"boilerplate when defining error types. It provides derive macros that assist in " +"implementing `From`, `Display`, and the `Error` trait." +msgstr "" +"La bibliothèque [`thiserror`](https://docs.rs/thiserror/) fournit des macros pour éviter " +"le code répétitif lors de la définition des types d'erreurs. Elle propose des macros " +"dérivées facilitant l'implémentation des propriétés `From`, `Display` et du trait " +"`Error`." + +#: src/error-handling/thiserror.md +msgid "\"I/O error: {0}\"" +msgstr "\"Erreur I/O : {0}\"" + +#: src/error-handling/thiserror.md src/error-handling/anyhow.md +msgid "\"Found no username in {0}\"" +msgstr "\"Aucun username trouvé dans {0}\"" + +#: src/error-handling/thiserror.md src/error-handling/anyhow.md +msgid "//fs::write(\"config.dat\", \"\").unwrap();\n" +msgstr "//fs::write(\"config.dat\", \"\").unwrap();\n" + +#: src/error-handling/thiserror.md src/error-handling/anyhow.md +msgid "\"Username: {username}\"" +msgstr "\"Username: {username}\"" + +#: src/error-handling/thiserror.md src/error-handling/anyhow.md +msgid "\"Error: {err:?}\"" +msgstr "\"Erreur : {err:?}\"" + +#: src/error-handling/thiserror.md +msgid "" +"The `Error` derive macro is provided by `thiserror`, and has lots of useful attributes to " +"help define error types in a compact way." +msgstr "" +"La macro dérivée `Error` est fournie par `thiserror` et possède de nombreux attributs " +"utiles pour aider à définir les types d'erreurs de manière compacte." + +#: src/error-handling/thiserror.md +msgid "The message from `#[error]` is used to derive the `Display` trait." +msgstr "Le message de `#[error]` est utilisé pour dériver le trait `Display`." + +#: src/error-handling/thiserror.md +msgid "" +"Note that the (`thiserror::`)`Error` derive macro, while it has the effect of " +"implementing the (`std::error::`)`Error` trait, is not the same this; traits and macros " +"do not share a namespace." +msgstr "" +"Notez que la macro dérivée (`thiserror::`)`Error`, bien qu'elle ait pour effet " +"d'implémenter le trait (`std::error::`)`Error`, n'est pas la même chose que ceci ; les " +"traits et les macros ne partagent pas un espace de noms." + +#: src/error-handling/anyhow.md +msgid "" +"The [`anyhow`](https://docs.rs/anyhow/) crate provides a rich error type with support for " +"carrying additional contextual information, which can be used to provide a semantic trace " +"of what the program was doing leading up to the error." +msgstr "" +"La bibliothèque [`anyhow`](https://docs.rs/anyhow/) fournit un type d'erreur riche avec " +"prise en charge du transport d'informations contextuelles supplémentaires, qui peuvent " +"être utilisées pour fournir une trace sémantique de ce que le programme faisait avant " +"l'erreur." + +#: src/error-handling/anyhow.md +msgid "" +"This can be combined with the convenience macros from [`thiserror`](https://docs.rs/" +"thiserror/) to avoid writing out trait impls explicitly for custom error types." +msgstr "" +"Cela peut être combiné avec les macros pratiques de [`thiserror`](https://docs.rs/" +"thiserror/) pour éviter d'écrire explicitement des implémentations de traits pour les " +"types d'erreurs personnalisés." + +#: src/error-handling/anyhow.md +msgid "\"Failed to open {path}\"" +msgstr "\"Echec dans l'ouverture de {path}\"" + +#: src/error-handling/anyhow.md +msgid "\"Failed to read\"" +msgstr "\"Echec de lecture\"" + +#: src/error-handling/anyhow.md +msgid "" +"`anyhow::Error` is essentially a wrapper around `Box`. As such it's again " +"generally not a good choice for the public API of a library, but is widely used in " +"applications." +msgstr "" +"`anyhow::Error` est essentiellement un wrapper autour de `Box`. De ce fait, il " +"n'est généralement pas recommandé pour l'API publique d'une bibliothèque, mais il est " +"largement utilisé dans les applications." + +#: src/error-handling/anyhow.md +msgid "`anyhow::Result` is a type alias for `Result`." +msgstr "`anyhow::Result` est un alias de type pour `Result`." + +#: src/error-handling/anyhow.md +msgid "" +"Functionality provided by `anyhow::Error` may be familiar to Go developers, as it " +"provides similar behavior to the Go `error` type and `Result` is much " +"like a Go `(T, error)` (with the convention that only one element of the pair is " +"meaningful)." +msgstr "" +"Les fonctionnalités fournies par `anyhow::Error` peuvent être familières aux développeurs " +"Go, car elles offrent un comportement similaire au type `error` de Go et `Result` ressemble beaucoup à un `(T, error)` de Go (avec la convention selon " +"laquelle seul un élément de la paire est significatif)." + +#: src/error-handling/anyhow.md +msgid "" +"`anyhow::Context` is a trait implemented for the standard `Result` and `Option` types. " +"`use anyhow::Context` is necessary to enable `.context()` and `.with_context()` on those " +"types." +msgstr "" +"`anyhow::Context` est un trait implémenté pour les types standards `Result` and `Option`. " +"`use anyhow::Context` est nécessaire pour permettre d'utiliser `.context()` et " +"`.with_context()` sur ces types." + +#: src/error-handling/anyhow.md +msgid "" +"`anyhow::Error` has support for downcasting, much like `std::any::Any`; the specific " +"error type stored inside can be extracted for examination if desired with [`Error::" +"downcast`](https://docs.rs/anyhow/latest/anyhow/struct.Error.html#method.downcast)." +msgstr "" +"`anyhow::Error` permet le downcasting un peu comme `std::any::Any`; le type erreur " +"spécifique est stocké à l'intérieur et peut être extrait pour l'examen si souhaité " +"[`Error::downcast`](https://docs.rs/anyhow/latest/anyhow/struct.Error.html#method.downcast)." + +#: src/error-handling/exercise.md +msgid "" +"In this exercise we're revisiting the expression evaluator exercise that we did in day 2. " +"Our initial solution ignores a possible error case: Dividing by zero! Rewrite `eval` to " +"instead use idiomatic error handling to handle this error case and return an error when " +"it occurs. We provide a simple `DivideByZeroError` type to use as the error type for " +"`eval`." +msgstr "" +"Dans cet exercice, nous reprenons l'exercice sur l'évaluateur d'expressions que nous " +"avons réalisé le deuxième jour. Notre solution initiale ignore un cas d'erreur possible : " +"la division par zéro ! Réécrivez `eval` afin d'utiliser une gestion d'erreurs idiomatique " +"pour traiter ce cas et renvoyer une erreur lorsqu'il se produit. Nous fournissons un type " +"simple `DivideByZeroError` à utiliser comme type d'erreur pour `eval`." + +#: src/error-handling/exercise.md +msgid "" +"// The original implementation of the expression evaluator. Update this to\n" +"// return a `Result` and produce an error when dividing by 0.\n" +msgstr "" +"// Implémentation originelle de l'évaluateur d'expression. Mettez à jour\n" +"// le code pour retourner un `Result` et produire une erreur pour la division par 0.\n" + +#: src/error-handling/exercise.md +msgid "\"Cannot divide by zero!\"" +msgstr "\"Division par 0 impossible !\"" + +#: src/error-handling/exercise.md +msgid "" +"The starting code here isn't exactly the same as the previous exercise's solution: We've " +"added in an explicit panic to show students where the error case is. Point this out if " +"students get confused." +msgstr "" +"Le code de départ n'est pas exactement le même que celui de l'exercice précédent : nous " +"avons ajouté une instruction `panic` explicite pour indiquer aux étudiants où se situe " +"l'erreur. Signalez-le si les étudiants sont confus." + +#: src/error-handling/solution.md +msgid "" +"**`Result` Return Type:** The function signature changes to return `Result`. This explicit type signature forces the caller to handle the " +"possibility of failure." +msgstr "" +"**Type de retour `Result` :** La signature de la fonction est modifiée pour retourner " +"`Result`. Cette signature de type explicite oblige l’appelant à " +"gérer l’éventualité d’un échec." + +#: src/error-handling/solution.md +msgid "" +"**The `?` Operator:** We use `?` on the recursive calls: `eval(*left)?`. This cleanly " +"propagates errors. If `eval` returns `Err`, the function immediately returns that `Err`. " +"If it returns `Ok(v)`, `v` is assigned to `left` (or `right`)." +msgstr "" +"**L'opérateur `?` :** Nous utilisons `?` dans les appels récursifs : `eval(*left)?`. Cela " +"permet de propager les erreurs proprement. Si `eval` renvoie `Err`, la fonction renvoie " +"immédiatement cette erreur. Si elle renvoie `Ok(v)`, `v` est affecté à `left` (ou " +"`right`)." + +#: src/error-handling/solution.md +msgid "**`Ok` Wrapping:** Successful results must be wrapped in `Ok(...)`." +msgstr "" +"**Encapsulation `Ok` :** Les résultats positifs doivent être enveloppés dans `Ok(...)`." + +#: src/error-handling/solution.md +msgid "" +"**Handling Division by Zero:** We explicitly check for `right == 0` and return " +"`Err(DivideByZeroError)`. This replaces the panic in the original code." +msgstr "" +"**Gestion des divisions par zéro :** Nous vérifions explicitement si `right == 0` et " +"retournons `Err(DivideByZeroError)`. Ceci remplace l’erreur panique du code d’origine." + +#: src/error-handling/solution.md +msgid "" +"Mention that `DivideByZeroError` is a unit struct (no fields), which is sufficient here " +"since there's no extra context to provide about the error." +msgstr "" +"Mentionnez que `DivideByZeroError` est une structure unitaire (sans champs), ce qui est " +"suffisant ici puisqu'il n'y a pas de contexte supplémentaire à fournir concernant " +"l'erreur." + +#: src/error-handling/solution.md +msgid "" +"Discuss how `?` makes error handling almost as concise as exceptions, but with explicit " +"control flow." +msgstr "" +"Expliquez comment `?` rend la gestion des erreurs presque aussi concise que les " +"exceptions, mais avec un flux de contrôle explicite." + +#: src/unsafe-rust/unsafe.md +msgid "The Rust language has two parts:" +msgstr "Le langage Rust comporte deux parties :" + +#: src/unsafe-rust/unsafe.md +msgid "**Safe Rust:** memory safe, no undefined behavior possible." +msgstr "**Safe Rust :** mémoire sécurisée, aucun comportement indéfini possible." + +#: src/unsafe-rust/unsafe.md +msgid "**Unsafe Rust:** can trigger undefined behavior if preconditions are violated." +msgstr "" +"**Rust non sécurisé :** peut déclencher un comportement indéfini si les préconditions ne " +"sont pas respectées." + +#: src/unsafe-rust/unsafe.md +msgid "" +"We saw mostly safe Rust in this course, but it's important to know what Unsafe Rust is." +msgstr "" +"Nous avons surtout vu du Rust sûr dans ce cours, mais il est important de savoir ce " +"qu'est le Rust non sûr." + +#: src/unsafe-rust/unsafe.md +msgid "" +"Unsafe code should be small and isolated, and its correctness should be carefully " +"documented. It should be wrapped in a safe abstraction layer." +msgstr "" +"Le code non sécurisé doit être concis et isolé, et sa validité doit être soigneusement " +"documentée. Il doit être encapsulé dans une couche d'abstraction sécurisée." + +#: src/unsafe-rust/unsafe.md +msgid "Unsafe Rust gives you access to five new capabilities:" +msgstr "Unsafe Rust vous donne accès à cinq nouvelles fonctionnalités :" + +#: src/unsafe-rust/unsafe.md +msgid "Dereference raw pointers." +msgstr "Déréférencer les pointeurs bruts." + +#: src/unsafe-rust/unsafe.md +msgid "Access or modify mutable static variables." +msgstr "Accéder aux variables statiques modifiables ou les modifier." + +#: src/unsafe-rust/unsafe.md +msgid "Access `union` fields." +msgstr "Accéder aux champs \"union\"." + +#: src/unsafe-rust/unsafe.md +msgid "Call `unsafe` functions, including `extern` functions." +msgstr "Appelez des fonctions `unsafe`, y compris des fonctions `extern`." + +#: src/unsafe-rust/unsafe.md +msgid "Implement `unsafe` traits." +msgstr "Implémenter les traits `unsafe`." + +#: src/unsafe-rust/unsafe.md +msgid "" +"We will briefly cover unsafe capabilities next. For full details, please see [Chapter " +"19.1 in the Rust Book](https://doc.rust-lang.org/book/ch19-01-unsafe-rust.html) and the " +"[Rustonomicon](https://doc.rust-lang.org/nomicon/)." +msgstr "" +"Nous aborderons brièvement les fonctionnalités non sécurisées. Pour plus de détails, " +"veuillez consulter le [chapitre 19.1 du livre Rust](https://doc.rust-lang.org/book/" +"ch19-01-unsafe-rust.html) et le [Rustonomicon](https://doc.rust-lang.org/nomicon/)." + +#: src/unsafe-rust/unsafe.md +msgid "" +"Unsafe Rust does not mean the code is incorrect. It means that developers have turned off " +"some compiler safety features and have to write correct code by themselves. It means the " +"compiler no longer enforces Rust's memory-safety rules." +msgstr "" +"« Rust non sécurisé » ne signifie pas que le code est incorrect. Cela signifie que les " +"développeurs ont désactivé certaines fonctions de sécurité du compilateur et doivent donc " +"écrire eux-mêmes le code correct. Autrement dit, le compilateur n'applique plus les " +"règles de sécurité mémoire de Rust." + +#: src/unsafe-rust/dereferencing.md +msgid "Creating pointers is safe, but dereferencing them requires `unsafe`:" +msgstr "" +"La création de pointeurs est sûre, mais leur déréférencement nécessite l'utilisation de " +"l'option `unsafe` :" + +#: src/unsafe-rust/dereferencing.md +msgid "" +"// SAFETY: p1 and p2 were created by taking raw pointers to a local, so they\n" +" // are guaranteed to be non-null, aligned, and point into a single (stack-)\n" +" // allocated object.\n" +" //\n" +" // The object underlying the raw pointers lives for the entire function, so\n" +" // it is not deallocated while the raw pointers still exist. It is not\n" +" // accessed through references while the raw pointers exist, nor is it\n" +" // accessed from other threads concurrently.\n" +msgstr "" +"// SAFETY: p1 and p2 were created by taking raw pointers to a local, so they\n" +" // are guaranteed to be non-null, aligned, and point into a single (stack-)\n" +" // allocated object.\n" +" //\n" +" // The object underlying the raw pointers lives for the entire function, so\n" +" // it is not deallocated while the raw pointers still exist. It is not\n" +" // accessed through references while the raw pointers exist, nor is it\n" +" // accessed from other threads concurrently.\n" + +#: src/unsafe-rust/dereferencing.md +msgid "// Mutation may soundly be observed through a raw pointer, like in C.\n" +msgstr "// Mutation may soundly be observed through a raw pointer, like in C.\n" + +#: src/unsafe-rust/dereferencing.md +msgid "" +"// UNSOUND. DO NOT DO THIS.\n" +" /*\n" +" let r: &i32 = unsafe { &*p1 };\n" +" dbg!(r);\n" +" x = 50;\n" +" dbg!(r); // Object underlying the reference has been mutated. This is UB.\n" +" */" +msgstr "" +"// UNSOUND. DO NOT DO THIS.\n" +" /*\n" +" let r: &i32 = unsafe { &*p1 };\n" +" dbg!(r);\n" +" x = 50;\n" +" dbg!(r); // Object underlying the reference has been mutated. This is UB.\n" +" */" + +#: src/unsafe-rust/dereferencing.md +msgid "" +"It is good practice (and required by the Android Rust style guide) to write a comment for " +"each `unsafe` block explaining how the code inside it satisfies the safety requirements " +"of the unsafe operations it is doing." +msgstr "" +"Il est recommandé (et exigé par le guide de style Android Rust) d'écrire un commentaire " +"pour chaque bloc `unsafe` expliquant comment le code à l'intérieur satisfait aux " +"exigences de sécurité des opérations non sécurisées qu'il effectue." + +#: src/unsafe-rust/dereferencing.md +msgid "" +"In the case of pointer dereferences, this means that the pointers must be [_valid_]" +"(https://doc.rust-lang.org/std/ptr/index.html#safety), i.e.:" +msgstr "" +"Dans le cas des déréférencements de pointeurs, cela signifie que les pointeurs doivent " +"être [_valides_](https://doc.rust-lang.org/std/ptr/index.html#safety), c'est-à-dire :" + +#: src/unsafe-rust/dereferencing.md +msgid "The pointer must be non-null." +msgstr "Le pointeur doit être non nul." + +#: src/unsafe-rust/dereferencing.md +msgid "" +"The pointer must be _dereferenceable_ (within the bounds of a single allocated object)." +msgstr "Le pointeur doit être _déréférençable_ (dans les limites d'un seul objet alloué)." + +#: src/unsafe-rust/dereferencing.md +msgid "The object must not have been deallocated." +msgstr "L'objet ne doit pas avoir été désalloué." + +#: src/unsafe-rust/dereferencing.md +msgid "There must not be concurrent accesses to the same location." +msgstr "Les accès simultanés au même emplacement ne doivent pas être autorisés." + +#: src/unsafe-rust/dereferencing.md +msgid "" +"If the pointer was obtained by casting a reference, the underlying object must be live " +"and no reference may be used to access the memory." +msgstr "" +"Si le pointeur a été obtenu par conversion de référence, l'objet sous-jacent doit être " +"actif et aucune référence ne peut être utilisée pour accéder à la mémoire." + +#: src/unsafe-rust/dereferencing.md +msgid "In most cases the pointer must also be properly aligned." +msgstr "Dans la plupart des cas, le pointeur doit également être correctement aligné." + +#: src/unsafe-rust/dereferencing.md +msgid "" +"The \"UNSOUND\" section gives an example of a common kind of UB bug: naïvely taking a " +"reference to the dereference of a raw pointer sidesteps the compiler's knowledge of what " +"object the reference is actually pointing to. As such, the borrow checker does not freeze " +"`x` and so we are able to modify it despite the existence of a reference to it. Creating " +"a reference from a pointer requires _great care_." +msgstr "" +"La section « UNSOUND » donne un exemple de comportement indéfini courant : accéder " +"naïvement à la référence d'un pointeur brut contourne la connaissance, par le " +"compilateur, de l'objet réellement référencé. De ce fait, le vérificateur d'emprunts ne " +"bloque pas `x`, et nous pouvons donc le modifier malgré l'existence d'une référence. " +"Créer une référence à partir d'un pointeur exige une extrême prudence." + +#: src/unsafe-rust/mutable-static.md +msgid "It is safe to read an immutable static variable:" +msgstr "Il est possible de lire sans risque une variable statique immuable :" + +#: src/unsafe-rust/mutable-static.md +msgid "\"Hello, world!\"" +msgstr "\"Hello, world!\"" + +#: src/unsafe-rust/mutable-static.md +msgid "\"HELLO_WORLD: {HELLO_WORLD}\"" +msgstr "\"HELLO_WORLD: {HELLO_WORLD}\"" + +#: src/unsafe-rust/mutable-static.md +msgid "" +"However, mutable static variables are unsafe to read and write because multiple threads " +"could do so concurrently without synchronization, constituting a data race." +msgstr "" +"Cependant, les variables statiques mutables ne sont pas sûres en lecture et en écriture " +"car plusieurs threads pourraient le faire simultanément sans synchronisation, ce qui " +"constitue une situation de concurrence pour les données." + +#: src/unsafe-rust/mutable-static.md +msgid "" +"Using mutable statics soundly requires reasoning about concurrency without the compiler's " +"help:" +msgstr "" +"L'utilisation judicieuse des variables statiques mutables exige de raisonner sur la " +"concurrence sans l'aide du compilateur :" + +#: src/unsafe-rust/mutable-static.md +msgid "// SAFETY: There are no other threads which could be accessing `COUNTER`.\n" +msgstr "// SAFETY: There are no other threads which could be accessing `COUNTER`.\n" + +#: src/unsafe-rust/mutable-static.md +msgid "" +"The program here is sound because it is single-threaded. However, the Rust compiler " +"reasons about functions individually so can't assume that. Try removing the `unsafe` and " +"see how the compiler explains that it is undefined behavior to access a mutable static " +"from multiple threads." +msgstr "" +"Ce programme est correct car il est monothread. Cependant, le compilateur Rust analyse " +"les fonctions individuellement et ne peut donc pas le supposer. Essayez de supprimer le " +"mot-clé `unsafe` et observez comment le compilateur explique qu'accéder à une variable " +"statique mutable depuis plusieurs threads constitue un comportement indéfini." + +#: src/unsafe-rust/mutable-static.md +msgid "" +"The 2024 Rust edition goes further and makes accessing a mutable static by reference an " +"error by default." +msgstr "" +"L'édition 2024 de Rust va plus loin et fait de l'accès à une variable statique mutable " +"par référence une erreur par défaut." + +#: src/unsafe-rust/mutable-static.md +msgid "" +"Using a mutable static is rarely a good idea, you should use interior mutability instead." +msgstr "" +"L'utilisation d'une variable statique mutable est rarement une bonne idée ; il est " +"préférable d'utiliser la mutabilité interne." + +#: src/unsafe-rust/mutable-static.md +msgid "" +"There are some cases where it might be necessary in low-level `no_std` code, such as " +"implementing a heap allocator or working with some C APIs. In this case you should use " +"pointers rather than references." +msgstr "" +"Dans certains cas, notamment pour du code de bas niveau ne nécessitant pas de " +"bibliothèque standard (`no_std`), comme l'implémentation d'un allocateur de mémoire ou " +"l'utilisation de certaines API C, il est préférable d'utiliser des pointeurs plutôt que " +"des références." + +#: src/unsafe-rust/unions.md +msgid "Unions are like enums, but you need to track the active field yourself:" +msgstr "" +"Les unions sont semblables aux énumérations, mais vous devez suivre vous-même le champ " +"actif :" + +#: src/unsafe-rust/unions.md +msgid "\"int: {}\"" +msgstr "\"int: {}\"" + +#: src/unsafe-rust/unions.md +msgid "\"bool: {}\"" +msgstr "\"bool: {}\"" + +#: src/unsafe-rust/unions.md +msgid "// Undefined behavior!\n" +msgstr "// Undefined behavior!\n" + +#: src/unsafe-rust/unions.md +msgid "" +"Unions are rarely needed in Rust as enums provide a superior alternative. They are " +"occasionally needed for interacting with C library APIs." +msgstr "" +"Les unions sont rarement nécessaires en Rust, car les énumérations offrent une " +"alternative bien plus performante. Elles sont toutefois parfois requises pour interagir " +"avec les API des bibliothèques C." + +#: src/unsafe-rust/unions.md +msgid "" +"If you just want to reinterpret bytes as a different type, you probably want [`std::mem::" +"transmute`](https://doc.rust-lang.org/stable/std/mem/fn.transmute.html) or a safe wrapper " +"such as the [`zerocopy`](https://crates.io/crates/zerocopy) crate." +msgstr "" +"Si vous souhaitez simplement réinterpréter les octets comme un type différent, vous " +"voudrez probablement [`std::mem::transmute`](https://doc.rust-lang.org/stable/std/mem/fn." +"transmute.html) ou un wrapper sûr tel que la crate [`zerocopy`](https://crates.io/crates/" +"zerocopy)." + +#: src/unsafe-rust/unsafe-functions.md +msgid "" +"A function or method can be marked `unsafe` if it has extra preconditions you must uphold " +"to avoid undefined behaviour." +msgstr "" +"Une fonction ou une méthode peut être qualifiée d'« insécurisée » si elle comporte des " +"préconditions supplémentaires que vous devez respecter pour éviter un comportement " +"indéfini." + +#: src/unsafe-rust/unsafe-functions.md +msgid "Unsafe functions may come from two places:" +msgstr "Les dysfonctionnements peuvent provenir de deux sources :" + +#: src/unsafe-rust/unsafe-functions.md +msgid "Rust functions declared unsafe." +msgstr "Fonctions Rust déclarées non sécurisées." + +#: src/unsafe-rust/unsafe-functions.md +msgid "Unsafe foreign functions in `extern \"C\"` blocks." +msgstr "Fonctions étrangères non sécurisées dans les blocs `extern \"C\"`." + +#: src/unsafe-rust/unsafe-functions.md +msgid "We will look at the two kinds of unsafe functions next." +msgstr "Nous allons maintenant examiner les deux types de fonctions non sécurisées." + +#: src/unsafe-rust/unsafe-functions/rust.md +msgid "" +"You can mark your own functions as `unsafe` if they require particular preconditions to " +"avoid undefined behaviour." +msgstr "" +"Vous pouvez marquer vos propres fonctions comme « non sécurisées » si elles nécessitent " +"des préconditions particulières pour éviter un comportement indéfini." + +#: src/unsafe-rust/unsafe-functions/rust.md +msgid "" +"/// Swaps the values pointed to by the given pointers.\n" +"///\n" +"/// # Safety\n" +"///\n" +"/// The pointers must be valid, properly aligned, and not otherwise accessed for\n" +"/// the duration of the function call.\n" +msgstr "" +"/// Swaps the values pointed to by the given pointers.\n" +"///\n" +"/// # Safety\n" +"///\n" +"/// The pointers must be valid, properly aligned, and not otherwise accessed for\n" +"/// the duration of the function call.\n" + +#: src/unsafe-rust/unsafe-functions/rust.md +msgid "" +"// SAFETY: Our caller promised that the pointers are valid, properly aligned\n" +" // and have no other access.\n" +msgstr "" +"// SAFETY: Our caller promised that the pointers are valid, properly aligned\n" +" // and have no other access.\n" + +#: src/unsafe-rust/unsafe-functions/rust.md +msgid "" +"// SAFETY: The pointers must be valid, aligned and unique because they came\n" +" // from references.\n" +msgstr "" +"// SAFETY: The pointers must be valid, aligned and unique because they came\n" +" // from references.\n" + +#: src/unsafe-rust/unsafe-functions/rust.md +msgid "\"a = {}, b = {}\"" +msgstr "\"a = {}, b = {}\"" + +#: src/unsafe-rust/unsafe-functions/rust.md +msgid "" +"We wouldn't actually use pointers for a `swap` function --- it can be done safely with " +"references." +msgstr "" +"Nous n'utiliserions pas de pointeurs pour une fonction `swap` --- cela peut être fait en " +"toute sécurité avec des références." + +#: src/unsafe-rust/unsafe-functions/rust.md +msgid "" +"Note that Rust 2021 and earlier allow unsafe code within an unsafe function without an " +"`unsafe` block. This changed in the 2024 edition. We can prohibit it in older editions " +"with `#[deny(unsafe_op_in_unsafe_fn)]`. Try adding it and see what happens." +msgstr "" +"Notez que Rust 2021 et les versions antérieures autorisent le code non sécurisé à " +"l'intérieur d'une fonction non sécurisée sans bloc `unsafe`. Ce comportement a été " +"modifié dans l'édition 2024. Il est possible de l'interdire dans les éditions plus " +"anciennes avec `#[deny(unsafe_op_in_unsafe_fn)]`. Essayez de l'ajouter et observez le " +"résultat." + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "" +"You can declare foreign functions for access from Rust with `unsafe extern`. This is " +"unsafe because the compiler has no way to reason about their behavior. Functions declared " +"in an `extern` block must be marked as `safe` or `unsafe`, depending on whether they have " +"preconditions for safe use:" +msgstr "" +"Vous pouvez déclarer des fonctions externes accessibles depuis Rust avec `unsafe extern`. " +"Cette pratique est considérée comme dangereuse car le compilateur ne peut pas prévoir " +"leur comportement. Les fonctions déclarées dans un bloc `extern` doivent être marquées " +"comme `safe` ou `unsafe`, selon qu'elles nécessitent ou non des prérequis pour une " +"utilisation sûre." + +#: src/unsafe-rust/unsafe-functions/extern-c.md src/unsafe-rust/exercise.md +#: src/unsafe-rust/solution.md src/android/interoperability/with-c.md +#: src/android/interoperability/with-c/rust-library.md +#: src/android/interoperability/cpp/cpp-bridge.md src/exercises/chromium/build-rules.md +#: src/bare-metal/aps/inline-assembly.md src/bare-metal/aps/uart/using.md +#: src/bare-metal/aps/safemmio/using.md src/bare-metal/aps/logging/using.md +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +#: src/unsafe-deep-dive/ffi/abs.md src/unsafe-deep-dive/ffi/c-library-example.md +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "\"C\"" +msgstr "\"C\"" + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "// `abs` doesn't deal with pointers and doesn't have any safety requirements.\n" +msgstr "// `abs` doesn't deal with pointers and doesn't have any safety requirements.\n" + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "" +"/// # Safety\n" +" ///\n" +" /// `s` must be a pointer to a NUL-terminated C string which is valid and\n" +" /// not modified for the duration of this function call.\n" +msgstr "" +"/// # Safety\n" +" ///\n" +" /// `s` must be a pointer to a NUL-terminated C string which is valid and\n" +" /// not modified for the duration of this function call.\n" + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "\"Absolute value of -3 according to C: {}\"" +msgstr "\"Absolute value of -3 according to C: {}\"" + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "" +"// SAFETY: We pass a pointer to a C string literal which is valid for\n" +" // the duration of the program.\n" +msgstr "" +"// SAFETY: We pass a pointer to a C string literal which is valid for\n" +" // the duration of the program.\n" + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "\"String length: {}\"" +msgstr "\"String length: {}\"" + +#: src/unsafe-rust/unsafe-functions/extern-c.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md +msgid "\"String\"" +msgstr "\"String\"" + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "" +"Rust used to consider all extern functions unsafe, but this changed in Rust 1.82 with " +"`unsafe extern` blocks." +msgstr "" +"Auparavant, Rust considérait toutes les fonctions externes comme non sécurisées, mais " +"cela a changé dans Rust 1.82 avec les blocs `unsafe extern`." + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "" +"`abs` must be explicitly marked as `safe` because it is an external function (FFI). " +"Calling external functions is only a problem when those functions do things with pointers " +"which might violate Rust's memory model, but in general any C function might have " +"undefined behaviour under any arbitrary circumstances." +msgstr "" +"La fonction `abs` doit être explicitement déclarée comme `safe` car il s'agit d'une " +"fonction externe (FFI). L'appel de fonctions externes ne pose problème que lorsque ces " +"fonctions manipulent des pointeurs, ce qui pourrait enfreindre le modèle mémoire de Rust. " +"En général, toute fonction C peut avoir un comportement indéfini dans des circonstances " +"arbitraires." + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "" +"The `\"C\"` in this example is the ABI; [other ABIs are available too](https://doc.rust-" +"lang.org/reference/items/external-blocks.html)." +msgstr "" +"Le « C » dans cet exemple est l’ABI ; [d’autres ABI sont également disponibles](https://" +"doc.rust-lang.org/reference/items/external-blocks.html)." + +#: src/unsafe-rust/unsafe-functions/extern-c.md +msgid "" +"Note that there is no verification that the Rust function signature matches that of the " +"function definition -- that's up to you!" +msgstr "" +"Notez qu'il n'y a aucune vérification que la signature de la fonction Rust corresponde à " +"celle de la définition de la fonction -- c'est à vous de le faire !" + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "Failing to uphold the safety requirements breaks memory safety!" +msgstr "Le non-respect des exigences de sécurité compromet la sécurité de la mémoire !" + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "// 8 bytes\n" +msgstr "// 8 bytes\n" + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "\"{pk:?}\"" +msgstr "\"{pk:?}\"" + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "" +"Always include a safety comment for each `unsafe` block. It must explain why the code is " +"actually safe. This example is missing a safety comment and is unsound." +msgstr "" +"Incluez toujours un commentaire de sécurité pour chaque bloc `unsafe`. Ce commentaire " +"doit expliquer pourquoi le code est en réalité sûr. Cet exemple ne comporte pas de " +"commentaire de sécurité et est donc incorrect." + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "" +"The second argument to `slice::from_raw_parts` is the number of _elements_, not bytes! " +"This example demonstrates unexpected behavior by reading past the end of one array and " +"into another." +msgstr "" +"Le deuxième argument de `slice::from_raw_parts` est le nombre d'éléments, et non " +"d'octets ! Cet exemple illustre un comportement inattendu en lisant au-delà de la fin " +"d'un tableau et en poursuivant la lecture dans un autre." + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "" +"This is undefined behavior because we're reading past the end of the array that the " +"pointer was derived from." +msgstr "" +"Il s'agit d'un comportement indéfini car nous lisons au-delà de la fin du tableau à " +"partir duquel le pointeur a été dérivé." + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "" +"`log_public_key` should be unsafe, because `pk_ptr` must meet certain prerequisites to " +"avoid undefined behaviour. A safe function which can cause undefined behaviour is said to " +"be `unsound`. What should its safety documentation say?" +msgstr "" +"La fonction `log_public_key` devrait être considérée comme non sécurisée, car `pk_ptr` " +"doit satisfaire certaines conditions préalables pour éviter un comportement indéfini. Une " +"fonction sûre susceptible d'entraîner un comportement indéfini est dite « non fiable ». " +"Que devrait indiquer sa documentation de sécurité ?" + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "" +"The standard library contains a number of low-level unsafe functions. Prefer the safe " +"alternatives when possible!" +msgstr "" +"La bibliothèque standard contient plusieurs fonctions de bas niveau non sécurisées. " +"Privilégiez les alternatives sécurisées lorsque c'est possible !" + +#: src/unsafe-rust/unsafe-functions/calling.md +msgid "" +"If you use an unsafe function as an optimization, make sure to add a benchmark to " +"demonstrate the gain." +msgstr "" +"Si vous utilisez une fonction non sécurisée comme optimisation, veillez à ajouter un " +"point de référence pour démontrer le gain." + +#: src/unsafe-rust/unsafe-traits.md +msgid "Implementing Unsafe Traits" +msgstr "Implémentation de traits non sécurisés" + +#: src/unsafe-rust/unsafe-traits.md +msgid "" +"Like with functions, you can mark a trait as `unsafe` if the implementation must " +"guarantee particular conditions to avoid undefined behaviour." +msgstr "" +"Comme pour les fonctions, vous pouvez marquer un trait comme `unsafe` si l'implémentation " +"doit garantir des conditions particulières pour éviter un comportement indéfini." + +#: src/unsafe-rust/unsafe-traits.md +msgid "" +"For example, the `zerocopy` crate has an unsafe trait that looks [something like this]" +"(https://docs.rs/zerocopy/latest/zerocopy/trait.IntoBytes.html):" +msgstr "" +"Par exemple, la bibliothèque `zerocopy` possède un trait non sécurisé qui ressemble à " +"ceci : [https://docs.rs/zerocopy/latest/zerocopy/trait.IntoBytes.html](https://docs.rs/" +"zerocopy/latest/zerocopy/trait.IntoBytes.html) :" + +#: src/unsafe-rust/unsafe-traits.md +msgid "" +"/// ...\n" +"/// # Safety\n" +"/// The type must have a defined representation and no padding.\n" +msgstr "" +"/// ...\n" +"/// # Safety\n" +"/// The type must have a defined representation and no padding.\n" + +#: src/unsafe-rust/unsafe-traits.md +msgid "// SAFETY: `u32` has a defined representation and no padding.\n" +msgstr "// SAFETY: `u32` has a defined representation and no padding.\n" + +#: src/unsafe-rust/unsafe-traits.md +msgid "" +"There should be a `# Safety` section on the Rustdoc for the trait explaining the " +"requirements for the trait to be safely implemented." +msgstr "" +"Il devrait y avoir une section `# sAFETY` dans la documentation Rustdoc du trait " +"expliquant les exigences pour que celui-ci puisse être implémenté en toute sécurité." + +#: src/unsafe-rust/unsafe-traits.md +msgid "The actual safety section for `IntoBytes` is rather longer and more complicated." +msgstr "" +"La section relative à la sécurité pour `IntoBytes` est en réalité beaucoup plus longue et " +"complexe." + +#: src/unsafe-rust/unsafe-traits.md +msgid "The built-in `Send` and `Sync` traits are unsafe." +msgstr "Les fonctionnalités intégrées `Send` et `Sync` ne sont pas sûres." + +#: src/unsafe-rust/exercise.md +msgid "Safe FFI Wrapper" +msgstr "FFI sûr" + +#: src/unsafe-rust/exercise.md +msgid "" +"Rust has great support for calling functions through a _foreign function interface_ " +"(FFI). We will use this to build a safe wrapper for the `libc` functions you would use " +"from C to read the names of files in a directory." +msgstr "" +"Rust offre une excellente prise en charge des appels de fonctions via une interface de " +"fonction étrangère (FFI). Nous l'utiliserons pour créer une interface sécurisée pour les " +"fonctions de la `libc` que vous utiliseriez en C pour lire les noms de fichiers dans un " +"répertoire." + +#: src/unsafe-rust/exercise.md +msgid "You will want to consult the manual pages:" +msgstr "Vous voudrez consulter les pages du manuel :" + +#: src/unsafe-rust/exercise.md +msgid "[`opendir(3)`](https://man7.org/linux/man-pages/man3/opendir.3.html)" +msgstr "[`opendir(3)`](https://man7.org/linux/man-pages/man3/opendir.3.html)" + +#: src/unsafe-rust/exercise.md +msgid "[`readdir(3)`](https://man7.org/linux/man-pages/man3/readdir.3.html)" +msgstr "[`readdir(3)`](https://man7.org/linux/man-pages/man3/readdir.3.html)" + +#: src/unsafe-rust/exercise.md +msgid "[`closedir(3)`](https://man7.org/linux/man-pages/man3/closedir.3.html)" +msgstr "[`closedir(3)`](https://man7.org/linux/man-pages/man3/closedir.3.html)" + +#: src/unsafe-rust/exercise.md +msgid "" +"You will also want to browse the [`std::ffi`](https://doc.rust-lang.org/std/ffi/) module. " +"There you find a number of string types which you need for the exercise:" +msgstr "" +"Vous voudrez également consulter le module [`std::ffi`](https://doc.rust-lang.org/std/" +"ffi/). Vous y trouverez plusieurs types de chaînes de caractères dont vous aurez besoin " +"pour cet exercice :" + +#: src/unsafe-rust/exercise.md +msgid "Encoding" +msgstr "Encodage" + +#: src/unsafe-rust/exercise.md +msgid "Use" +msgstr "Use" + +#: src/unsafe-rust/exercise.md +msgid "" +"[`str`](https://doc.rust-lang.org/std/primitive.str.html) and [`String`](https://doc.rust-" +"lang.org/std/string/struct.String.html)" +msgstr "" +"[`str`](https://doc.rust-lang.org/std/primitive.str.html) et [`String`](https://doc.rust-" +"lang.org/std/string/struct.String.html)" + +#: src/unsafe-rust/exercise.md +msgid "UTF-8" +msgstr "UTF-8" + +#: src/unsafe-rust/exercise.md +msgid "Text processing in Rust" +msgstr "Traitement de texte en Rust" + +#: src/unsafe-rust/exercise.md +msgid "" +"[`CStr`](https://doc.rust-lang.org/std/ffi/struct.CStr.html) and [`CString`](https://doc." +"rust-lang.org/std/ffi/struct.CString.html)" +msgstr "" +"[`CStr`](https://doc.rust-lang.org/std/ffi/struct.CStr.html) et [`CString`](https://doc." +"rust-lang.org/std/ffi/struct.CString.html)" + +#: src/unsafe-rust/exercise.md +msgid "NUL-terminated" +msgstr "terminé par NUL" + +#: src/unsafe-rust/exercise.md +msgid "Communicating with C functions" +msgstr "Communication avec les fonctions C" + +#: src/unsafe-rust/exercise.md +msgid "" +"[`OsStr`](https://doc.rust-lang.org/std/ffi/struct.OsStr.html) and [`OsString`](https://" +"doc.rust-lang.org/std/ffi/struct.OsString.html)" +msgstr "" +"[`OsStr`](https://doc.rust-lang.org/std/ffi/struct.OsString.html) et [`OsString`](https://" +"doc.rust-lang.org/std/ffi/struct.OsString.html)" + +#: src/unsafe-rust/exercise.md +msgid "OS-specific" +msgstr "spécifique au système d'exploitation" + +#: src/unsafe-rust/exercise.md +msgid "Communicating with the OS" +msgstr "Communication avec le système d'exploitation" + +#: src/unsafe-rust/exercise.md +msgid "You will convert between all these types:" +msgstr "Vous effectuerez des conversions entre tous ces types :" + +#: src/unsafe-rust/exercise.md +msgid "`&str` to `CString`: you need to allocate space for a trailing `\\0` character," +msgstr "" +"`&str` vers `CString` : vous devez allouer de l’espace pour un caractère `\\0` final," + +#: src/unsafe-rust/exercise.md +msgid "`CString` to `*const c_char`: you need a pointer to call C functions," +msgstr "" +"Conversion de `CString` en `*const c_char` : vous avez besoin d’un pointeur pour appeler " +"des fonctions C." + +#: src/unsafe-rust/exercise.md +msgid "" +"`*const c_char` to `&CStr`: you need something which can find the trailing `\\0` " +"character," +msgstr "" +"`*const c_char` vers `&CStr` : vous avez besoin de quelque chose qui puisse trouver le " +"caractère `\\0` final," + +#: src/unsafe-rust/exercise.md +msgid "" +"`&CStr` to `&[u8]`: a slice of bytes is the universal interface for \"some unknown data\"," +msgstr "" +"`&CStr` à `&[u8]` : une tranche d'octets est l'interface universelle pour « des données " +"inconnues »," + +#: src/unsafe-rust/exercise.md +msgid "" +"`&[u8]` to `&OsStr`: `&OsStr` is a step towards `OsString`, use [`OsStrExt`](https://doc." +"rust-lang.org/std/os/unix/ffi/trait.OsStrExt.html) to create it," +msgstr "" +"`&[u8]` vers `&OsStr` : `&OsStr` est une étape vers `OsString`, utilisez [`OsStrExt`]" +"(https://doc.rust-lang.org/std/os/unix/ffi/trait.OsStrExt.html) pour le créer," + +#: src/unsafe-rust/exercise.md +msgid "" +"`&OsStr` to `OsString`: you need to clone the data in `&OsStr` to be able to return it " +"and call `readdir` again." +msgstr "" +"`&OsStr` vers `OsString` : vous devez cloner les données dans `&OsStr` pour pouvoir les " +"renvoyer et appeler à nouveau `readdir`." + +#: src/unsafe-rust/exercise.md +msgid "" +"The [Nomicon](https://doc.rust-lang.org/nomicon/ffi.html) also has a very useful chapter " +"about FFI." +msgstr "" +"Le [Nomicon](https://doc.rust-lang.org/nomicon/ffi.html) contient également un chapitre " +"très utile sur FFI." + +#: src/unsafe-rust/exercise.md +msgid "" +"Copy the code below to and fill in the missing functions " +"and methods:" +msgstr "" +"Copiez le code ci-dessous dans et complétez les fonctions " +"et méthodes manquantes :" + +#: src/unsafe-rust/exercise.md +msgid "// TODO: remove this when you're done with your implementation.\n" +msgstr "// TODO: remove this when you're done with your implementation.\n" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "\"macos\"" +msgstr "\"macos\"" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "// Opaque type. See https://doc.rust-lang.org/nomicon/ffi.html.\n" +msgstr "// Opaque type. See https://doc.rust-lang.org/nomicon/ffi.html.\n" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "" +"// Layout according to the Linux man page for readdir(3), where ino_t and\n" +" // off_t are resolved according to the definitions in\n" +" // /usr/include/x86_64-linux-gnu/{sys/types.h, bits/typesizes.h}.\n" +msgstr "" +"// Layout according to the Linux man page for readdir(3), where ino_t and\n" +" // off_t are resolved according to the definitions in\n" +" // /usr/include/x86_64-linux-gnu/{sys/types.h, bits/typesizes.h}.\n" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "// Layout according to the macOS man page for dir(5).\n" +msgstr "// Layout according to the macOS man page for dir(5).\n" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "\"x86_64\"" +msgstr "\"x86_64\"" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "" +"// See https://github.com/rust-lang/libc/issues/414 and the section on\n" +" // _DARWIN_FEATURE_64_BIT_INODE in the macOS man page for stat(2).\n" +" //\n" +" // \"Platforms that existed before these updates were available\" refers\n" +" // to macOS (as opposed to iOS / wearOS / etc.) on Intel and PowerPC.\n" +msgstr "" +"// See https://github.com/rust-lang/libc/issues/414 and the section on\n" +" // _DARWIN_FEATURE_64_BIT_INODE in the macOS man page for stat(2).\n" +" //\n" +" // \"Platforms that existed before these updates were available\" refers\n" +" // to macOS (as opposed to iOS / wearOS / etc.) on Intel and PowerPC.\n" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "\"readdir$INODE64\"" +msgstr "\"readdir$INODE64\"" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "" +"// Call opendir and return a Ok value if that worked,\n" +" // otherwise return Err with a message.\n" +msgstr "" +"// Call opendir and return a Ok value if that worked,\n" +" // otherwise return Err with a message.\n" + +#: src/unsafe-rust/exercise.md +msgid "// Keep calling readdir until we get a NULL pointer back.\n" +msgstr "// Keep calling readdir until we get a NULL pointer back.\n" + +#: src/unsafe-rust/exercise.md +msgid "// Call closedir as needed.\n" +msgstr "// Call closedir as needed.\n" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +#: src/android/interoperability/with-c/rust-library.md +msgid "\".\"" +msgstr "\".\"" + +#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md +msgid "\"files: {:#?}\"" +msgstr "\"files: {:#?}\"" + +#: src/unsafe-rust/exercise.md +msgid "" +"FFI binding code is typically generated by tools like [bindgen](https://github.com/rust-" +"lang/rust-bindgen), rather than being written manually as we are doing here. However, " +"bindgen can't run in an online playground." +msgstr "" +"Le code de liaison FFI est généralement généré par des outils comme [bindgen](https://" +"github.com/rust-lang/rust-bindgen), plutôt que d'être écrit manuellement comme nous le " +"faisons ici. Cependant, bindgen ne peut pas être exécuté dans un environnement de test en " +"ligne." + +#: src/unsafe-rust/solution.md +msgid "\"Invalid path: {err}\"" +msgstr "\"Invalid path: {err}\"" + +#: src/unsafe-rust/solution.md +msgid "// SAFETY: path.as_ptr() cannot be NULL.\n" +msgstr "// SAFETY: path.as_ptr() cannot be NULL.\n" + +#: src/unsafe-rust/solution.md +msgid "\"Could not open {path:?}\"" +msgstr "\"Could not open {path:?}\"" + +#: src/unsafe-rust/solution.md +msgid "" +"// Keep calling readdir until we get a NULL pointer back.\n" +" // SAFETY: self.dir is never NULL.\n" +msgstr "" +"// Keep calling readdir until we get a NULL pointer back.\n" +" // SAFETY: self.dir is never NULL.\n" + +#: src/unsafe-rust/solution.md +msgid "// We have reached the end of the directory.\n" +msgstr "// We have reached the end of the directory.\n" + +#: src/unsafe-rust/solution.md +msgid "" +"// SAFETY: dirent is not NULL and dirent.d_name is NUL\n" +" // terminated.\n" +msgstr "" +"// SAFETY: dirent is not NULL and dirent.d_name is NUL\n" +" // terminated.\n" + +#: src/unsafe-rust/solution.md +msgid "" +"// Call closedir as needed.\n" +" // SAFETY: self.dir is never NULL.\n" +msgstr "" +"// Call closedir as needed.\n" +" // SAFETY: self.dir is never NULL.\n" + +#: src/unsafe-rust/solution.md +msgid "\"Could not close {:?}\"" +msgstr "\"Could not close {:?}\"" + +#: src/unsafe-rust/solution.md +msgid "\"no-such-directory\"" +msgstr "\"no-such-directory\"" + +#: src/unsafe-rust/solution.md +msgid "\"Non UTF-8 character in path\"" +msgstr "\"Non UTF-8 character in path\"" + +#: src/unsafe-rust/solution.md +msgid "\"..\"" +msgstr "\"..\"" + +#: src/unsafe-rust/solution.md src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "\"foo.txt\"" +msgstr "\"foo.txt\"" + +#: src/unsafe-rust/solution.md +msgid "\"The Foo Diaries\\n\"" +msgstr "\"The Foo Diaries\\n\"" + +#: src/unsafe-rust/solution.md +msgid "\"bar.png\"" +msgstr "\"bar.png\"" + +#: src/unsafe-rust/solution.md +msgid "\"\\n\"" +msgstr "\"\\n\"" + +#: src/unsafe-rust/solution.md +msgid "\"crab.rs\"" +msgstr "\"crab.rs\"" + +#: src/unsafe-rust/solution.md +msgid "\"//! Crab\\n\"" +msgstr "\"//! Crab\\n\"" + +#: src/unsafe-rust/solution.md +msgid "" +"**Safety Comments:** Each `unsafe` block is preceded by a `// SAFETY:` comment explaining " +"why the operation is safe. This is standard practice in Rust to aid auditing." +msgstr "" +"**Commentaires de sécurité :** Chaque bloc `unsafe` est précédé d'un commentaire `// " +"SAFETY:` expliquant pourquoi l'opération est sûre. Il s'agit d'une pratique courante en " +"Rust pour faciliter les audits." + +#: src/unsafe-rust/solution.md +msgid "**String conversions:** The code demonstrates the conversions required for FFI:" +msgstr "**String conversions:** The code demonstrates the conversions required for FFI:" + +#: src/unsafe-rust/solution.md +msgid "`&str` -> `CString`: To create a null-terminated string for C." +msgstr "" +"`&str` -> `CString` : Pour créer une chaîne de caractères terminée par un caractère nul " +"pour C." + +#: src/unsafe-rust/solution.md +msgid "`CString` -> `*const c_char`: To pass the pointer to C." +msgstr "`CString` -> `*const c_char`: Pour passer le pointeur à C." + +#: src/unsafe-rust/solution.md +msgid "`*const c_char` -> `&CStr`: To wrap the returned C string." +msgstr "`*const c_char` -> `&CStr`: Pour encapsuler la chaîne C renvoyée." + +#: src/unsafe-rust/solution.md +msgid "" +"`&CStr` -> `&[u8]` -> `&OsStr` -> `OsString`: To convert the bytes back to a Rust OS " +"string." +msgstr "" +"`&CStr` -> `&[u8]` -> `&OsStr` -> `OsString`: Pour reconvertir les octets en une chaîne " +"de caractères du système d'exploitation Rust." + +#: src/unsafe-rust/solution.md +msgid "" +"**RAII (`Drop`):** We implement `Drop` to call `closedir` automatically when the iterator " +"goes out of scope. This ensures we don't leak file descriptors." +msgstr "" +"**RAII (`Drop`) :** Nous implémentons `Drop` pour appeler automatiquement `closedir` " +"lorsque l'itérateur sort de sa portée. Cela nous permet d'éviter les fuites de " +"descripteurs de fichiers." + +#: src/unsafe-rust/solution.md +msgid "" +"**Iterator Interface:** We wrap the C API in a Rust `Iterator`, providing a safe and " +"idiomatic interface (`next` returns `Option`) to the underlying unsafe C " +"functions." +msgstr "" +"**Interface d'itérateur :** Nous encapsulons l'API C dans un `Itérateur` Rust, " +"fournissant une interface sûre et idiomatique (`next` renvoie `Option`) aux " +"fonctions C sous-jacentes non sécurisées." + +#: src/unsafe-rust/solution.md +msgid "" +"Explain that `CString` owns the data (like `String`), while `CStr` is a borrowed " +"reference (like `&str`)." +msgstr "" +"Expliquez que `CString` possède les données (comme `String`), tandis que `CStr` est une " +"référence empruntée (comme `&str`)." + +#: src/unsafe-rust/solution.md +msgid "The `OsStrExt` trait is needed on Unix systems to convert bytes directly to `OsStr`." +msgstr "" +"Le trait `OsStrExt` est nécessaire sur les systèmes Unix pour convertir directement les " +"octets en `OsStr`." + +#: src/android.md +#, fuzzy +msgid "Welcome to Rust in Android" +msgstr "Bienvenue au jour 1" + +#: src/android.md +#, fuzzy +msgid "" +"Rust is supported for system software on Android. This means that you can write new " +"services, libraries, drivers or even firmware in Rust (or improve existing code as " +"needed)." +msgstr "" +"Rust est pris en charge pour le développement de plates-formes natives sur Android. Cela " +"signifie que vous pouvez écrire de nouveaux services de système d'exploitation dans Rust, " +"ainsi que l'extension prestations existantes." + +#: src/android.md +msgid "" +"The speaker may mention any of the following given the increased use of Rust in Android:" +msgstr "" + +#: src/android.md +msgid "" +"Service example: [DNS over HTTP](https://security.googleblog.com/2022/07/dns-over-http3-" +"in-android.html)." +msgstr "" + +#: src/android.md +msgid "" +"Libraries: [Rutabaga Virtual Graphics Interface](https://crosvm.dev/book/appendix/" +"rutabaga_gfx.html)." +msgstr "" + +#: src/android.md +msgid "" +"Kernel Drivers: [Binder](https://lore.kernel.org/rust-for-linux/20231101-rust-binder-" +"v1-0-08ba9197f637@google.com/)." +msgstr "" + +#: src/android.md +msgid "" +"Firmware: [pKVM firmware](https://security.googleblog.com/2023/10/bare-metal-rust-in-" +"android.html)." +msgstr "" + +#: src/android/setup.md +#, fuzzy +msgid "" +"We will be using a Cuttlefish Android Virtual Device to test our code. Make sure you have " +"access to one or create a new one with:" +msgstr "" +"Nous utiliserons un appareil virtuel Android pour tester notre code. Assurez-vous que " +"vous avez accéder à un ou en créer un nouveau avec :" + +#: src/android/setup.md +#, fuzzy +msgid "" +"Please see the [Android Developer Codelab](https://source.android.com/docs/setup/start) " +"for details." +msgstr "" +"Veuillez consulter le \\[Développeur Android Codelab\\] (https://source.android.com/docs/" +"setup/start) pour plus de détails." + +#: src/android/setup.md +msgid "" +"The code on the following pages can be found in the [`src/android/` directory](https://" +"github.com/google/comprehensive-rust/tree/main/src/android) of the course material. " +"Please `git clone` the repository to follow along." +msgstr "" + +#: src/android/setup.md +msgid "" +"Cuttlefish is a reference Android device designed to work on generic Linux desktops. " +"MacOS support is also planned." +msgstr "" + +#: src/android/setup.md +msgid "" +"The Cuttlefish system image maintains high fidelity to real devices, and is the ideal " +"emulator to run many Rust use cases." +msgstr "" + +#: src/android/build-rules.md +#, fuzzy +msgid "The Android build system (Soong) supports Rust through several modules:" +msgstr "" +"Le système de construction Android (Soong) prend en charge Rust via un certain nombre de " +"modules :" + +#: src/android/build-rules.md +#, fuzzy +msgid "Module Type" +msgstr "Type de module" + +#: src/android/build-rules.md +#, fuzzy +msgid "Description" +msgstr "Descriptif" + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_binary`" +msgstr "`rust_binaire`" + +#: src/android/build-rules.md +#, fuzzy +msgid "Produces a Rust binary." +msgstr "Produit un binaire Rust." + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_library`" +msgstr "`rust_library`" + +#: src/android/build-rules.md +#, fuzzy +msgid "Produces a Rust library, and provides both `rlib` and `dylib` variants." +msgstr "Produit une bibliothèque Rust et fournit les variantes `rlib` et `dylib`." + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_ffi`" +msgstr "`rust_ffi`" + +#: src/android/build-rules.md +#, fuzzy +msgid "" +"Produces a Rust C library usable by `cc` modules, and provides both static and shared " +"variants." +msgstr "" +"Produit une bibliothèque Rust C utilisable par les modules `cc` et fournit des variantes " +"statiques et partagées." + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_proc_macro`" +msgstr "`rust_proc_macro`" + +#: src/android/build-rules.md +#, fuzzy +msgid "Produces a `proc-macro` Rust library. These are analogous to compiler plugins." +msgstr "" +"Produit une bibliothèque Rust `proc-macro`. Ceux-ci sont analogues aux plugins du " +"compilateur." + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_test`" +msgstr "`rust_test`" + +#: src/android/build-rules.md +#, fuzzy +msgid "Produces a Rust test binary that uses the standard Rust test harness." +msgstr "Produit un binaire de test Rust qui utilise le harnais de test Rust standard." + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_fuzz`" +msgstr "`rust_fuzz`" + +#: src/android/build-rules.md +#, fuzzy +msgid "Produces a Rust fuzz binary leveraging `libfuzzer`." +msgstr "Produit un exécutable Rust fuzz utilisant `libfuzzer`." + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_protobuf`" +msgstr "`rust_protobuf`" + +#: src/android/build-rules.md +#, fuzzy +msgid "" +"Generates source and produces a Rust library that provides an interface for a particular " +"protobuf." +msgstr "" +"Génère la source et produit une bibliothèque Rust qui fournit une interface pour un " +"protobuf particulier." + +#: src/android/build-rules.md +#, fuzzy +msgid "`rust_bindgen`" +msgstr "`rust_bindgen`" + +#: src/android/build-rules.md +#, fuzzy +msgid "" +"Generates source and produces a Rust library containing Rust bindings to C libraries." +msgstr "" +"Génère la source et produit une bibliothèque Rust contenant des liaisons Rust aux " +"bibliothèques C." + +#: src/android/build-rules.md +#, fuzzy +msgid "We will look at `rust_binary` and `rust_library` next." +msgstr "Nous examinerons ensuite `rust_binary` et `rust_library`." + +#: src/android/build-rules.md +msgid "Additional items the speaker may mention:" +msgstr "" + +#: src/android/build-rules.md +msgid "" +"Cargo is not optimized for multi-language repositories, and also downloads packages from " +"the internet." +msgstr "" + +#: src/android/build-rules.md +msgid "" +"For compliance and performance, Android must have crates in-tree. It must also " +"interoperate with C/C++/Java code. Soong fills that gap." +msgstr "" + +#: src/android/build-rules.md +msgid "" +"Soong has many similarities to [Bazel](https://bazel.build/), which is the open-source " +"variant of Blaze (used in google3)." +msgstr "" + +#: src/android/build-rules.md +msgid "Fun fact: Data from Star Trek is a Soong-type Android." +msgstr "" + +#: src/android/build-rules/binary.md +msgid "Rust Binaries" +msgstr "Binaires Rust" + +#: src/android/build-rules/binary.md +#, fuzzy +msgid "" +"Let's start with a simple application. At the root of an AOSP checkout, create the " +"following files:" +msgstr "" +"Commençons par une application simple. A la racine d'une caisse AOSP, créez les fichiers " +"suivants :" + +#: src/android/build-rules/binary.md src/android/build-rules/library.md +#, fuzzy +msgid "_hello_rust/Android.bp_:" +msgstr "_hello_rust/Android.bp_ :" + +#: src/android/build-rules/binary.md +msgid "\"hello_rust\"" +msgstr "" + +#: src/android/build-rules/binary.md src/android/build-rules/library.md +#: src/android/logging.md +#, fuzzy +msgid "\"src/main.rs\"" +msgstr "`src/main.rs` :" + +#: src/android/build-rules/binary.md src/android/build-rules/library.md +#, fuzzy +msgid "_hello_rust/src/main.rs_:" +msgstr "_hello_rust/src/main.rs_ :" + +#: src/android/build-rules/binary.md src/android/build-rules/library.md +msgid "//! Rust demo.\n" +msgstr "" + +#: src/android/build-rules/binary.md src/android/build-rules/library.md +msgid "/// Prints a greeting to standard output.\n" +msgstr "" + +#: src/android/build-rules/binary.md src/exercises/chromium/build-rules.md +msgid "\"Hello from Rust!\"" +msgstr "" + +#: src/android/build-rules/binary.md +#, fuzzy +msgid "You can now build, push, and run the binary:" +msgstr "Vous pouvez maintenant compiler, envoyer et exécuter le binaire :" + +#: src/android/build-rules/binary.md +msgid "" +"```shell\n" +"m hello_rust\n" +"adb push \"$ANDROID_PRODUCT_OUT/system/bin/hello_rust\" /data/local/tmp\n" +"adb shell /data/local/tmp/hello_rust\n" +"```" +msgstr "" + +#: src/android/build-rules/binary.md src/android/build-rules/library.md +msgid "Go through the build steps and demonstrate them running in your emulator." +msgstr "" + +#: src/android/build-rules/binary.md +msgid "" +"Notice the extensive documentation comments? The Android build rules enforce that all " +"modules have documentation. Try removing it and see what error you get." +msgstr "" + +#: src/android/build-rules/binary.md +msgid "" +"Stress that the Rust build rules look like the other Soong rules. This is by design, to " +"make using Rust as easy as C++ or Java." +msgstr "" + +#: src/android/build-rules/library.md +msgid "Rust Libraries" +msgstr "Bibliothèques Rust" + +#: src/android/build-rules/library.md +#, fuzzy +msgid "You use `rust_library` to create a new Rust library for Android." +msgstr "" +"Vous utilisez `rust_library` pour créer une nouvelle bibliothèque Rust pour Android." + +#: src/android/build-rules/library.md +#, fuzzy +msgid "Here we declare a dependency on two libraries:" +msgstr "Ici, nous déclarons une dépendance sur deux bibliothèques :" + +#: src/android/build-rules/library.md +#, fuzzy +msgid "`libgreeting`, which we define below," +msgstr "`libgreeting`, que nous définissons ci-dessous," + +#: src/android/build-rules/library.md +#, fuzzy +msgid "" +"`libtextwrap`, which is a crate already vendored in [`external/rust/android-crates-io/" +"crates/`](https://cs.android.com/android/platform/superproject/main/+/main:external/rust/" +"android-crates-io/crates/)." +msgstr "" +"`libtextwrap`, qui est une caisse déjà disponible dans \\[`external/rust/crates/" +"`\\]\\[crates\\]." + +#: src/android/build-rules/library.md +msgid "\"hello_rust_with_dep\"" +msgstr "" + +#: src/android/build-rules/library.md +msgid "\"libgreetings\"" +msgstr "" + +#: src/android/build-rules/library.md +msgid "\"libtextwrap\"" +msgstr "" + +#: src/android/build-rules/library.md +msgid "// Need this to avoid dynamic link error.\n" +msgstr "" + +#: src/android/build-rules/library.md +msgid "\"greetings\"" +msgstr "" + +#: src/android/build-rules/library.md src/android/aidl/example-service/service.md +#: src/android/testing.md src/android/interoperability/java.md +#, fuzzy +msgid "\"src/lib.rs\"" +msgstr "`src/main.rs` :" + +#: src/android/build-rules/library.md src/android/aidl/example-service/client.md +msgid "\"Bob\"" +msgstr "" + +#: src/android/build-rules/library.md +#, fuzzy +msgid "_hello_rust/src/lib.rs_:" +msgstr "_hello_rust/src/lib.rs_ :" + +#: src/android/build-rules/library.md +msgid "//! Greeting library.\n" +msgstr "" + +#: src/android/build-rules/library.md +msgid "/// Greet `name`.\n" +msgstr "" + +#: src/android/build-rules/library.md +msgid "\"Hello {name}, it is very nice to meet you!\"" +msgstr "" + +#: src/android/build-rules/library.md +#, fuzzy +msgid "You build, push, and run the binary like before:" +msgstr "Vous construisez, poussez et exécutez le binaire comme avant :" + +#: src/android/build-rules/library.md +msgid "" +"```shell\n" +"m hello_rust_with_dep\n" +"adb push \"$ANDROID_PRODUCT_OUT/system/bin/hello_rust_with_dep\" /data/local/tmp\n" +"adb shell /data/local/tmp/hello_rust_with_dep\n" +"```" +msgstr "" + +#: src/android/build-rules/library.md +msgid "" +"A Rust crate named `greetings` must be built by a rule called `libgreetings`. Note how " +"the Rust code uses the crate name, as is normal in Rust." +msgstr "" + +#: src/android/build-rules/library.md +msgid "" +"Again, the build rules enforce that we add documentation comments to all public items." +msgstr "" + +#: src/android/aidl.md +#, fuzzy +msgid "" +"Rust supports the [Android Interface Definition Language (AIDL)](https://developer." +"android.com/guide/components/aidl):" +msgstr "" +"Le [langage de définition d'interface Android (AIDL)](https://developer.android.com/guide/" +"components/aidl) est pris en charge dans Rust :" + +#: src/android/aidl.md +#, fuzzy +msgid "Rust code can call existing AIDL servers." +msgstr "Le code Rust peut appeler des serveurs AIDL existants," + +#: src/android/aidl.md +#, fuzzy +msgid "You can create new AIDL servers in Rust." +msgstr "Vous pouvez créer de nouveaux serveurs AIDL dans Rust." + +#: src/android/aidl.md +msgid "AIDL enables Android apps to interact with each other." +msgstr "" + +#: src/android/aidl.md +msgid "" +"Since Rust is a first-class citizen in this ecosystem, other processes on the device can " +"call Rust services." +msgstr "" + +#: src/android/aidl/birthday-service.md +msgid "" +"To illustrate using Rust with Binder, we will create a Binder interface. Then, we'll " +"implement the service and write a client that talks to it." +msgstr "" + +#: src/android/aidl/example-service/interface.md +#, fuzzy +msgid "AIDL Interfaces" +msgstr "Interfaces AIDL" + +#: src/android/aidl/example-service/interface.md +#, fuzzy +msgid "You declare the API of your service using an AIDL interface:" +msgstr "Vous déclarez l'API de votre service à l'aide d'une interface AIDL :" + +#: src/android/aidl/example-service/interface.md +#: src/android/aidl/example-service/service-bindings.md src/android/aidl/types/objects.md +#: src/android/aidl/types/parcelables.md src/android/aidl/types/file-descriptor.md +#, fuzzy +msgid "_birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl_:" +msgstr "_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService.aidl_ :" + +#: src/android/aidl/example-service/interface.md +#: src/android/aidl/example-service/service-bindings.md +#: src/android/aidl/example-service/changing-definition.md +msgid "/** Birthday service interface. */" +msgstr "" + +#: src/android/aidl/example-service/interface.md +#: src/android/aidl/example-service/service-bindings.md +#: src/android/aidl/example-service/changing-definition.md +msgid "/** Generate a Happy Birthday message. */" +msgstr "" + +#: src/android/aidl/example-service/interface.md +#, fuzzy +msgid "_birthday_service/aidl/Android.bp_:" +msgstr "_service_anniversaire/aidl/Android.bp_ :" + +#: src/android/aidl/example-service/interface.md +msgid "\"com.example.birthdayservice\"" +msgstr "" + +#: src/android/aidl/example-service/interface.md +#, fuzzy +msgid "\"com/example/birthdayservice/*.aidl\"" +msgstr "_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService.aidl_ :" + +#: src/android/aidl/example-service/interface.md +msgid "// Rust is not enabled by default\n" +msgstr "" + +#: src/android/aidl/example-service/interface.md +msgid "" +"Note that the directory structure under the `aidl/` directory needs to match the package " +"name used in the AIDL file, i.e. the package is `com.example.birthdayservice` and the " +"file is at `aidl/com/example/IBirthdayService.aidl`." +msgstr "" + +#: src/android/aidl/example-service/service-bindings.md +msgid "Generated Service API" +msgstr "" + +#: src/android/aidl/example-service/service-bindings.md +msgid "Binder generates a trait for each interface definition." +msgstr "" + +#: src/android/aidl/example-service/service-bindings.md +msgid "_out/soong/.intermediates/.../com_example_birthdayservice.rs_:" +msgstr "" + +#: src/android/aidl/example-service/service-bindings.md +msgid "" +"Your service will need to implement this trait, and your client will use this trait to " +"talk to the service." +msgstr "" + +#: src/android/aidl/example-service/service-bindings.md +msgid "" +"Point out how the generated function signature, specifically the argument and return " +"types, correspond to the interface definition." +msgstr "" + +#: src/android/aidl/example-service/service-bindings.md +msgid "" +"`String` for an argument results in a different Rust type than `String` as a return type." +msgstr "" + +#: src/android/aidl/example-service/service.md +#, fuzzy +msgid "Service Implementation" +msgstr "Mise en œuvre des services" + +#: src/android/aidl/example-service/service.md +#, fuzzy +msgid "We can now implement the AIDL service:" +msgstr "Nous pouvons maintenant implémenter le service AIDL :" + +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/changing-implementation.md +#: src/android/aidl/types/file-descriptor.md +#, fuzzy +msgid "_birthday_service/src/lib.rs_:" +msgstr "_service_anniversaire/src/lib.rs_ :" + +#: src/android/aidl/example-service/service.md +msgid "//! Implementation of the `IBirthdayService` AIDL interface.\n" +msgstr "" + +#: src/android/aidl/example-service/service.md +#, fuzzy +msgid "/// The `IBirthdayService` implementation.\n" +msgstr "Mise en œuvre des services" + +#: src/android/aidl/example-service/service.md +#: src/android/aidl/example-service/changing-implementation.md +#: src/android/aidl/types/file-descriptor.md +msgid "\"Happy Birthday {name}, congratulations with the {years} years!\"" +msgstr "" + +#: src/android/aidl/example-service/service.md src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "_birthday_service/Android.bp_:" +msgstr "_service_anniversaire/Android.bp_ :" + +#: src/android/aidl/example-service/service.md src/android/aidl/example-service/server.md +#, fuzzy +msgid "\"libbirthdayservice\"" +msgstr "_service_anniversaire/src/lib.rs_ :" + +#: src/android/aidl/example-service/service.md src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "\"birthdayservice\"" +msgstr "_service_anniversaire/src/lib.rs_ :" + +#: src/android/aidl/example-service/service.md src/android/aidl/example-service/server.md +#: src/android/aidl/example-service/client.md +msgid "\"com.example.birthdayservice-rust\"" +msgstr "" + +#: src/android/aidl/example-service/service.md +msgid "" +"Point out the path to the generated `IBirthdayService` trait, and explain why each of the " +"segments is necessary." +msgstr "" + +#: src/android/aidl/example-service/service.md +msgid "" +"Note that `wishHappyBirthday` and other AIDL IPC methods take `&self` (instead of `&mut " +"self`)." +msgstr "" + +#: src/android/aidl/example-service/service.md +msgid "" +"This is necessary because Binder responds to incoming requests on a thread pool, allowing " +"for multiple requests to be processed in parallel. This requires that the service methods " +"only get a shared reference to `self`." +msgstr "" + +#: src/android/aidl/example-service/service.md +msgid "" +"Any state that needs to be modified by the service will have to be put in something like " +"a `Mutex` to allow for safe mutation." +msgstr "" + +#: src/android/aidl/example-service/service.md +msgid "" +"The correct approach for managing service state depends heavily on the details of your " +"service." +msgstr "" + +#: src/android/aidl/example-service/service.md +msgid "" +"TODO: What does the `binder::Interface` trait do? Are there methods to override? Where is " +"the source?" +msgstr "" + +#: src/android/aidl/example-service/server.md +#, fuzzy +msgid "AIDL Server" +msgstr "Serveur AIDL" + +#: src/android/aidl/example-service/server.md +#, fuzzy +msgid "Finally, we can create a server which exposes the service:" +msgstr "Enfin, nous pouvons créer un serveur qui expose le service :" + +#: src/android/aidl/example-service/server.md +#, fuzzy +msgid "_birthday_service/src/server.rs_:" +msgstr "_service_anniversaire/src/server.rs_ :" + +#: src/android/aidl/example-service/server.md +msgid "//! Birthday service.\n" +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "/// Entry point for birthday service.\n" +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "\"Failed to register service\"" +msgstr "" + +#: src/android/aidl/example-service/server.md +#, fuzzy +msgid "\"birthday_server\"" +msgstr "_service_anniversaire/src/lib.rs_ :" + +#: src/android/aidl/example-service/server.md +#, fuzzy +msgid "\"src/server.rs\"" +msgstr "`src/main.rs` :" + +#: src/android/aidl/example-service/server.md src/android/aidl/example-service/client.md +msgid "// To avoid dynamic link error.\n" +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "" +"The process for taking a user-defined service implementation (in this case, the " +"`BirthdayService` type, which implements the `IBirthdayService`) and starting it as a " +"Binder service has multiple steps. This may appear more complicated than students are " +"used to if they've used Binder from C++ or another language. Explain to students why each " +"step is necessary." +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "Create an instance of your service type (`BirthdayService`)." +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "" +"Wrap the service object in the corresponding `Bn*` type (`BnBirthdayService` in this " +"case). This type is generated by Binder and provides common Binder functionality, similar " +"to the `BnBinder` base class in C++. Since Rust doesn't have inheritance, we use " +"composition, putting our `BirthdayService` within the generated `BnBinderService`." +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "" +"Call `add_service`, giving it a service identifier and your service object (the " +"`BnBirthdayService` object in the example)." +msgstr "" + +#: src/android/aidl/example-service/server.md +msgid "" +"Call `join_thread_pool` to add the current thread to Binder's thread pool and start " +"listening for connections." +msgstr "" + +#: src/android/aidl/example-service/deploy.md +#, fuzzy +msgid "We can now build, push, and start the service:" +msgstr "Nous pouvons maintenant créer, pousser et démarrer le service :" + +#: src/android/aidl/example-service/deploy.md +msgid "" +"```shell\n" +"m birthday_server\n" +"adb push \"$ANDROID_PRODUCT_OUT/system/bin/birthday_server\" /data/local/tmp\n" +"adb root\n" +"adb shell /data/local/tmp/birthday_server\n" +"```" +msgstr "" + +#: src/android/aidl/example-service/deploy.md +#, fuzzy +msgid "In another terminal, check that the service runs:" +msgstr "Dans un autre terminal, vérifiez que le service s'exécute :" + +#: src/android/aidl/example-service/deploy.md +#, fuzzy +msgid "You can also call the service with `service call`:" +msgstr "Vous pouvez également appeler le service avec `service call` :" + +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "AIDL Client" +msgstr "Client AIDL" + +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "Finally, we can create a Rust client for our new service." +msgstr "Enfin, nous pouvons créer un client Rust pour notre nouveau service." + +#: src/android/aidl/example-service/client.md +#: src/android/aidl/example-service/changing-implementation.md +#: src/android/aidl/types/objects.md src/android/aidl/types/parcelables.md +#: src/android/aidl/types/file-descriptor.md +#, fuzzy +msgid "_birthday_service/src/client.rs_:" +msgstr "_service_anniversaire/src/client.rs_ :" + +#: src/android/aidl/example-service/client.md +msgid "/// Call the birthday service.\n" +msgstr "" + +#: src/android/aidl/example-service/client.md src/android/aidl/types/objects.md +#: src/android/aidl/types/parcelables.md src/android/aidl/types/file-descriptor.md +msgid "\"Failed to connect to BirthdayService\"" +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "// Call the service.\n" +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "\"{msg}\"" +msgstr "" + +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "\"birthday_client\"" +msgstr "_service_anniversaire/src/client.rs_ :" + +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "\"src/client.rs\"" +msgstr "`src/main.rs` :" + +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "Notice that the client does not depend on `libbirthdayservice`." +msgstr "Notez que le client ne dépend pas de `libbirthdayservice`." + +#: src/android/aidl/example-service/client.md +#, fuzzy +msgid "Build, push, and run the client on your device:" +msgstr "Créez, transférez et exécutez le client sur votre appareil :" + +#: src/android/aidl/example-service/client.md +msgid "" +"```shell\n" +"m birthday_client\n" +"adb push \"$ANDROID_PRODUCT_OUT/system/bin/birthday_client\" /data/local/tmp\n" +"adb shell /data/local/tmp/birthday_client Charlie 60\n" +"```" +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "" +"`Strong` is the trait object representing the service that the " +"client has connected to." +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "" +"`Strong` is a custom smart pointer type for Binder. It handles both an in-process ref " +"count for the service trait object, and the global Binder ref count that tracks how many " +"processes have a reference to the object." +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "" +"Note that the trait object that the client uses to talk to the service uses the exact " +"same trait that the server implements. For a given Binder interface, there is a single " +"Rust trait generated that both client and server use." +msgstr "" + +#: src/android/aidl/example-service/client.md +msgid "" +"Use the same service identifier used when registering the service. This should ideally be " +"defined in a common crate that both the client and server can depend on." +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +#, fuzzy +msgid "" +"Let's extend the API: we'll let clients specify a list of lines for the birthday card:" +msgstr "" +"Étendons l'API avec plus de fonctionnalités : nous voulons laisser les clients spécifier " +"un liste des lignes pour la carte d'anniversaire :" + +#: src/android/aidl/example-service/changing-definition.md +msgid "This results in an updated trait definition for `IBirthdayService`:" +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "" +"Note how the `String[]` in the AIDL definition is translated as a `&[String]` in Rust, i." +"e. that idiomatic Rust types are used in the generated bindings wherever possible:" +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "`in` array arguments are translated to slices." +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "`out` and `inout` args are translated to `&mut Vec`." +msgstr "" + +#: src/android/aidl/example-service/changing-definition.md +msgid "Return values are translated to returning a `Vec`." +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "Updating Client and Service" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "Update the client and server code to account for the new API." +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "'\\n'" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "\"Habby birfday to yuuuuu\"" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "\"And also: many more\"" +msgstr "" + +#: src/android/aidl/example-service/changing-implementation.md +msgid "TODO: Move code snippets into project files where they'll actually be built?" +msgstr "" + +#: src/android/aidl/types.md +msgid "Working With AIDL Types" +msgstr "" + +#: src/android/aidl/types.md +msgid "AIDL types translate into the appropriate idiomatic Rust type:" +msgstr "" + +#: src/android/aidl/types.md +msgid "Primitive types map (mostly) to idiomatic Rust types." +msgstr "" + +#: src/android/aidl/types.md +msgid "Collection types like slices, `Vec`s and string types are supported." +msgstr "" + +#: src/android/aidl/types.md +msgid "" +"References to AIDL objects and file handles can be sent between clients and services." +msgstr "" + +#: src/android/aidl/types.md +msgid "File handles and parcelables are fully supported." +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "Primitive types map (mostly) idiomatically:" +msgstr "" + +#: src/android/aidl/types/primitives.md +#, fuzzy +msgid "AIDL Type" +msgstr "AIDL" + +#: src/android/aidl/types/primitives.md src/android/aidl/types/arrays.md +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "Rust Type" +msgstr "Rust by Example" + +#: src/android/aidl/types/primitives.md +msgid "Note" +msgstr "" + +#: src/android/aidl/types/primitives.md +#, fuzzy +msgid "`boolean`" +msgstr "`&[u8]`" + +#: src/android/aidl/types/primitives.md +msgid "`byte`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`i8`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "Note that bytes are signed." +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`u16`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "Note the usage of `u16`, NOT `u32`." +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`int`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`i32`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`long`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`i64`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`float`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`f32`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`double`" +msgstr "" + +#: src/android/aidl/types/primitives.md +msgid "`f64`" +msgstr "" + +#: src/android/aidl/types/arrays.md +msgid "" +"The array types (`T[]`, `byte[]`, and `List`) are translated to the appropriate Rust " +"array type depending on how they are used in the function signature:" +msgstr "" + +#: src/android/aidl/types/arrays.md +#, fuzzy +msgid "Position" +msgstr "Descriptif" + +#: src/android/aidl/types/arrays.md +msgid "`in` argument" +msgstr "" + +#: src/android/aidl/types/arrays.md +#, fuzzy +msgid "`&[T]`" +msgstr "Tranches" + +#: src/android/aidl/types/arrays.md +msgid "`out`/`inout` argument" +msgstr "" + +#: src/android/aidl/types/arrays.md +#, fuzzy +msgid "`&mut Vec`" +msgstr "`Vec`" + +#: src/android/aidl/types/arrays.md +msgid "Return" +msgstr "" + +#: src/android/aidl/types/arrays.md src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`Vec`" +msgstr "`Vec`" + +#: src/android/aidl/types/arrays.md +msgid "" +"In Android 13 or higher, fixed-size arrays are supported, i.e. `T[N]` becomes `[T; N]`. " +"Fixed-size arrays can have multiple dimensions (e.g. `int[3][4]`). In the Java backend, " +"fixed-size arrays are represented as array types." +msgstr "" + +#: src/android/aidl/types/arrays.md +msgid "Arrays in parcelable fields always get translated to `Vec`." +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "" +"AIDL objects can be sent either as a concrete AIDL type or as the type-erased `IBinder` " +"interface:" +msgstr "" + +#: src/android/aidl/types/objects.md +#, fuzzy +msgid "_birthday_service/aidl/com/example/birthdayservice/IBirthdayInfoProvider.aidl_:" +msgstr "_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService.aidl_ :" + +#: src/android/aidl/types/objects.md +msgid "/** The same thing, but using a binder object. */" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "/** The same thing, but using `IBinder`. */" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "/// Rust struct implementing the `IBirthdayInfoProvider` interface.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "// Create a binder object for the `IBirthdayInfoProvider` interface.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "// Send the binder object to the service.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "// Perform the same operation but passing the provider as an `SpIBinder`.\n" +msgstr "" + +#: src/android/aidl/types/objects.md +msgid "" +"Note the usage of `BnBirthdayInfoProvider`. This serves the same purpose as " +"`BnBirthdayService` that we saw previously." +msgstr "" + +#: src/android/aidl/types/parcelables.md +msgid "Binder for Rust supports sending parcelables directly:" +msgstr "" + +#: src/android/aidl/types/parcelables.md +#, fuzzy +msgid "_birthday_service/aidl/com/example/birthdayservice/BirthdayInfo.aidl_:" +msgstr "_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService.aidl_ :" + +#: src/android/aidl/types/parcelables.md +msgid "/** The same thing, but with a parcelable. */" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "" +"Files can be sent between Binder clients/servers using the `ParcelFileDescriptor` type:" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "/** The same thing, but loads info from a file. */" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "// Open a file and put the birthday info in it.\n" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"/data/local/tmp/birthday.info\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"{name}\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"{years}\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "// Create a `ParcelFileDescriptor` from the file and send it.\n" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "" +"// Convert the file descriptor to a `File`. `ParcelFileDescriptor` wraps\n" +" // an `OwnedFd`, which can be cloned and then used to create a `File`\n" +" // object.\n" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "\"Invalid file handle\"" +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "" +"`ParcelFileDescriptor` wraps an `OwnedFd`, and so can be created from a `File` (or any " +"other type that wraps an `OwnedFd`), and can be used to create a new `File` handle on the " +"other side." +msgstr "" + +#: src/android/aidl/types/file-descriptor.md +msgid "" +"Other types of file descriptors can be wrapped and sent, e.g. TCP, UDP, and UNIX sockets." +msgstr "" + +#: src/android/testing.md +#, fuzzy +msgid "Testing in Android" +msgstr "Rust pour Android" + +#: src/android/testing.md +msgid "" +"Building on [Testing](../testing.md), we will now look at how unit tests work in AOSP. " +"Use the `rust_test` module for your unit tests:" +msgstr "" + +#: src/android/testing.md +#, fuzzy +msgid "_testing/Android.bp_:" +msgstr "_hello_rust/Android.bp_ :" + +#: src/android/testing.md +msgid "\"libleftpad\"" +msgstr "" + +#: src/android/testing.md +msgid "\"leftpad\"" +msgstr "" + +#: src/android/testing.md +msgid "\"libleftpad_test\"" +msgstr "" + +#: src/android/testing.md +msgid "\"leftpad_test\"" +msgstr "" + +#: src/android/testing.md src/android/interoperability/with-c/run-our-binary.md +msgid "\"general-tests\"" +msgstr "" + +#: src/android/testing.md +msgid "\"libgoogletest_example\"" +msgstr "" + +#: src/android/testing.md +msgid "\"googletest_example\"" +msgstr "" + +#: src/android/testing.md +msgid "\"googletest.rs\"" +msgstr "" + +#: src/android/testing.md +msgid "\"libgoogletest_rust\"" +msgstr "" + +#: src/android/testing.md +msgid "\"libmockall_example\"" +msgstr "" + +#: src/android/testing.md +msgid "\"mockall_example\"" +msgstr "" + +#: src/android/testing.md +#, fuzzy +msgid "\"mockall.rs\"" +msgstr "`main.rs` :" + +#: src/android/testing.md +msgid "\"libmockall\"" +msgstr "" + +#: src/android/testing.md +#, fuzzy +msgid "_testing/src/lib.rs_:" +msgstr "_hello_rust/src/lib.rs_ :" + +#: src/android/testing.md +msgid "//! Left-padding library.\n" +msgstr "" + +#: src/android/testing.md +msgid "/// Left-pad `s` to `width`.\n" +msgstr "" + +#: src/android/testing.md +msgid "\"{s:>width$}\"" +msgstr "" + +#: src/android/testing.md +msgid "\" foo\"" +msgstr "" + +#: src/android/testing.md +msgid "\"foobar\"" +msgstr "" + +#: src/android/testing.md +#, fuzzy +msgid "You can now run the test with" +msgstr "Vous pouvez maintenant générer automatiquement les liaisons :" + +#: src/android/testing.md +#, fuzzy +msgid "The output looks like this:" +msgstr "L'approche globale ressemble à ceci:" + +#: src/android/testing.md +msgid "" +"```text\n" +"INFO: Elapsed time: 2.666s, Critical Path: 2.40s\n" +"INFO: 3 processes: 2 internal, 1 linux-sandbox.\n" +"INFO: Build completed successfully, 3 total actions\n" +"//comprehensive-rust-android/testing:libleftpad_test_host PASSED in 2.3s\n" +" PASSED libleftpad_test.tests::long_string (0.0s)\n" +" PASSED libleftpad_test.tests::short_string (0.0s)\n" +"Test cases: finished with 2 passing and 0 failing out of 2 test cases\n" +"```" +msgstr "" + +#: src/android/testing.md +msgid "" +"Notice how you only mention the root of the library crate. Tests are found recursively in " +"nested modules." +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"The [GoogleTest](https://docs.rs/googletest/) crate allows for flexible test assertions " +"using _matchers_:" +msgstr "" + +#: src/android/testing/googletest.md +msgid "\"bar\"" +msgstr "" + +#: src/android/testing/googletest.md +msgid "\"baz\"" +msgstr "" + +#: src/android/testing/googletest.md +msgid "\"xyz\"" +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"If we change the last element to `\"!\"`, the test fails with a structured error message " +"pin-pointing the error:" +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"GoogleTest is not part of the Rust Playground, so you need to run this example in a local " +"environment. Use `cargo add googletest` to quickly add it to an existing Cargo project." +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"The `use googletest::prelude::*;` line imports a number of [commonly used macros and " +"types](https://docs.rs/googletest/latest/googletest/prelude/index.html)." +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"This just scratches the surface, there are many builtin matchers. Consider going through " +"the first chapter of [\"Advanced testing for Rust applications\"](https://rust-exercises." +"com/advanced-testing/), a self-guided Rust course: it provides a guided introduction to " +"the library, with exercises to help you get comfortable with `googletest` macros, its " +"matchers and its overall philosophy." +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"A particularly nice feature is that mismatches in multi-line strings are shown as a diff:" +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"\"Memory safety found,\\n\\\n" +" Rust's strong typing guides the way,\\n\\\n" +" Secure code you'll write.\"" +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"\"Memory safety found,\\n\\\n" +" Rust's silly humor guides the way,\\n\\\n" +" Secure code you'll write.\"" +msgstr "" + +#: src/android/testing/googletest.md +msgid "shows a color-coded diff (colors not shown here):" +msgstr "" + +#: src/android/testing/googletest.md +msgid "" +"The crate is a Rust port of [GoogleTest for C++](https://google.github.io/googletest/)." +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"For mocking, [Mockall](https://docs.rs/mockall/) is a widely used library. You need to " +"refactor your code to use traits, which you can then quickly mock:" +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"Mockall is the recommended mocking library in Android (AOSP). There are other [mocking " +"libraries available on crates.io](https://crates.io/keywords/mock), in particular in the " +"area of mocking HTTP services. The other mocking libraries work in a similar fashion as " +"Mockall, meaning that they make it easy to get a mock implementation of a given trait." +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"Note that mocking is somewhat _controversial_: mocks allow you to completely isolate a " +"test from its dependencies. The immediate result is faster and more stable test " +"execution. On the other hand, the mocks can be configured wrongly and return output " +"different from what the real dependencies would do." +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"If at all possible, it is recommended that you use the real dependencies. As an example, " +"many databases allow you to configure an in-memory backend. This means that you get the " +"correct behavior in your tests, plus they are fast and will automatically clean up after " +"themselves." +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"Similarly, many web frameworks allow you to start an in-process server which binds to a " +"random port on `localhost`. Always prefer this over mocking away the framework since it " +"helps you test your code in the real environment." +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"Mockall is not part of the Rust Playground, so you need to run this example in a local " +"environment. Use `cargo add mockall` to quickly add Mockall to an existing Cargo project." +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"Mockall has extensive functionality. In particular, you can set up expectations which " +"depend on the arguments passed. Here we use this to mock a cat which becomes hungry 3 " +"hours after the last time it was fed:" +msgstr "" + +#: src/android/testing/mocking.md +msgid "" +"You can use `.times(n)` to limit the number of times a mock method can be called to `n` " +"--- the mock will automatically panic when dropped if this isn't satisfied." +msgstr "" + +#: src/android/logging.md +#, fuzzy +msgid "" +"You should use the `log` crate to automatically log to `logcat` (on-device) or `stdout` " +"(on-host):" +msgstr "" +"Vous devez utiliser la caisse `log` pour vous connecter automatiquement à `logcat` (sur " +"l'appareil) ou `stdout` (sur l'hôte) :" + +#: src/android/logging.md +#, fuzzy +msgid "_hello_rust_logs/Android.bp_:" +msgstr "_hello_rust_logs/Android.bp_ :" + +#: src/android/logging.md +#, fuzzy +msgid "\"hello_rust_logs\"" +msgstr "_hello_rust_logs/Android.bp_ :" + +#: src/android/logging.md +msgid "\"liblog_rust\"" +msgstr "" + +#: src/android/logging.md +msgid "\"liblogger\"" +msgstr "" + +#: src/android/logging.md +#, fuzzy +msgid "_hello_rust_logs/src/main.rs_:" +msgstr "_hello_rust_logs/src/main.rs_ :" + +#: src/android/logging.md +msgid "//! Rust logging demo.\n" +msgstr "" + +#: src/android/logging.md +msgid "/// Logs a greeting.\n" +msgstr "" + +#: src/android/logging.md +msgid "\"rust\"" +msgstr "" + +#: src/android/logging.md +msgid "\"Starting program.\"" +msgstr "" + +#: src/android/logging.md +msgid "\"Things are going fine.\"" +msgstr "" + +#: src/android/logging.md +msgid "\"Something went wrong!\"" +msgstr "" + +#: src/android/logging.md src/android/interoperability/with-c/run-our-binary.md +#: src/android/interoperability/with-c/rust.md +#, fuzzy +msgid "Build, push, and run the binary on your device:" +msgstr "Compilez, transférez et exécutez le binaire sur votre appareil :" + +#: src/android/logging.md +msgid "" +"```shell\n" +"m hello_rust_logs\n" +"adb push \"$ANDROID_PRODUCT_OUT/system/bin/hello_rust_logs\" /data/local/tmp\n" +"adb shell /data/local/tmp/hello_rust_logs\n" +"```" +msgstr "" + +#: src/android/logging.md +#, fuzzy +msgid "The logs show up in `adb logcat`:" +msgstr "Les journaux s'affichent dans `adb logcat` :" + +#: src/android/logging.md +msgid "" +"The logger implementation in `liblogger` is only needed in the final binary, if you're " +"logging from a library you only need the `log` facade crate." +msgstr "" + +#: src/android/interoperability.md +#, fuzzy +msgid "" +"Rust has excellent support for interoperability with other languages. This means that you " +"can:" +msgstr "" +"Rust a un excellent support pour l'interopérabilité avec d'autres langages. Ça signifie " +"Que tu peux:" + +#: src/android/interoperability.md +#, fuzzy +msgid "Call Rust functions from other languages." +msgstr "Appelez les fonctions Rust à partir d'autres langues." + +#: src/android/interoperability.md +#, fuzzy +msgid "Call functions written in other languages from Rust." +msgstr "Fonctions d'appel écrites dans d'autres langages depuis Rust." + +#: src/android/interoperability.md +#, fuzzy +msgid "" +"When you call functions in a foreign language, you're using a _foreign function " +"interface_, also known as FFI." +msgstr "" +"Lorsque vous appelez des fonctions dans une langue étrangère, nous disons que vous " +"utilisez un _interface de fonction étrangère_, également connue sous le nom de FFI." + +#: src/android/interoperability.md +msgid "" +"This is a key ability of Rust: compiled code becomes indistinguishable from compiled C or " +"C++ code." +msgstr "" + +#: src/android/interoperability.md +msgid "" +"Technically, we say that Rust can be compiled to the same [ABI](https://en.wikipedia.org/" +"wiki/Application_binary_interface) (application binary interface) as C code." +msgstr "" + +#: src/android/interoperability/with-c.md +#, fuzzy +msgid "Interoperability with C" +msgstr "Interopérabilité avec C" + +#: src/android/interoperability/with-c.md +#, fuzzy +msgid "" +"Rust has full support for linking object files with a C calling convention. Similarly, " +"you can export Rust functions and call them from C." +msgstr "" +"Rust prend entièrement en charge la liaison de fichiers objets avec une convention " +"d'appel C. De même, vous pouvez exporter des fonctions Rust et les appeler depuis C." + +#: src/android/interoperability/with-c.md +#, fuzzy +msgid "You can do it by hand if you want:" +msgstr "Vous pouvez le faire à la main si vous le souhaitez :" + +#: src/android/interoperability/with-c.md src/unsafe-deep-dive/ffi/abs.md +msgid "\"{x}, {abs_x}\"" +msgstr "" + +#: src/android/interoperability/with-c.md +#, fuzzy +msgid "" +"We already saw this in the [Safe FFI Wrapper exercise](../../unsafe-rust/exercise.md)." +msgstr "" +"Nous avons déjà vu cela dans le [Safe FFI Wrapper exercice](../../exercises/day-3/safe-" +"ffi-wrapper.md)." + +#: src/android/interoperability/with-c.md +#, fuzzy +msgid "This assumes full knowledge of the target platform. Not recommended for production." +msgstr "" +"Cela suppose une parfaite connaissance de la plateforme cible. Non recommandé pour " +"fabrication." + +#: src/android/interoperability/with-c.md +#, fuzzy +msgid "We will look at better options next." +msgstr "Nous examinerons ensuite de meilleures options." + +#: src/android/interoperability/with-c.md +msgid "" +"The [`\"C\"` part](https://doc.rust-lang.org/reference/items/external-blocks.html#abi) of " +"the `extern` block tells Rust that `abs` can be called using the C [ABI](https://en." +"wikipedia.org/wiki/Application_binary_interface) (application binary interface)." +msgstr "" + +#: src/android/interoperability/with-c.md +msgid "" +"The `safe fn abs` part tells Rust that `abs` is a safe function. By default, extern " +"functions are unsafe, but since `abs(x)` can't trigger undefined behavior with any `x`, " +"we can declare it safe." +msgstr "" + +#: src/android/interoperability/with-c/c-library.md +#, fuzzy +msgid "Let's first create a small C library:" +msgstr "Créez d'abord une petite bibliothèque C :" + +#: src/android/interoperability/with-c/c-library.md +#, fuzzy +msgid "_interoperability/bindgen/libbirthday.h_:" +msgstr "_interoperability/bindgen/libbirthday.h_ :" + +#: src/android/interoperability/with-c/c-library.md +#, fuzzy +msgid "_interoperability/bindgen/libbirthday.c_:" +msgstr "_interoperability/bindgen/libbirthday.c_ :" + +#: src/android/interoperability/with-c/c-library.md +msgid "" +msgstr "" + +#: src/android/interoperability/with-c/c-library.md +#: src/android/interoperability/with-c/bindgen.md +msgid "\"libbirthday.h\"" +msgstr "" + +#: src/android/interoperability/with-c/c-library.md +msgid "\"+--------------\\n\"" +msgstr "" + +#: src/android/interoperability/with-c/c-library.md +msgid "\"| Happy Birthday %s!\\n\"" +msgstr "" + +#: src/android/interoperability/with-c/c-library.md +msgid "\"| Congratulations with the %i years!\\n\"" +msgstr "" + +#: src/android/interoperability/with-c/c-library.md +#, fuzzy +msgid "Add this to your `Android.bp` file:" +msgstr "Ajoutez ceci à votre fichier `Android.bp` :" + +#: src/android/interoperability/with-c/c-library.md +#: src/android/interoperability/with-c/bindgen.md +#: src/android/interoperability/with-c/run-our-binary.md +#, fuzzy +msgid "_interoperability/bindgen/Android.bp_:" +msgstr "_interopérabilité/bindgen/Android.bp_ :" + +#: src/android/interoperability/with-c/c-library.md +#: src/android/interoperability/with-c/bindgen.md +msgid "\"libbirthday\"" +msgstr "" + +#: src/android/interoperability/with-c/c-library.md +msgid "\"libbirthday.c\"" +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "Using Bindgen" +msgstr "Utiliser Bindgen" + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "" +"The [bindgen](https://rust-lang.github.io/rust-bindgen/introduction.html) tool can auto-" +"generate bindings from a C header file." +msgstr "" +"L'outil [bindgen](https://rust-lang.github.io/rust-bindgen/introduction.html) peut " +"générer automatiquement des liaisons à partir d'un fichier d'en-tête C." + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "Create a wrapper header file for the library (not strictly needed in this example):" +msgstr "" +"Créez un fichier d'en-tête wrapper pour la bibliothèque (pas strictement nécessaire dans " +"ce exemple):" + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "_interoperability/bindgen/libbirthday_wrapper.h_:" +msgstr "_interoperability/bindgen/libbirthday_wrapper.h_ :" + +#: src/android/interoperability/with-c/bindgen.md +msgid "\"libbirthday_bindgen\"" +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "\"birthday_bindgen\"" +msgstr "`rust_bindgen`" + +#: src/android/interoperability/with-c/bindgen.md +msgid "\"libbirthday_wrapper.h\"" +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +msgid "\"bindings\"" +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "Finally, we can use the bindings in our Rust program:" +msgstr "Enfin, nous pouvons utiliser les liaisons dans notre programme Rust :" + +#: src/android/interoperability/with-c/bindgen.md +msgid "\"print_birthday_card\"" +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "\"main.rs\"" +msgstr "`main.rs` :" + +#: src/android/interoperability/with-c/bindgen.md +#, fuzzy +msgid "_interoperability/bindgen/main.rs_:" +msgstr "_interopérabilité/bindgen/main.rs_ :" + +#: src/android/interoperability/with-c/bindgen.md +msgid "//! Bindgen demo.\n" +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +msgid "" +"// SAFETY: The pointer we pass is valid because it came from a Rust\n" +" // reference, and the `name` it contains refers to `name` above which also\n" +" // remains valid. `print_card` doesn't store either pointer to use later\n" +" // after it returns.\n" +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +msgid "The Android build rules will automatically call `bindgen` for you behind the scenes." +msgstr "" + +#: src/android/interoperability/with-c/bindgen.md +msgid "" +"Notice that the Rust code in `main` is still hard to write. It is good practice to " +"encapsulate the output of `bindgen` in a Rust library which exposes a safe interface to " +"caller." +msgstr "" + +#: src/android/interoperability/with-c/run-our-binary.md +msgid "" +"```shell\n" +"m print_birthday_card\n" +"adb push \"$ANDROID_PRODUCT_OUT/system/bin/print_birthday_card\" /data/local/tmp\n" +"adb shell /data/local/tmp/print_birthday_card\n" +"```" +msgstr "" + +#: src/android/interoperability/with-c/run-our-binary.md +#, fuzzy +msgid "Finally, we can run auto-generated tests to ensure the bindings work:" +msgstr "" +"Enfin, nous pouvons exécuter des tests générés automatiquement pour nous assurer que les " +"liaisons fonctionnent :" + +#: src/android/interoperability/with-c/run-our-binary.md +msgid "\"libbirthday_bindgen_test\"" +msgstr "" + +#: src/android/interoperability/with-c/run-our-binary.md +msgid "\":libbirthday_bindgen\"" +msgstr "" + +#: src/android/interoperability/with-c/run-our-binary.md +msgid "\"none\"" +msgstr "" + +#: src/android/interoperability/with-c/run-our-binary.md +msgid "// Generated file, skip linting\n" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +#, fuzzy +msgid "Exporting Rust functions and types to C is easy. Here's a simple Rust library:" +msgstr "Exporter des fonctions et des types Rust vers C est simple :" + +#: src/android/interoperability/with-c/rust-library.md +#, fuzzy +msgid "_interoperability/rust/libanalyze/analyze.rs_" +msgstr "_interopérabilité/rust/libanalyze/analyze.rs_" + +#: src/android/interoperability/with-c/rust-library.md +msgid "//! Rust FFI demo.\n" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +msgid "" +"/// Analyze the numbers.\n" +"// SAFETY: There is no other global function of this name.\n" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +msgid "\"x ({x}) is smallest!\"" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +msgid "\"y ({y}) is probably larger than x ({x})\"" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +#, fuzzy +msgid "_interoperability/rust/libanalyze/Android.bp_" +msgstr "_interopérabilité/rust/libanalyze/Android.bp_" + +#: src/android/interoperability/with-c/rust-library.md +#: src/android/interoperability/with-c/rust.md +msgid "\"libanalyze_ffi\"" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +msgid "\"analyze_ffi\"" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +msgid "\"analyze.rs\"" +msgstr "" + +#: src/android/interoperability/with-c/rust-library.md +#, fuzzy +msgid "" +"`#[unsafe(no_mangle)]` disables Rust's usual name mangling, so the exported symbol will " +"just be the name of the function. You can also use `#[unsafe(export_name = " +"\"some_name\")]` to specify whatever name you want." +msgstr "" +"`#[no_mangle]` désactive la modification du nom habituel de Rust, de sorte que le symbole " +"exporté sera simplement le nom de la fonction. Vous pouvez également utiliser " +"`#[export_name = \"some_name\"]` pour spécifier le nom que vous voulez." + +#: src/android/interoperability/with-c/rust.md +#, fuzzy +msgid "Calling Rust" +msgstr "Appeler Rust" + +#: src/android/interoperability/with-c/rust.md +#, fuzzy +msgid "We can now call this from a C binary:" +msgstr "Nous pouvons maintenant appeler cela à partir d'un binaire C :" + +#: src/android/interoperability/with-c/rust.md +#, fuzzy +msgid "_interoperability/rust/libanalyze/analyze.h_" +msgstr "_interopérabilité/rust/libanalyze/analyze.h_" + +#: src/android/interoperability/with-c/rust.md +#, fuzzy +msgid "_interoperability/rust/analyze/main.c_" +msgstr "_interoperability/rust/analyze/main.c_" + +#: src/android/interoperability/with-c/rust.md +msgid "\"analyze.h\"" +msgstr "" + +#: src/android/interoperability/with-c/rust.md +msgid "_interoperability/rust/analyze/Android.bp_" +msgstr "_interoperability/rust/analyze/Android.bp_" + +#: src/android/interoperability/with-c/rust.md +msgid "\"analyze_numbers\"" +msgstr "" + +#: src/android/interoperability/with-c/rust.md +msgid "\"main.c\"" +msgstr "" + +#: src/android/interoperability/with-c/rust.md +msgid "" +"```shell\n" +"m analyze_numbers\n" +"adb push \"$ANDROID_PRODUCT_OUT/system/bin/analyze_numbers\" /data/local/tmp\n" +"adb shell /data/local/tmp/analyze_numbers\n" +"```" +msgstr "" + +#: src/android/interoperability/cpp.md +#, fuzzy +msgid "The [CXX crate](https://cxx.rs/) enables safe interoperability between Rust and C++." +msgstr "" +"La [caisse CXX](https://cxx.rs/) permet de faire une interopérabilité sûre entre Rust et " +"C++." + +#: src/android/interoperability/cpp.md +#, fuzzy +msgid "The overall approach looks like this:" +msgstr "L'approche globale ressemble à ceci:" + +#: src/android/interoperability/cpp/bridge.md +msgid "" +"CXX relies on a description of the function signatures that will be exposed from each " +"language to the other. You provide this description using extern blocks in a Rust module " +"annotated with the `#[cxx::bridge]` attribute macro." +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +msgid "\"org::blobstore\"" +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +msgid "// Shared structs with fields visible to both languages.\n" +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +#: src/android/interoperability/cpp/generated-cpp.md +msgid "// Rust types and signatures exposed to C++.\n" +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +#: src/android/interoperability/cpp/rust-bridge.md +#: src/android/interoperability/cpp/generated-cpp.md +#: src/android/interoperability/cpp/rust-result.md +#: src/chromium/interoperability-with-cpp/example-bindings.md +#: src/chromium/interoperability-with-cpp/error-handling-qr.md +#: src/chromium/interoperability-with-cpp/error-handling-png.md +#, fuzzy +msgid "\"Rust\"" +msgstr "Rustdoc" + +#: src/android/interoperability/cpp/bridge.md src/android/interoperability/cpp/cpp-bridge.md +msgid "// C++ types and signatures exposed to Rust.\n" +msgstr "" + +#: src/android/interoperability/cpp/bridge.md src/android/interoperability/cpp/cpp-bridge.md +#: src/android/interoperability/cpp/cpp-exception.md +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "\"C++\"" +msgstr "" + +#: src/android/interoperability/cpp/bridge.md src/android/interoperability/cpp/cpp-bridge.md +msgid "\"include/blobstore.h\"" +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +msgid "The bridge is generally declared in an `ffi` module within your crate." +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +msgid "" +"From the declarations made in the bridge module, CXX will generate matching Rust and C++ " +"type/function definitions in order to expose those items to both languages." +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +msgid "" +"To view the generated Rust code, use [cargo-expand](https://github.com/dtolnay/cargo-" +"expand) to view the expanded proc macro. For most of the examples you would use `cargo " +"expand ::ffi` to expand just the `ffi` module (though this doesn't apply for Android " +"projects)." +msgstr "" + +#: src/android/interoperability/cpp/bridge.md +msgid "To view the generated C++ code, look in `target/cxxbridge`." +msgstr "" + +#: src/android/interoperability/cpp/rust-bridge.md +msgid "Rust Bridge Declarations" +msgstr "" + +#: src/android/interoperability/cpp/rust-bridge.md +msgid "// Opaque type\n" +msgstr "" + +#: src/android/interoperability/cpp/rust-bridge.md +msgid "// Method on `MyType`\n" +msgstr "" + +#: src/android/interoperability/cpp/rust-bridge.md +#, fuzzy +msgid "// Free function\n" +msgstr "Fonctions" + +#: src/android/interoperability/cpp/rust-bridge.md +msgid "" +"Items declared in the `extern \"Rust\"` reference items that are in scope in the parent " +"module." +msgstr "" + +#: src/android/interoperability/cpp/rust-bridge.md +msgid "" +"The CXX code generator uses your `extern \"Rust\"` section(s) to produce a C++ header " +"file containing the corresponding C++ declarations. The generated header has the same " +"path as the Rust source file containing the bridge, except with a .rs.h file extension." +msgstr "" + +#: src/android/interoperability/cpp/generated-cpp.md +msgid "Results in (roughly) the following C++:" +msgstr "" + +#: src/android/interoperability/cpp/cpp-bridge.md +msgid "C++ Bridge Declarations" +msgstr "" + +#: src/android/interoperability/cpp/cpp-bridge.md +msgid "Results in (roughly) the following Rust:" +msgstr "" + +#: src/android/interoperability/cpp/cpp-bridge.md +msgid "\"org$blobstore$cxxbridge1$new_blobstore_client\"" +msgstr "" + +#: src/android/interoperability/cpp/cpp-bridge.md +msgid "\"org$blobstore$cxxbridge1$BlobstoreClient$put\"" +msgstr "" + +#: src/android/interoperability/cpp/cpp-bridge.md +msgid "" +"The programmer does not need to promise that the signatures they have typed in are " +"accurate. CXX performs static assertions that the signatures exactly correspond with what " +"is declared in C++." +msgstr "" + +#: src/android/interoperability/cpp/cpp-bridge.md +msgid "" +"`unsafe extern` blocks allow you to declare C++ functions that are safe to call from Rust." +msgstr "" + +#: src/android/interoperability/cpp/shared-types.md +msgid "// A=1, J=11, Q=12, K=13\n" +msgstr "" + +#: src/android/interoperability/cpp/shared-types.md +msgid "Only C-like (unit) enums are supported." +msgstr "" + +#: src/android/interoperability/cpp/shared-types.md +msgid "" +"A limited number of traits are supported for `#[derive()]` on shared types. Corresponding " +"functionality is also generated for the C++ code, e.g. if you derive `Hash` also " +"generates an implementation of `std::hash` for the corresponding C++ type." +msgstr "" + +#: src/android/interoperability/cpp/shared-enums.md +#, fuzzy +msgid "Generated Rust:" +msgstr "Rust non sécurisé (_unsafe_)" + +#: src/android/interoperability/cpp/shared-enums.md +msgid "Generated C++:" +msgstr "" + +#: src/android/interoperability/cpp/shared-enums.md +msgid "" +"On the Rust side, the code generated for shared enums is actually a struct wrapping a " +"numeric value. This is because it is not UB in C++ for an enum class to hold a value " +"different from all of the listed variants, and our Rust representation needs to have the " +"same behavior." +msgstr "" + +#: src/android/interoperability/cpp/rust-result.md +msgid "\"fallible1 requires depth > 0\"" +msgstr "" + +#: src/android/interoperability/cpp/rust-result.md +msgid "\"Success!\"" +msgstr "" + +#: src/android/interoperability/cpp/rust-result.md +msgid "Rust functions that return `Result` are translated to exceptions on the C++ side." +msgstr "" + +#: src/android/interoperability/cpp/rust-result.md +msgid "" +"The exception thrown will always be of type `rust::Error`, which primarily exposes a way " +"to get the error message string. The error message will come from the error type's " +"`Display` impl." +msgstr "" + +#: src/android/interoperability/cpp/rust-result.md +msgid "" +"A panic unwinding from Rust to C++ will always cause the process to immediately terminate." +msgstr "" + +#: src/android/interoperability/cpp/cpp-exception.md +msgid "\"example/include/example.h\"" +msgstr "" + +#: src/android/interoperability/cpp/cpp-exception.md +msgid "\"Error: {}\"" +msgstr "" + +#: src/android/interoperability/cpp/cpp-exception.md +msgid "" +"C++ functions declared to return a `Result` will catch any thrown exception on the C++ " +"side and return it as an `Err` value to the calling Rust function." +msgstr "" + +#: src/android/interoperability/cpp/cpp-exception.md +msgid "" +"If an exception is thrown from an extern \"C++\" function that is not declared by the CXX " +"bridge to return `Result`, the program calls C++'s `std::terminate`. The behavior is " +"equivalent to the same exception being thrown through a `noexcept` C++ function." +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "C++ Type" +msgstr "Exemple C++" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`rust::String`" +msgstr "`rust_bindgen`" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`&str`" +msgstr "`&str`" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`rust::Str`" +msgstr "`rust_test`" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`CxxString`" +msgstr "String" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`std::string`" +msgstr "String" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "`&[T]`/`&mut [T]`" +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`rust::Slice`" +msgstr "`rust_ffi`" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "`rust::Box`" +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "`UniquePtr`" +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "`std::unique_ptr`" +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`rust::Vec`" +msgstr "`mpsc::Récepteur`" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`CxxVector`" +msgstr "`Cellule`" + +#: src/android/interoperability/cpp/type-mapping.md +#, fuzzy +msgid "`std::vector`" +msgstr "`mpsc::Récepteur`" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "" +"These types can be used in the fields of shared structs and the arguments and returns of " +"extern functions." +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "" +"Note that Rust's `String` does not map directly to `std::string`. There are a few reasons " +"for this:" +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "`std::string` does not uphold the UTF-8 invariant that `String` requires." +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "" +"The two types have different layouts in memory and so can't be passed directly between " +"languages." +msgstr "" + +#: src/android/interoperability/cpp/type-mapping.md +msgid "" +"`std::string` requires move constructors that don't match Rust's move semantics, so a " +"`std::string` can't be passed by value to Rust." +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +#: src/android/interoperability/cpp/android-build-cpp.md +#: src/android/interoperability/cpp/android-build-rust.md +#, fuzzy +msgid "Building in Android" +msgstr "Rust pour Android" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "" +"Create two genrules: One to generate the CXX header, and one to generate the CXX source " +"file. These are then used as inputs to the `cc_library_static`." +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "" +"// Generate a C++ header containing the C++ bindings\n" +"// to the Rust exported functions in lib.rs.\n" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "\"libcxx_test_bridge_header\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "\"cxxbridge\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "\"$(location cxxbridge) $(in) --header > $(out)\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +#: src/android/interoperability/cpp/android-build-rust.md +msgid "\"lib.rs\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "\"lib.rs.h\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "// Generate the C++ code that Rust calls into.\n" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "\"libcxx_test_bridge_code\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "\"$(location cxxbridge) $(in) > $(out)\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "\"lib.rs.cc\"" +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "" +"The `cxxbridge` tool is a standalone tool that generates the C++ side of the bridge " +"module. It is included in Android and available as a Soong tool." +msgstr "" + +#: src/android/interoperability/cpp/android-cpp-genrules.md +msgid "" +"By convention, if your Rust source file is `lib.rs` your header file will be named `lib." +"rs.h` and your source file will be named `lib.rs.cc`. This naming convention isn't " +"enforced, though." +msgstr "" + +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "" +"Create a `cc_library_static` to build the C++ library, including the CXX generated header " +"and source file." +msgstr "" + +#: src/android/interoperability/cpp/android-build-cpp.md +#: src/android/interoperability/cpp/android-build-rust.md +msgid "\"libcxx_test_cpp\"" +msgstr "" + +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "\"cxx_test.cpp\"" +msgstr "" + +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "\"cxx-bridge-header\"" +msgstr "" + +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "" +"Point out that `libcxx_test_bridge_header` and `libcxx_test_bridge_code` are the " +"dependencies for the CXX-generated C++ bindings. We'll show how these are setup on the " +"next slide." +msgstr "" + +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "" +"Note that you also need to depend on the `cxx-bridge-header` library in order to pull in " +"common CXX definitions." +msgstr "" + +#: src/android/interoperability/cpp/android-build-cpp.md +msgid "" +"Full docs for using CXX in Android can be found in [the Android docs](https://source." +"android.com/docs/setup/build/rust/building-rust-modules/android-rust-patterns#rust-cpp-" +"interop-using-cxx). You may want to share that link with the class so that students know " +"where they can find these instructions again in the future." +msgstr "" + +#: src/android/interoperability/cpp/android-build-rust.md +msgid "Create a `rust_binary` that depends on `libcxx` and your `cc_library_static`." +msgstr "" + +#: src/android/interoperability/cpp/android-build-rust.md +msgid "\"cxx_test\"" +msgstr "" + +#: src/android/interoperability/cpp/android-build-rust.md +msgid "\"libcxx\"" +msgstr "" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "Interoperability with Java" +msgstr "Interopérabilité avec Java" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "" +"Java can load shared objects via [Java Native Interface (JNI)](https://en.wikipedia.org/" +"wiki/Java_Native_Interface). The [`jni` crate](https://docs.rs/jni/) allows you to create " +"a compatible library." +msgstr "" +"Java peut charger des objets partagés via [Java Native Interface (JNI)](https://en." +"wikipedia.org/wiki/Java_Native_Interface). Le [`jni` crate](https://docs.rs/jni/) vous " +"permet de créer une bibliothèque compatible." + +#: src/android/interoperability/java.md +#, fuzzy +msgid "First, we create a Rust function to export to Java:" +msgstr "Tout d'abord, nous créons une fonction Rust à exporter vers Java :" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "_interoperability/java/src/lib.rs_:" +msgstr "_interopérabilité/java/src/lib.rs_ :" + +#: src/android/interoperability/java.md +msgid "//! Rust <-> Java FFI demo.\n" +msgstr "" + +#: src/android/interoperability/java.md +msgid "" +"/// HelloWorld::hello method implementation.\n" +"// SAFETY: There is no other global function of this name.\n" +msgstr "" + +#: src/android/interoperability/java.md +msgid "\"system\"" +msgstr "" + +#: src/android/interoperability/java.md +msgid "\"Hello, {input}!\"" +msgstr "" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "_interoperability/java/Android.bp_:" +msgstr "_interopérabilité/java/Android.bp_ :" + +#: src/android/interoperability/java.md +msgid "\"libhello_jni\"" +msgstr "" + +#: src/android/interoperability/java.md +msgid "\"hello_jni\"" +msgstr "" + +#: src/android/interoperability/java.md +msgid "\"libjni\"" +msgstr "" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "We then call this function from Java:" +msgstr "Enfin, nous pouvons appeler cette fonction depuis Java :" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "_interoperability/java/HelloWorld.java_:" +msgstr "_interopérabilité/java/HelloWorld.java_ :" + +#: src/android/interoperability/java.md +msgid "\"helloworld_jni\"" +msgstr "" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "\"HelloWorld.java\"" +msgstr "Bonjour le monde!" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "\"HelloWorld\"" +msgstr "Bonjour le monde!" + +#: src/android/interoperability/java.md +#, fuzzy +msgid "Finally, you can build, sync, and run the binary:" +msgstr "Enfin, vous pouvez créer, synchroniser et exécuter le binaire :" + +#: src/android/interoperability/java.md +msgid "" +"The `unsafe(no_mangle)` attribute instructs Rust to emit the `Java_HelloWorld_hello` " +"symbol exactly as written. This is important so that Java can recognize the symbol as a " +"`hello` method on the `HelloWorld` class." +msgstr "" + +#: src/android/interoperability/java.md +msgid "" +"By default, Rust will mangle (rename) symbols so that a binary can link in two versions " +"of the same Rust crate." +msgstr "" + +#: src/chromium.md +#, fuzzy +msgid "Welcome to Rust in Chromium" +msgstr "Bienvenue au jour 1" + +#: src/chromium.md +msgid "" +"Rust is supported for third-party libraries in Chromium, with first-party glue code to " +"connect between Rust and existing Chromium C++ code." +msgstr "" + +#: src/chromium.md +msgid "" +"Today, we'll call into Rust to do something silly with strings. If you've got a corner of " +"the code where you're displaying a UTF-8 string to the user, feel free to follow this " +"recipe in your part of the codebase instead of the exact part we talk about." +msgstr "" + +#: src/chromium/setup.md +msgid "" +"Make sure you can build and run Chromium. Any platform and set of build flags is OK, so " +"long as your code is relatively recent (commit position 1223636 onwards, corresponding to " +"November 2023):" +msgstr "" + +#: src/chromium/setup.md +msgid "" +"(A component, debug build is recommended for quickest iteration time. This is the " +"default!)" +msgstr "" + +#: src/chromium/setup.md +msgid "" +"See [How to build Chromium](https://www.chromium.org/developers/how-tos/get-the-code/) if " +"you aren't already at that point. Be warned: setting up to build Chromium takes time." +msgstr "" + +#: src/chromium/setup.md +msgid "It's also recommended that you have Visual Studio code installed." +msgstr "" + +#: src/chromium/setup.md +msgid "About the exercises" +msgstr "" + +#: src/chromium/setup.md +msgid "" +"This part of the course has a series of exercises that build on each other. We'll be " +"doing them spread throughout the course instead of just at the end. If you don't have " +"time to complete a certain part, don't worry: you can catch up in the next slot." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"The Rust community typically uses `cargo` and libraries from [crates.io](https://crates." +"io/). Chromium is built using `gn` and `ninja` and a curated set of dependencies." +msgstr "" + +#: src/chromium/cargo.md +msgid "When writing code in Rust, your choices are:" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Use `gn` and `ninja` with the help of the templates from `//build/rust/*.gni` (e.g. " +"`rust_static_library` that we'll meet later). This uses Chromium's audited toolchain and " +"crates." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Use `cargo`, but [restrict yourself to Chromium's audited toolchain and crates](https://" +"chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/rust.md#Using-cargo)" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Use `cargo`, trusting a [toolchain](https://rustup.rs/) and/or [crates downloaded from " +"the internet](https://crates.io/)" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"From here on we'll be focusing on `gn` and `ninja`, because this is how Rust code can be " +"built into the Chromium browser. At the same time, Cargo is an important part of the Rust " +"ecosystem and you should keep it in your toolbox." +msgstr "" + +#: src/chromium/cargo.md +#, fuzzy +msgid "Mini exercise" +msgstr "Exercices" + +#: src/chromium/cargo.md +msgid "Split into small groups and:" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Brainstorm scenarios where `cargo` may offer an advantage and assess the risk profile of " +"these scenarios." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Discuss which tools, libraries, and groups of people need to be trusted when using `gn` " +"and `ninja`, offline `cargo`, etc." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Ask students to avoid peeking at the speaker notes before completing the exercise. " +"Assuming folks taking the course are physically together, ask them to discuss in small " +"groups of 3-4 people." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Notes/hints related to the first part of the exercise (\"scenarios where Cargo may offer " +"an advantage\"):" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"It's fantastic that when writing a tool, or prototyping a part of Chromium, one has " +"access to the rich ecosystem of crates.io libraries. There is a crate for almost anything " +"and they are typically quite pleasant to use. (`clap` for command-line parsing, `serde` " +"for serializing/deserializing to/from various formats, `itertools` for working with " +"iterators, etc.)." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"`cargo` makes it easy to try a library (just add a single line to `Cargo.toml` and start " +"writing code)" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"It may be worth comparing how CPAN helped make `perl` a popular choice. Or comparing with " +"`python` + `pip`." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Development experience is made really nice not only by core Rust tools (e.g. using " +"`rustup` to switch to a different `rustc` version when testing a crate that needs to work " +"on nightly, current stable, and older stable) but also by an ecosystem of third-party " +"tools (e.g. Mozilla provides `cargo vet` for streamlining and sharing security audits; " +"`criterion` crate gives a streamlined way to run benchmarks)." +msgstr "" + +#: src/chromium/cargo.md +msgid "`cargo` makes it easy to add a tool via `cargo install --locked cargo-vet`." +msgstr "" + +#: src/chromium/cargo.md +msgid "It may be worth comparing with Chrome Extensions or VScode extensions." +msgstr "" + +#: src/chromium/cargo.md +msgid "Broad, generic examples of projects where `cargo` may be the right choice:" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Perhaps surprisingly, Rust is becoming increasingly popular in the industry for writing " +"command line tools. The breadth and ergonomics of libraries is comparable to Python, " +"while being more robust (thanks to the rich type system) and running faster (as a " +"compiled, rather than interpreted language)." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Participating in the Rust ecosystem requires using standard Rust tools like Cargo. " +"Libraries that want to get external contributions, and want to be used outside of " +"Chromium (e.g. in Bazel or Android/Soong build environments) should use Cargo." +msgstr "" + +#: src/chromium/cargo.md +msgid "Examples of Chromium-related projects that are `cargo`\\-based:" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"`serde_json_lenient` (experimented with in other parts of Google which resulted in PRs " +"with performance improvements)" +msgstr "" + +#: src/chromium/cargo.md +msgid "Fontations libraries like `font-types`" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"`gnrt` tool (we will meet it later in the course) which depends on `clap` for command-" +"line parsing and on `toml` for configuration files." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Disclaimer: a unique reason for using `cargo` was unavailability of `gn` when building " +"and bootstrapping Rust standard library when building Rust toolchain." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"`run_gnrt.py` uses Chromium's copy of `cargo` and `rustc`. `gnrt` depends on third-party " +"libraries downloaded from the internet, but `run_gnrt.py` asks `cargo` that only `--" +"locked` content is allowed via `Cargo.lock`.)" +msgstr "" + +#: src/chromium/cargo.md +msgid "Students may identify the following items as being implicitly or explicitly trusted:" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"`rustc` (the Rust compiler) which in turn depends on the LLVM libraries, the Clang " +"compiler, the `rustc` sources (fetched from GitHub, reviewed by Rust compiler team), " +"binary Rust compiler downloaded for bootstrapping" +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"`rustup` (it may be worth pointing out that `rustup` is developed under the umbrella of " +"the https://github.com/rust-lang/ organization - same as `rustc`)" +msgstr "" + +#: src/chromium/cargo.md +msgid "`cargo`, `rustfmt`, etc." +msgstr "" + +#: src/chromium/cargo.md +msgid "" +"Various internal infrastructure (bots that build `rustc`, system for distributing the " +"prebuilt toolchain to Chromium engineers, etc.)" +msgstr "" + +#: src/chromium/cargo.md +msgid "Cargo tools like `cargo audit`, `cargo vet`, etc." +msgstr "" + +#: src/chromium/cargo.md +msgid "Rust libraries vendored into `//third_party/rust` (audited by security@chromium.org)" +msgstr "" + +#: src/chromium/cargo.md +msgid "Other Rust libraries (some niche, some quite popular and commonly used)" +msgstr "" + +#: src/chromium/policy.md +msgid "Chromium Rust policy" +msgstr "" + +#: src/chromium/policy.md +msgid "" +"Chromium's Rust policy can be found [here](https://source.chromium.org/chromium/chromium/" +"src/+/main:docs/rust.md;l=22). Rust can be used for both first-party and third-party code." +msgstr "" + +#: src/chromium/policy.md +msgid "Using Rust for pure first-party code looks like this:" +msgstr "" + +#: src/chromium/policy.md +msgid "" +"```bob\n" +"\"C++\" Rust\n" +".- - - - - - - - - -. .- - - - - - - - - - -.\n" +": : : :\n" +": Existing Chromium : : Chromium Rust :\n" +": \"C++\" : : code :\n" +": +---------------+ : : +----------------+ :\n" +": | | : : | | :\n" +": | o-----+-+-----------+-+-> | :\n" +": | | : Language : | | :\n" +": +---------------+ : boundary : +----------------+ :\n" +": : : :\n" +"`- - - - - - - - - -' `- - - - - - - - - - -'\n" +"```" +msgstr "" + +#: src/chromium/policy.md +msgid "" +"The third-party case is also common. You will typically also need a small amount of first-" +"party glue code, because very few Rust libraries directly expose a C/C++ API." +msgstr "" + +#: src/chromium/policy.md +msgid "" +"```bob\n" +"\"C++\" Rust\n" +".- - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - -.\n" +": : : :\n" +": Existing Chromium : : Chromium Rust Existing Rust :\n" +": \"C++\" : : \"wrapper\" crate :\n" +": +---------------+ : : +----------------+ +-------------+ :\n" +": | | : : | | | | :\n" +": | o-----+-+-----------+-+-> o-+----------+--> | :\n" +": | | : Language : | | Crate | | :\n" +": +---------------+ : boundary : +----------------+ API +-------------+ :\n" +": : : :\n" +"`- - - - - - - - - -' `- - - - - - - - - - - - - - - - - - - - - - -'\n" +"```" +msgstr "" + +#: src/chromium/policy.md +msgid "" +"The scenario of using a third-party crate is the more complex one, so today's course will " +"focus on:" +msgstr "" + +#: src/chromium/policy.md +msgid "Bringing in third-party Rust libraries (\"crates\")" +msgstr "" + +#: src/chromium/policy.md +msgid "" +"Writing glue code to be able to use those crates from Chromium C++. (The same techniques " +"are used when working with first-party Rust code)." +msgstr "" + +#: src/chromium/build-rules.md +#, fuzzy +msgid "Build rules" +msgstr "Règles de compilation" + +#: src/chromium/build-rules.md +msgid "" +"Rust code is typically built using `cargo`. Chromium builds with `gn` and `ninja` for " +"efficiency --- its static rules allow maximum parallelism. Rust is no exception." +msgstr "" + +#: src/chromium/build-rules.md +msgid "Adding Rust code to Chromium" +msgstr "" + +#: src/chromium/build-rules.md +msgid "In some existing Chromium `BUILD.gn` file, declare a `rust_static_library`:" +msgstr "" + +#: src/chromium/build-rules.md +msgid "" +"```gn\n" +"import(\"//build/rust/rust_static_library.gni\")\n" +"\n" +"rust_static_library(\"my_rust_lib\") {\n" +" crate_root = \"lib.rs\"\n" +" sources = [ \"lib.rs\" ]\n" +"}\n" +"```" +msgstr "" + +#: src/chromium/build-rules.md +msgid "" +"You can also add `deps` on other Rust targets. Later we'll use this to depend upon third " +"party code." +msgstr "" + +#: src/chromium/build-rules.md +msgid "" +"You must specify _both_ the crate root, _and_ a full list of sources. The `crate_root` is " +"the file given to the Rust compiler representing the root file of the compilation unit " +"--- typically `lib.rs`. `sources` is a complete list of all source files which `ninja` " +"needs in order to determine when rebuilds are necessary." +msgstr "" + +#: src/chromium/build-rules.md +msgid "" +"(There's no such thing as a Rust `source_set`, because in Rust, an entire crate is a " +"compilation unit. A `static_library` is the smallest unit.)" +msgstr "" + +#: src/chromium/build-rules.md +msgid "" +"Students might be wondering why we need a gn template, rather than using [gn's built-in " +"support for Rust static libraries](https://gn.googlesource.com/gn/+/main/docs/reference." +"md#func_static_library). The answer is that this template provides support for CXX " +"interop, Rust features, and unit tests, some of which we'll use later." +msgstr "" + +#: src/chromium/build-rules/unsafe.md +msgid "Including `unsafe` Rust Code" +msgstr "" + +#: src/chromium/build-rules/unsafe.md +msgid "" +"Unsafe Rust code is forbidden in `rust_static_library` by default --- it won't compile. " +"If you need unsafe Rust code, add `allow_unsafe = true` to the gn target. (Later in the " +"course we'll see circumstances where this is necessary.)" +msgstr "" + +#: src/chromium/build-rules/unsafe.md +msgid "" +"```gn\n" +"import(\"//build/rust/rust_static_library.gni\")\n" +"\n" +"rust_static_library(\"my_rust_lib\") {\n" +" crate_root = \"lib.rs\"\n" +" sources = [\n" +" \"lib.rs\",\n" +" \"hippopotamus.rs\"\n" +" ]\n" +" allow_unsafe = true\n" +"}\n" +"```" +msgstr "" + +#: src/chromium/build-rules/depending.md +msgid "Simply add the above target to the `deps` of some Chromium C++ target." +msgstr "" + +#: src/chromium/build-rules/depending.md +msgid "" +"```gn\n" +"import(\"//build/rust/rust_static_library.gni\")\n" +"\n" +"rust_static_library(\"my_rust_lib\") {\n" +" crate_root = \"lib.rs\"\n" +" sources = [ \"lib.rs\" ]\n" +"}\n" +"\n" +"# or source_set, static_library etc.\n" +"component(\"preexisting_cpp\") {\n" +" deps = [ \":my_rust_lib\" ]\n" +"}\n" +"```" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"Types are elided in Rust code, which makes a good IDE even more useful than for C++. " +"Visual Studio code works well for Rust in Chromium. To use it," +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"Ensure your VSCode has the `rust-analyzer` extension, not earlier forms of Rust support" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "`gn gen out/Debug --export-rust-project` (or equivalent for your output directory)" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "`ln -s out/Debug/rust-project.json rust-project.json`" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"A demo of some of the code annotation and exploration features of rust-analyzer might be " +"beneficial if the audience are naturally skeptical of IDEs." +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"The following steps may help with the demo (but feel free to instead use a piece of " +"Chromium-related Rust that you are most familiar with):" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "Open `components/qr_code_generator/qr_code_generator_ffi_glue.rs`" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"Place the cursor over the `QrCode::new` call (around line 26) in " +"\\`qr_code_generator_ffi_glue.rs" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "Demo **show documentation** (typical bindings: vscode = ctrl k i; vim/CoC = K)." +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"Demo **go to definition** (typical bindings: vscode = F12; vim/CoC = g d). (This will " +"take you to `//third_party/rust/.../qr_code-.../src/lib.rs`.)" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"Demo **outline** and navigate to the `QrCode::with_bits` method (around line 164; the " +"outline is in the file explorer pane in vscode; typical vim/CoC bindings = space o)" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"Demo **type annotations** (there are quite a few nice examples in the `QrCode::with_bits` " +"method)" +msgstr "" + +#: src/chromium/build-rules/vscode.md +msgid "" +"It may be worth pointing out that `gn gen ... --export-rust-project` will need to be " +"rerun after editing `BUILD.gn` files (which we will do a few times throughout the " +"exercises in this session)." +msgstr "" + +#: src/exercises/chromium/build-rules.md +#, fuzzy +msgid "Build rules exercise" +msgstr "Règles de compilation" + +#: src/exercises/chromium/build-rules.md +msgid "In your Chromium build, add a new Rust target to `//ui/base/BUILD.gn` containing:" +msgstr "" + +#: src/exercises/chromium/build-rules.md src/bare-metal/aps/inline-assembly.md +#: src/bare-metal/aps/uart/using.md src/bare-metal/aps/safemmio/using.md +#: src/bare-metal/aps/logging/using.md +msgid "// SAFETY: There is no other global function of this name.\n" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"**Important:** note that `no_mangle` here is considered a type of unsafety by the Rust " +"compiler, so you'll need to allow unsafe code in your `gn` target." +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"Add this new Rust target as a dependency of `//ui/base:base`. Declare this function at " +"the top of `ui/base/resource/resource_bundle.cc` (later, we'll see how this can be " +"automated by bindings generation tools):" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"Call this function from somewhere in `ui/base/resource/resource_bundle.cc` - we suggest " +"the top of `ResourceBundle::MaybeMangleLocalizedString`. Build and run Chromium, and " +"ensure that \"Hello from Rust!\" is printed lots of times." +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"If you use VSCode, now set up Rust to work well in VSCode. It will be useful in " +"subsequent exercises. If you've succeeded, you will be able to use right-click \"Go to " +"definition\" on `println!`." +msgstr "" + +#: src/exercises/chromium/build-rules.md src/exercises/chromium/interoperability-with-cpp.md +msgid "Where to find help" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"The options available to the [`rust_static_library` gn template](https://source.chromium." +"org/chromium/chromium/src/+/main:build/rust/rust_static_library.gni;l=16)" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"Information about [`#[unsafe(no_mangle)]`](https://doc.rust-lang.org/beta/reference/abi." +"html#the-no_mangle-attribute)" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"Information about [`extern \"C\"`](https://doc.rust-lang.org/std/keyword.extern.html)" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"Information about gn's [`--export-rust-project`](https://gn.googlesource.com/gn/+/main/" +"docs/reference.md#compilation-database) switch" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"[How to install rust-analyzer in VSCode](https://code.visualstudio.com/docs/languages/" +"rust)" +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"This example is unusual because it boils down to the lowest-common-denominator interop " +"language, C. Both C++ and Rust can natively declare and call C ABI functions. Later in " +"the course, we'll connect C++ directly to Rust." +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"`allow_unsafe = true` is required here because `#[unsafe(no_mangle)]` might allow Rust to " +"generate two functions with the same name, and Rust can no longer guarantee that the " +"right one is called." +msgstr "" + +#: src/exercises/chromium/build-rules.md +msgid "" +"If you need a pure Rust executable, you can also do that using the `rust_executable` gn " +"template." +msgstr "" + +#: src/chromium/testing.md +msgid "" +"Rust community typically authors unit tests in a module placed in the same source file as " +"the code being tested. This was covered [earlier](../testing.md) in the course and looks " +"like this:" +msgstr "" + +#: src/chromium/testing.md +msgid "" +"In Chromium we place unit tests in a separate source file and we continue to follow this " +"practice for Rust --- this makes tests consistently discoverable and helps to avoid " +"rebuilding `.rs` files a second time (in the `test` configuration)." +msgstr "" + +#: src/chromium/testing.md +msgid "This results in the following options for testing Rust code in Chromium:" +msgstr "" + +#: src/chromium/testing.md +msgid "Native Rust tests (i.e. `#[test]`). Discouraged outside of `//third_party/rust`." +msgstr "" + +#: src/chromium/testing.md +msgid "" +"`gtest` tests authored in C++ and exercising Rust via FFI calls. Sufficient when Rust " +"code is just a thin FFI layer and the existing unit tests provide sufficient coverage for " +"the feature." +msgstr "" + +#: src/chromium/testing.md +msgid "" +"`gtest` tests authored in Rust and using the crate under test through its public API " +"(using `pub mod for_testing { ... }` if needed). This is the subject of the next few " +"slides." +msgstr "" + +#: src/chromium/testing.md +msgid "" +"Mention that native Rust tests of third-party crates should eventually be exercised by " +"Chromium bots. (Such testing is needed rarely --- only after adding or updating third-" +"party crates.)" +msgstr "" + +#: src/chromium/testing.md +msgid "Some examples may help illustrate when C++ `gtest` vs Rust `gtest` should be used:" +msgstr "" + +#: src/chromium/testing.md +msgid "" +"QR has very little functionality in the first-party Rust layer (it's just a thin FFI " +"glue) and therefore uses the existing C++ unit tests for testing both the C++ and the " +"Rust implementation (parameterizing the tests so they enable or disable Rust using a " +"`ScopedFeatureList`)." +msgstr "" + +#: src/chromium/testing.md +msgid "" +"Hypothetical/WIP PNG integration may need memory-safe implementations of pixel " +"transformations that are provided by `libpng` but missing in the `png` crate - e.g. RGBA " +"=> BGRA, or gamma correction. Such functionality may benefit from separate tests authored " +"in Rust." +msgstr "" + +#: src/chromium/testing/rust-gtest-interop.md +msgid "" +"The [`rust_gtest_interop`](https://chromium.googlesource.com/chromium/src/+/main/testing/" +"rust_gtest_interop/README.md) library provides a way to:" +msgstr "" + +#: src/chromium/testing/rust-gtest-interop.md +msgid "Use a Rust function as a `gtest` testcase (using the `#[gtest(...)]` attribute)" +msgstr "" + +#: src/chromium/testing/rust-gtest-interop.md +msgid "" +"Use `expect_eq!` and similar macros (similar to `assert_eq!` but not panicking and not " +"terminating the test when the assertion fails)." +msgstr "" + +#: src/chromium/testing/rust-gtest-interop.md +#, fuzzy +msgid "Example:" +msgstr "Exemple" + +#: src/chromium/testing/build-gn.md +msgid "" +"The simplest way to build Rust `gtest` tests is to add them to an existing test binary " +"that already contains tests authored in C++. For example:" +msgstr "" + +#: src/chromium/testing/build-gn.md +msgid "" +"```gn\n" +"test(\"ui_base_unittests\") {\n" +" ...\n" +" sources += [ \"my_rust_lib_unittest.rs\" ]\n" +" deps += [ \":my_rust_lib\" ]\n" +"}\n" +"```" +msgstr "" + +#: src/chromium/testing/build-gn.md +msgid "" +"Authoring Rust tests in a separate `static_library` also works, but requires manually " +"declaring the dependency on the support libraries:" +msgstr "" + +#: src/chromium/testing/build-gn.md +msgid "" +"```gn\n" +"rust_static_library(\"my_rust_lib_unittests\") {\n" +" testonly = true\n" +" is_gtest_unittests = true\n" +" crate_root = \"my_rust_lib_unittest.rs\"\n" +" sources = [ \"my_rust_lib_unittest.rs\" ]\n" +" deps = [\n" +" \":my_rust_lib\",\n" +" \"//testing/rust_gtest_interop\",\n" +" ]\n" +"}\n" +"\n" +"test(\"ui_base_unittests\") {\n" +" ...\n" +" deps += [ \":my_rust_lib_unittests\" ]\n" +"}\n" +"```" +msgstr "" + +#: src/chromium/testing/chromium-import-macro.md +msgid "" +"After adding `:my_rust_lib` to GN `deps`, we still need to learn how to import and use " +"`my_rust_lib` from `my_rust_lib_unittest.rs`. We haven't provided an explicit " +"`crate_name` for `my_rust_lib` so its crate name is computed based on the full target " +"path and name. Fortunately we can avoid working with such an unwieldy name by using the " +"`chromium::import!` macro from the automatically-imported `chromium` crate:" +msgstr "" + +#: src/chromium/testing/chromium-import-macro.md +msgid "\"//ui/base:my_rust_lib\"" +msgstr "" + +#: src/chromium/testing/chromium-import-macro.md +msgid "Under the covers the macro expands to something similar to:" +msgstr "" + +#: src/chromium/testing/chromium-import-macro.md +msgid "" +"More information can be found in [the doc comment](https://source.chromium.org/chromium/" +"chromium/src/+/main:build/rust/chromium_prelude/chromium_prelude.rs?q=f:chromium_prelude." +"rs%20pub.use.*%5Cbimport%5Cb;%20-f:third_party&ss=chromium%2Fchromium%2Fsrc) of the " +"`chromium::import` macro." +msgstr "" + +#: src/chromium/testing/chromium-import-macro.md +msgid "" +"`rust_static_library` supports specifying an explicit name via `crate_name` property, but " +"doing this is discouraged. And it is discouraged because the crate name has to be " +"globally unique. crates.io guarantees uniqueness of its crate names so `cargo_crate` GN " +"targets (generated by the `gnrt` tool covered in a later section) use short crate names." +msgstr "" + +#: src/exercises/chromium/testing.md +#, fuzzy +msgid "Testing exercise" +msgstr "Exercices" + +#: src/exercises/chromium/testing.md +msgid "Time for another exercise!" +msgstr "" + +#: src/exercises/chromium/testing.md +msgid "In your Chromium build:" +msgstr "" + +#: src/exercises/chromium/testing.md +msgid "" +"Add a testable function next to `hello_from_rust`. Some suggestions: adding two integers " +"received as arguments, computing the nth Fibonacci number, summing integers in a slice, " +"etc." +msgstr "" + +#: src/exercises/chromium/testing.md +msgid "Add a separate `..._unittest.rs` file with a test for the new function." +msgstr "" + +#: src/exercises/chromium/testing.md +msgid "Add the new tests to `BUILD.gn`." +msgstr "" + +#: src/exercises/chromium/testing.md +msgid "Build the tests, run them, and verify that the new test works." +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"The Rust community offers multiple options for C++/Rust interop, with new tools being " +"developed all the time. At the moment, Chromium uses a tool called CXX." +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"You describe your whole language boundary in an interface definition language (which " +"closely resembles Rust) and then CXX tools generate declarations for functions and types " +"in both Rust and C++." +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +#, fuzzy +msgid "" +"See the [CXX tutorial](https://cxx.rs/tutorial.html) for a full example of using this." +msgstr "" +"Voir le \\[tutoriel CXX\\] [2](https://cxx.rs/tutorial.html) pour un exemple complet " +"d'utilisation." + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"Talk through the diagram. Explain that behind the scenes, this is doing just the same as " +"you previously did. Point out that automating the process has the following benefits:" +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"The tool guarantees that the C++ and Rust sides match (e.g. you get compile errors if the " +"`#[cxx::bridge]` doesn't match the actual C++ or Rust definitions, but with out-of-sync " +"manual bindings you'd get Undefined Behavior)" +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"The tool automates generation of FFI thunks (small, C-ABI-compatible, free functions) for " +"non-C features (e.g. enabling FFI calls into Rust or C++ methods; manual bindings would " +"require authoring such top-level, free functions manually)" +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "The tool and the library can handle a set of core types - for example:" +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"`&[T]` can be passed across the FFI boundary, even though it doesn't guarantee any " +"particular ABI or memory layout. With manual bindings `std::span` / `&[T]` have to be " +"manually destructured and rebuilt out of a pointer and length - this is error-prone given " +"that each language represents empty slices slightly differently)" +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"Smart pointers like `std::unique_ptr`, `std::shared_ptr`, and/or `Box` are natively " +"supported. With manual bindings, one would have to pass C-ABI-compatible raw pointers, " +"which would increase lifetime and memory-safety risks." +msgstr "" + +#: src/chromium/interoperability-with-cpp.md +msgid "" +"`rust::String` and `CxxString` types understand and maintain differences in string " +"representation across the languages (e.g. `rust::String::lossy` can build a Rust string " +"from non-UTF-8 input and `rust::String::c_str` can NUL-terminate a string)." +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "" +"CXX requires that the whole C++/Rust boundary is declared in `cxx::bridge` modules inside " +"`.rs` source code." +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "\"example/include/blobstore.h\"" +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "// Definitions of Rust types and functions go here\n" +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "Point out:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "" +"Although this looks like a regular Rust `mod`, the `#[cxx::bridge]` procedural macro does " +"complex things to it. The generated code is quite a bit more sophisticated - though this " +"does still result in a `mod` called `ffi` in your code." +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "Native support for C++'s `std::unique_ptr` in Rust" +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +#, fuzzy +msgid "Native support for Rust slices in C++" +msgstr "Support intégré pour les tests." + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "Calls from C++ to Rust, and Rust types (in the top part)" +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "Calls from Rust to C++, and C++ types (in the bottom part)" +msgstr "" + +#: src/chromium/interoperability-with-cpp/example-bindings.md +msgid "" +"**Common misconception:** It _looks_ like a C++ header is being parsed by Rust, but this " +"is misleading. This header is never interpreted by Rust, but simply `#include`d in the " +"generated C++ code for the benefit of C++ compilers." +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "" +"By far the most useful page when using CXX is the [type reference](https://cxx.rs/" +"bindings.html)." +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "CXX fundamentally suits cases where:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "Your Rust-C++ interface is sufficiently simple that you can declare all of it." +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "" +"You're using only the types natively supported by CXX already, for example `std::" +"unique_ptr`, `std::string`, `&[u8]` etc." +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "It has many limitations --- for example lack of support for Rust's `Option` type." +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "" +"These limitations constrain us to using Rust in Chromium only for well isolated \"leaf " +"nodes\" rather than for arbitrary Rust-C++ interop. When considering a use-case for Rust " +"in Chromium, a good starting point is to draft the CXX bindings for the language boundary " +"to see if it appears simple enough." +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "You should also discuss some of the other sticky points with CXX, for example:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "Its error handling is based around C++ exceptions (given on the next slide)" +msgstr "" + +#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +msgid "Function pointers are awkward to use." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "" +"CXX's [support for `Result`](https://cxx.rs/binding/result.html) relies on C++ " +"exceptions, so we can't use that in Chromium. Alternatives:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "The `T` part of `Result` can be:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "" +"Returned via out parameters (e.g. via `&mut T`). This requires that `T` can be passed " +"across the FFI boundary - for example `T` has to be:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "A primitive type (like `u32` or `usize`)" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "" +"A type natively supported by `cxx` (like `UniquePtr`) that has a suitable default " +"value to use in a failure case (_unlike_ `Box`)." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "" +"Retained on the Rust side, and exposed via reference. This may be needed when `T` is a " +"Rust type, which cannot be passed across the FFI boundary, and cannot be stored in " +"`UniquePtr`." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "The `E` part of `Result` can be:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "" +"Returned as a boolean (e.g. `true` representing success, and `false` representing failure)" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling.md +msgid "" +"Preserving error details is in theory possible, but so far hasn't been needed in practice." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-qr.md +#, fuzzy +msgid "CXX Error Handling: QR Example" +msgstr "Gestion des erreurs" + +#: src/chromium/interoperability-with-cpp/error-handling-qr.md +msgid "" +"The QR code generator is [an example](https://source.chromium.org/chromium/chromium/src/+/" +"main:components/qr_code_generator/qr_code_generator_ffi_glue.rs;l=13-18;" +"drc=7bf1b75b910ca430501b9c6a74c1d18a0223ecca) where a boolean is used to communicate " +"success vs failure, and where the successful result can be passed across the FFI boundary:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-qr.md +msgid "\"qr_code_generator\"" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-qr.md +msgid "" +"Students may be curious about the semantics of the `out_qr_size` output. This is not the " +"size of the vector, but the size of the QR code (and admittedly it is a bit redundant - " +"this is the square root of the size of the vector)." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-qr.md +msgid "" +"It may be worth pointing out the importance of initializing `out_qr_size` before calling " +"into the Rust function. Creation of a Rust reference that points to uninitialized memory " +"results in Undefined Behavior (unlike in C++, when only the act of dereferencing such " +"memory results in UB)." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-qr.md +msgid "" +"If students ask about `Pin`, then explain why CXX needs it for mutable references to C++ " +"data: the answer is that C++ data can’t be moved around like Rust data, because it may " +"contain self-referential pointers." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +#, fuzzy +msgid "CXX Error Handling: PNG Example" +msgstr "Gestion des erreurs" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "" +"A prototype of a PNG decoder illustrates what can be done when the successful result " +"cannot be passed across the FFI boundary:" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "\"gfx::rust_bindings\"" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "" +"/// This returns an FFI-friendly equivalent of `Result,\n" +" /// ()>`.\n" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "/// C++ bindings for the `crate::png::ResultOfPngReader` type.\n" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "/// C++ bindings for the `crate::png::PngReader` type.\n" +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "" +"`PngReader` and `ResultOfPngReader` are Rust types --- objects of these types cannot " +"cross the FFI boundary without indirection of a `Box`. We can't have an " +"`out_parameter: &mut PngReader`, because CXX doesn't allow C++ to store Rust objects by " +"value." +msgstr "" + +#: src/chromium/interoperability-with-cpp/error-handling-png.md +msgid "" +"This example illustrates that even though CXX doesn't support arbitrary generics nor " +"templates, we can still pass them across the FFI boundary by manually specializing / " +"monomorphizing them into a non-generic type. In the example `ResultOfPngReader` is a non-" +"generic type that forwards into appropriate methods of `Result` (e.g. into " +"`is_err`, `unwrap`, and/or `as_mut`)." +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "Using cxx in Chromium" +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "" +"In Chromium, we define an independent `#[cxx::bridge] mod` for each leaf-node where we " +"want to use Rust. You'd typically have one for each `rust_static_library`. Just add" +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "" +"```gn\n" +"cxx_bindings = [ \"my_rust_file.rs\" ]\n" +" # list of files containing #[cxx::bridge], not all source files\n" +"allow_unsafe = true\n" +"```" +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "to your existing `rust_static_library` target alongside `crate_root` and `sources`." +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "C++ headers will be generated at a sensible location, so you can just" +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "\"ui/base/my_rust_file.rs.h\"" +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "" +"You will find some utility functions in `//base` to convert to/from Chromium C++ types to " +"CXX Rust types --- for example [`SpanToRustSlice`](https://source.chromium.org/chromium/" +"chromium/src/+/main:base/containers/span_rust.h;l=21)." +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "Students may ask --- why do we still need `allow_unsafe = true`?" +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "" +"The broad answer is that no C/C++ code is \"safe\" by the normal Rust standards. Calling " +"back and forth to C/C++ from Rust may do arbitrary things to memory, and compromise the " +"safety of Rust's own data layouts. Presence of _too many_ `unsafe` keywords in C/C++ " +"interop can harm the signal-to-noise ratio of such a keyword, and is [controversial]" +"(https://steveklabnik.com/writing/the-cxx-debate), but strictly, bringing any foreign " +"code into a Rust binary can cause unexpected behavior from Rust's perspective." +msgstr "" + +#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +msgid "" +"The narrow answer lies in the diagram at the top of [this page](../interoperability-with-" +"cpp.md) --- behind the scenes, CXX generates Rust `unsafe` and `extern \"C\"` functions " +"just like we did manually in the previous section." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +#, fuzzy +msgid "Exercise: Interoperability with C++" +msgstr "Interopérabilité avec C" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Part one" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"In the Rust file you previously created, add a `#[cxx::bridge]` which specifies a single " +"function, to be called from C++, called `hello_from_rust`, taking no parameters and " +"returning no value." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"Modify your previous `hello_from_rust` function to remove `extern \"C\"` and " +"`#[unsafe(no_mangle)]`. This is now just a standard Rust function." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Modify your `gn` target to build these bindings." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"In your C++ code, remove the forward-declaration of `hello_from_rust`. Instead, include " +"the generated header file." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Build and run!" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Part two" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"It's a good idea to play with CXX a little. It helps you think about how flexible Rust in " +"Chromium actually is." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +#, fuzzy +msgid "Some things to try:" +msgstr "Quelques notes:" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Call back into C++ from Rust. You will need:" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"An additional header file which you can `include!` from your `cxx::bridge`. You'll need " +"to declare your C++ function in that new header file." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"An `unsafe` block to call such a function, or alternatively specify the `unsafe` keyword " +"in your `#[cxx::bridge]` [as described here](https://cxx.rs/extern-c++.html#functions-and-" +"member-functions)." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "You may also need to `#include \"third_party/rust/cxx/v1/crate/include/cxx.h\"`" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Pass a C++ string from C++ into Rust." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Pass a reference to a C++ object into Rust." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"Intentionally get the Rust function signatures mismatched from the `#[cxx::bridge]`, and " +"get used to the errors you see." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"Intentionally get the C++ function signatures mismatched from the `#[cxx::bridge]`, and " +"get used to the errors you see." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"Pass a `std::unique_ptr` of some type from C++ into Rust, so that Rust can own some C++ " +"object." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"Create a Rust object and pass it into C++, so that C++ owns it. (Hint: you need a `Box`)." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Declare some methods on a C++ type. Call them from Rust." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Declare some methods on a Rust type. Call them from C++." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Part three" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"Now you understand the strengths and limitations of CXX interop, think of a couple of use-" +"cases for Rust in Chromium where the interface would be sufficiently simple. Sketch how " +"you might define that interface." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "The [`cxx` binding reference](https://cxx.rs/bindings.html)" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"The [`rust_static_library` gn template](https://source.chromium.org/chromium/chromium/src/" +"+/main:build/rust/rust_static_library.gni;l=16)" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "Some of the questions you may encounter:" +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"I'm seeing a problem initializing a variable of type X with type Y, where X and Y are " +"both function types. This is because your C++ function doesn't quite match the " +"declaration in your `cxx::bridge`." +msgstr "" + +#: src/exercises/chromium/interoperability-with-cpp.md +msgid "" +"I seem to be able to freely convert C++ references into Rust references. Doesn't that " +"risk UB? For CXX's _opaque_ types, no, because they are zero-sized. For CXX trivial types " +"yes, it's _possible_ to cause UB, although CXX's design makes it quite difficult to craft " +"such an example." +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "" +"Rust libraries are called \"crates\" and are found at [crates.io](https://crates.io). " +"It's _very easy_ for Rust crates to depend upon one another. So they do!" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "Property" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +#, fuzzy +msgid "C++ library" +msgstr "Bibliothèque" + +#: src/chromium/adding-third-party-crates.md +#, fuzzy +msgid "Rust crate" +msgstr "Écosystème de Rust" + +#: src/chromium/adding-third-party-crates.md +#, fuzzy +msgid "Build system" +msgstr "Écosystème de Rust" + +#: src/chromium/adding-third-party-crates.md +msgid "Lots" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +#, fuzzy +msgid "Consistent: `Cargo.toml`" +msgstr "Vous pouvez utiliser le fichier `Cargo.toml` suivant :" + +#: src/chromium/adding-third-party-crates.md +msgid "Typical library size" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "Large-ish" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "Small" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "Transitive dependencies" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "Few" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "For a Chromium engineer, this has pros and cons:" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "" +"All crates use a common build system so we can automate their inclusion into Chromium..." +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "" +"... but, crates typically have transitive dependencies, so you will likely have to bring " +"in multiple libraries." +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "We'll discuss:" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "How to put a crate in the Chromium source code tree" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "How to make `gn` build rules for it" +msgstr "" + +#: src/chromium/adding-third-party-crates.md +msgid "How to audit its source code for sufficient safety." +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md +msgid "Configuring the `Cargo.toml` file to add crates" +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md +msgid "" +"Chromium has a single set of centrally-managed direct crate dependencies. These are " +"managed through a single [`Cargo.toml`](https://source.chromium.org/chromium/chromium/src/" +"+/main:third_party/rust/chromium_crates_io/Cargo.toml):" +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md +msgid "" +"```toml\n" +"[dependencies]\n" +"bitflags = \"1\"\n" +"cfg-if = \"1\"\n" +"cxx = \"1\"\n" +"# lots more...\n" +"```" +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md +msgid "" +"As with any other `Cargo.toml`, you can specify [more details about the dependencies]" +"(https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html) --- typically, " +"you'll want to specify the `features` that you wish to enable in the crate." +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md +msgid "" +"When adding a crate to Chromium, you'll frequently need to provide additional information " +"in an additional file, `gnrt_config.toml`, which we'll meet next." +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +msgid "" +"Alongside `Cargo.toml` is [`gnrt_config.toml`](https://source.chromium.org/chromium/" +"chromium/src/+/main:third_party/rust/chromium_crates_io/gnrt_config.toml). This contains " +"Chromium-specific extensions to crate handling." +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +msgid "If you add a new crate, you should specify at least the `group`. This is one of:" +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +#: src/chromium/adding-third-party-crates/depending-on-a-crate.md +msgid "For instance," +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +msgid "" +"Depending on the crate source code layout, you may also need to use this file to specify " +"where its `LICENSE` file(s) can be found." +msgstr "" + +#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +msgid "" +"Later, we'll see some other things you will need to configure in this file to resolve " +"problems." +msgstr "" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +msgid "" +"A tool called `gnrt` knows how to download crates and how to generate `BUILD.gn` rules." +msgstr "" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +msgid "To start, download the crate you want like this:" +msgstr "" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +msgid "" +"Although the `gnrt` tool is part of the Chromium source code, by running this command you " +"will be downloading and running its dependencies from `crates.io`. See [the earlier " +"section](../cargo.md) discussing this security decision." +msgstr "" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +msgid "This `vendor` command may download:" +msgstr "" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +#, fuzzy +msgid "Your crate" +msgstr "Crates utiles" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +msgid "Direct and transitive dependencies" +msgstr "" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +msgid "" +"New versions of other crates, as required by `cargo` to resolve the complete set of " +"crates required by Chromium." +msgstr "" + +#: src/chromium/adding-third-party-crates/downloading-crates.md +msgid "" +"Chromium maintains patches for some crates, kept in `//third_party/rust/" +"chromium_crates_io/patches`. These will be reapplied automatically, but if patching fails " +"you may need to take manual action." +msgstr "" + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +msgid "Once you've downloaded the crate, generate the `BUILD.gn` files like this:" +msgstr "" + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +msgid "Now run `git status`. You should find:" +msgstr "" + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +msgid "At least one new crate source code in `third_party/rust/chromium_crates_io/vendor`" +msgstr "" + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +msgid "" +"At least one new `BUILD.gn` in `third_party/rust//v`" +msgstr "" + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +msgid "An appropriate `README.chromium`" +msgstr "" + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +#, fuzzy +msgid "" +"The \"major semver version\" is a [Rust \"semver\" version number](https://doc.rust-lang." +"org/cargo/reference/semver.html)." +msgstr "Voir la [Rust Reference](https://doc.rust-lang.org/reference/type-layout.html)." + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +msgid "Take a close look, especially at the things generated in `third_party/rust`." +msgstr "" + +#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +msgid "" +"Talk a little about semver --- and specifically the way that in Chromium it's to allow " +"multiple incompatible versions of a crate, which is discouraged but sometimes necessary " +"in the Cargo ecosystem." +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "" +"If your build fails, it may be because of a `build.rs`: programs which do arbitrary " +"things at build time. This is fundamentally at odds with the design of `gn` and `ninja` " +"which aim for static, deterministic, build rules to maximize parallelism and " +"repeatability of builds." +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Some `build.rs` actions are automatically supported; others require action:" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "build script effect" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Supported by our gn templates" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Work required by you" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Checking rustc version to configure features on and off" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "Yes" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "None" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Checking platform or CPU to configure features on and off" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +#, fuzzy +msgid "Generating code" +msgstr "Génériques" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Yes - specify in `gnrt_config.toml`" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Building C/C++" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "No" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Patch around it" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "Arbitrary other actions" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems.md +msgid "" +"Fortunately, most crates don't contain a build script, and fortunately, most build " +"scripts only do the top two actions." +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +msgid "" +"If `ninja` complains about missing files, check the `build.rs` to see if it writes source " +"code files." +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +msgid "" +"If so, modify [`gnrt_config.toml`](../configuring-gnrt-config-toml.md) to add `build-" +"script-outputs` to the crate. If this is a transitive dependency, that is, one on which " +"Chromium code should not directly depend, also add `allow-first-party-usage=false`. There " +"are several examples already in that file:" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +msgid "" +"```toml\n" +"[crate.unicode-linebreak]\n" +"allow-first-party-usage = false\n" +"build-script-outputs = [\"tables.rs\"]\n" +"```" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +msgid "" +"Now rerun [`gnrt.py -- gen`](../generating-gn-build-rules.md) to regenerate `BUILD.gn` " +"files to inform ninja that this particular output file is input to subsequent build steps." +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md +msgid "" +"Some crates use the [`cc`](https://crates.io/crates/cc) crate to build and link C/C++ " +"libraries. Other crates parse C/C++ using [`bindgen`](https://crates.io/crates/bindgen) " +"within their build scripts. These actions can't be supported in a Chromium context --- " +"our gn, ninja and LLVM build system is very specific in expressing relationships between " +"build actions." +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md +msgid "So, your options are:" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md +msgid "Avoid these crates" +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md +msgid "Apply a patch to the crate." +msgstr "" + +#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md +msgid "" +"Patches should be kept in `third_party/rust/chromium_crates_io/patches/` - see for " +"example the [patches against the `cxx` crate](https://source.chromium.org/chromium/" +"chromium/src/+/main:third_party/rust/chromium_crates_io/patches/cxx/) - and will be " +"applied automatically by `gnrt` each time it upgrades the crate." +msgstr "" + +#: src/chromium/adding-third-party-crates/depending-on-a-crate.md +msgid "" +"Once you've added a third-party crate and generated build rules, depending on a crate is " +"simple. Find your `rust_static_library` target, and add a `dep` on the `:lib` target " +"within your crate." +msgstr "" + +#: src/chromium/adding-third-party-crates/depending-on-a-crate.md +msgid "Specifically," +msgstr "" + +#: src/chromium/adding-third-party-crates/depending-on-a-crate.md +msgid "" +"```bob\n" +" +------------+ +----------------------+\n" +"\"//third_party/rust\" | crate name | \"/v\" | major semver version | \":lib\"\n" +" +------------+ +----------------------+\n" +"```" +msgstr "" + +#: src/chromium/adding-third-party-crates/depending-on-a-crate.md +msgid "" +"```gn\n" +"rust_static_library(\"my_rust_lib\") {\n" +" crate_root = \"lib.rs\"\n" +" sources = [ \"lib.rs\" ]\n" +" deps = [ \"//third_party/rust/example_rust_crate/v1:lib\" ]\n" +"}\n" +"```" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "Auditing Third Party Crates" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "" +"Adding new libraries is subject to Chromium's standard [policies](https://chromium." +"googlesource.com/chromium/src/+/refs/heads/main/docs/rust.md#Third_party-review), but of " +"course also subject to security review. As you may be bringing in not just a single crate " +"but also transitive dependencies, there may be a substantial amount of code to review. On " +"the other hand, safe Rust code can have limited negative side effects. How should you " +"review it?" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "" +"Over time Chromium aims to move to a process based around [cargo vet](https://mozilla." +"github.io/cargo-vet/)." +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "Meanwhile, for each new crate addition, we are checking for the following:" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "" +"Understand why each crate is used. What's the relationship between crates? If the build " +"system for each crate contains a `build.rs` or procedural macros, work out what they're " +"for. Are they compatible with the way Chromium is normally built?" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "Check each crate seems to be reasonably well maintained" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "" +"Use `cd third-party/rust/chromium_crates_io; cargo audit` to check for known " +"vulnerabilities (first you'll need to `cargo install cargo-audit`, which ironically " +"involves downloading lots of dependencies from the internet[2](../cargo.md))" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "" +"Ensure any `unsafe` code is good enough for the [Rule of Two](https://chromium." +"googlesource.com/chromium/src/+/main/docs/security/rule-of-2.md#unsafe-code-in-safe-" +"languages)" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "Check for any use of `fs` or `net` APIs" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "" +"Read all the code at a sufficient level to look for anything out of place that might have " +"been maliciously inserted. (You can't realistically aim for 100% perfection here: there " +"is often too much code.)" +msgstr "" + +#: src/chromium/adding-third-party-crates/reviews-and-audits.md +msgid "" +"These are just guidelines --- work with reviewers from `security@chromium.org` to work " +"out the right way to become confident of the crate." +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "Checking Crates into Chromium Source Code" +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "`git status` should reveal:" +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "Crate code in `//third_party/rust/chromium_crates_io`" +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "" +"Metadata (`BUILD.gn` and `README.chromium`) in `//third_party/rust//`" +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "Please also add an `OWNERS` file in the latter location." +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "" +"You should land all this, along with your `Cargo.toml` and `gnrt_config.toml` changes, " +"into the Chromium repo." +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "" +"**Important:** you need to use `git add -f` because otherwise `.gitignore` files may " +"result in some files being skipped." +msgstr "" + +#: src/chromium/adding-third-party-crates/checking-in.md +msgid "" +"As you do so, you might find presubmit checks fail because of non-inclusive language. " +"This is because Rust crate data tends to include names of git branches, and many projects " +"still use non-inclusive terminology there. So you may need to run:" +msgstr "" + +#: src/chromium/adding-third-party-crates/keeping-up-to-date.md +msgid "" +"As the OWNER of any third party Chromium dependency, you are [expected to keep it up to " +"date with any security fixes](https://chromium.googlesource.com/chromium/src/+/main/docs/" +"adding_to_third_party.md#add-owners). It is hoped that we will soon automate this for " +"Rust crates, but for now, it's still your responsibility just as it is for any other " +"third party dependency." +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "" +"Add [uwuify](https://crates.io/crates/uwuify) to Chromium, turning off the crate's " +"[default features](https://doc.rust-lang.org/cargo/reference/features.html#the-default-" +"feature). Assume that the crate will be used in shipping Chromium, but won't be used to " +"handle untrustworthy input." +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "" +"(In the next exercise we'll use uwuify from Chromium, but feel free to skip ahead and do " +"that now if you like. Or, you could create a new [`rust_executable` target](https://" +"source.chromium.org/chromium/chromium/src/+/main:build/rust/rust_executable.gni) which " +"uses `uwuify`)." +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "Students will need to download lots of transitive dependencies." +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "The total crates needed are:" +msgstr "" + +#: src/exercises/chromium/third-party.md +#, fuzzy +msgid "`instant`," +msgstr "`const`" + +#: src/exercises/chromium/third-party.md +msgid "`lock_api`," +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "`parking_lot`," +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "`parking_lot_core`," +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "`redox_syscall`," +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "`scopeguard`," +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "`smallvec`, and" +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "`uwuify`." +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "" +"If students are downloading even more than that, they likely forgot to turn off the " +"default features." +msgstr "" + +#: src/exercises/chromium/third-party.md +msgid "Thanks to [Daniel Liu](https://github.com/Daniel-Liu-c0deb0t) for this crate!" +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "Bringing It Together --- Exercise" +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"In this exercise, you're going to add a whole new Chromium feature, bringing together " +"everything you already learned." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "The Brief from Product Management" +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md msgid "" -"Adding `#`, eg `{a:#?}`, invokes a \"pretty printing\" format, which can be " -"easier to read." +"A community of pixies has been discovered living in a remote rainforest. It's important " +"that we get Chromium for Pixies delivered to them as soon as possible." msgstr "" -#: src/tuples-and-arrays/tuples.md +#: src/exercises/chromium/bringing-it-together.md +msgid "The requirement is to translate all Chromium's UI strings into Pixie language." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"There's not time to wait for proper translations, but fortunately pixie language is very " +"close to English, and it turns out there's a Rust crate which does the translation." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"In fact, you already [imported that crate in the previous exercise](https://crates.io/" +"crates/uwuify)." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"(Obviously, real translations of Chrome require incredible care and diligence. Don't ship " +"this!)" +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "Steps" +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"Modify `ResourceBundle::MaybeMangleLocalizedString` so that it uwuifies all strings " +"before display. In this special build of Chromium, it should always do this irrespective " +"of the setting of `mangle_localized_strings_`." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"If you've done everything right across all these exercises, congratulations, you should " +"have created Chrome for pixies!" +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"UTF-16 vs UTF-8. Students should be aware that Rust strings are always UTF-8, and will " +"typically decide that it's better to do the conversion on the C++ side using `base::" +"UTF16ToUTF8` and back again." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"If students decide to do the conversion on the Rust side, they'll need to consider " +"[`String::from_utf16`](https://doc.rust-lang.org/std/string/struct.String.html#method." +"from_utf16), consider error handling, and consider which [CXX supported types can " +"transfer many u16s](https://cxx.rs/binding/slice.html)." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"Students may design the C++/Rust boundary in several different ways, e.g. taking and " +"returning strings by value, or taking a mutable reference to a string. If a mutable " +"reference is used, CXX will likely tell the student that they need to use [`Pin`](https://" +"doc.rust-lang.org/std/pin/). You may need to explain what `Pin` does, and then explain " +"why CXX needs it for mutable references to C++ data: the answer is that C++ data can't be " +"moved around like Rust data, because it may contain self-referential pointers." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"The C++ target containing `ResourceBundle::MaybeMangleLocalizedString` will need to " +"depend on a `rust_static_library` target. The student likely already did this." +msgstr "" + +#: src/exercises/chromium/bringing-it-together.md +msgid "" +"The `rust_static_library` target will need to depend on `//third_party/rust/uwuify/v0_2:" +"lib`." +msgstr "" + +#: src/exercises/chromium/solutions.md +msgid "" +"Solutions to the Chromium exercises can be found in [this series of CLs](https://chromium-" +"review.googlesource.com/c/chromium/src/+/5096560)." +msgstr "" + +#: src/exercises/chromium/solutions.md +msgid "" +"Or, if you'd prefer \"standalone\" solutions that don't require applying patchsets or " +"integration with core Chromium code, you can find them in the [`//chromium/src/codelabs/" +"rust` subdirectory in Chromium](https://source.chromium.org/chromium/chromium/src/+/main:" +"codelabs/rust/)." +msgstr "" + +#: src/bare-metal.md #, fuzzy -msgid "Like arrays, tuples have a fixed length." -msgstr "Comme les tableaux, les tuples ont une longueur fixe." +msgid "Welcome to Bare Metal Rust" +msgstr "Bienvenue dans Bare Metal Rust" -#: src/tuples-and-arrays/tuples.md +#: src/bare-metal.md +msgid "" +"This is a standalone one-day course about bare-metal Rust, aimed at people who are " +"familiar with the basics of Rust (perhaps from completing the Comprehensive Rust course), " +"and ideally also have some experience with bare-metal programming in some other language " +"such as C." +msgstr "" +"Il s'agit d'un cours autonome d'une journée sur la bare-metal Rust, destiné aux personnes " +"familiarisées avec le bases de Rust (peut-être après avoir terminé le cours Comprehensive " +"Rust(le guide complet de Rust)), et idéalement aussi avoir quelques expérience de la " +"programmation bare-metal dans un autre langage tel que C." + +#: src/bare-metal.md #, fuzzy -msgid "Tuples group together values of different types into a compound type." +msgid "" +"Today we will talk about 'bare-metal' Rust: running Rust code without an OS underneath " +"us. This will be divided into several parts:" +msgstr "" +"Aujourd'hui, nous allons parler de Rust \"bare-metal\": exécuter du code Rust sans " +"système d'exploitation sous nous. Cette volonté être divisé en plusieurs parties :" + +#: src/bare-metal.md +#, fuzzy +msgid "What is `no_std` Rust?" +msgstr "Qu'est-ce que `no_std` Rust ?" + +#: src/bare-metal.md +#, fuzzy +msgid "Writing firmware for microcontrollers." +msgstr "Ecriture de firmware pour microcontrôleurs." + +#: src/bare-metal.md +#, fuzzy +msgid "Writing bootloader / kernel code for application processors." +msgstr "Ecriture du bootloader / code noyau pour les processeurs d'application." + +#: src/bare-metal.md +#, fuzzy +msgid "Some useful crates for bare-metal Rust development." +msgstr "Quelques caisses utiles pour le développement de Rust en métal nu." + +#: src/bare-metal.md +#, fuzzy +msgid "" +"For the microcontroller part of the course we will use the [BBC micro:bit](https://" +"microbit.org/) v2 as an example. It's a [development board](https://tech.microbit.org/" +"hardware/) based on the Nordic nRF52833 microcontroller with some LEDs and buttons, an " +"I2C-connected accelerometer and compass, and an on-board SWD debugger." +msgstr "" +"Pour la partie microcontrôleur du cours, nous utiliserons le [BBC micro:bit](https://" +"microbit.org/) v2 par exemple. C'est une [carte de développement](https://tech.microbit." +"org/hardware/) basée sur le Nordic Microcontrôleur nRF51822 avec quelques LED et boutons, " +"un accéléromètre et une boussole connectés I2C, et un débogueur SWD intégré." + +#: src/bare-metal.md +#, fuzzy +msgid "To get started, install some tools we'll need later. On gLinux or Debian:" +msgstr "" +"Pour commencer, installez quelques outils dont nous aurons besoin plus tard. Sous gLinux " +"ou Debian :" + +#: src/bare-metal.md +#, fuzzy +msgid "And give users in the `plugdev` group access to the micro:bit programmer:" +msgstr "Et donnez aux utilisateurs du groupe `plugdev` l'accès au programmeur micro:bit :" + +#: src/bare-metal.md +msgid "" +"You should see \"NXP ARM mbed\" in the output of `lsusb` if the device is available. If " +"you are using a Linux environment on a Chromebook, you will need to share the USB device " +"with Linux, via `chrome://os-settings/crostini/sharedUsbDevices`." +msgstr "" + +#: src/bare-metal.md src/bare-metal/microcontrollers/debugging.md +#, fuzzy +msgid "On MacOS:" +msgstr "Sur MacOS :" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`core`" +msgstr "`noyau`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`std`" +msgstr "`std`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "Slices, `&str`, `CStr`" +msgstr "Tranches, `&str`, `CStr`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`NonZeroU8`..." +msgstr "`NonZeroU8`..." + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Option`, `Result`" +msgstr "`Option`, `Résultat`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Display`, `Debug`, `write!`..." +msgstr "`Afficher`, `Déboguer`, `écrire !`..." + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Iterator`" +msgstr "`Itérateur`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Error`" +msgstr "\"Erreur\"" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`panic!`, `assert_eq!`..." +msgstr "`panique !`, `assert_eq !`..." + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`NonNull` and all the usual pointer-related functions" +msgstr "`NonNull` et toutes les fonctions habituelles liées au pointeur" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Future` and `async`/`await`" +msgstr "`Future` et `async`/`wait`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`fence`, `AtomicBool`, `AtomicPtr`, `AtomicU32`..." +msgstr "`clôture`, `AtomicBool`, `AtomicPtr`, `AtomicU32`..." + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Duration`" +msgstr "`Durée`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Box`, `Cow`, `Arc`, `Rc`" +msgstr "`Boîte`, `Vache`, `Arc`, `Rc`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Vec`, `BinaryHeap`, `BtreeMap`, `LinkedList`, `VecDeque`" +msgstr "`Vec`, `BinaryHeap`, `BtreeMap`, `LinkedList`, `VecDeque`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`String`, `CString`, `format!`" +msgstr "`Chaîne`, `CString`, `format !`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Mutex`, `Condvar`, `Barrier`, `Once`, `RwLock`, `mpsc`" +msgstr "`Mutex`, `Condvar`, `Barrière`, `Une fois`, `RwLock`, `mpsc`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`File` and the rest of `fs`" +msgstr "`File` et le reste de `fs`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`println!`, `Read`, `Write`, `Stdin`, `Stdout` and the rest of `io`" +msgstr "`println!`, `Read`, `Write`, `Stdin`, `Stdout` et le reste de `io`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Path`, `OsString`" +msgstr "`Chemin`, `OsString`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`net`" +msgstr "\"net\"" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`Command`, `Child`, `ExitCode`" +msgstr "`Commande`, `Enfant`, `Code de sortie`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`spawn`, `sleep` and the rest of `thread`" +msgstr "`spawn`, `sleep` et le reste de `thread`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`SystemTime`, `Instant`" +msgstr "`SystemTime`, `Instantané`" + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`HashMap` depends on RNG." +msgstr "`HashMap` dépend de RNG." + +#: src/bare-metal/no_std.md +#, fuzzy +msgid "`std` re-exports the contents of both `core` and `alloc`." +msgstr "`std` réexporte le contenu de `core` et `alloc`." + +#: src/bare-metal/minimal.md +#, fuzzy +msgid "A minimal `no_std` program" +msgstr "Un programme minimal `no_std`" + +#: src/bare-metal/minimal.md +msgid "This will compile to an empty binary." +msgstr "" + +#: src/bare-metal/minimal.md +msgid "`std` provides a panic handler; without it we must provide our own." msgstr "" -"Les tuples regroupent des valeurs de différents types dans un type composé." -#: src/tuples-and-arrays/tuples.md -#, fuzzy -msgid "" -"Fields of a tuple can be accessed by the period and the index of the value, " -"e.g. `t.0`, `t.1`." +#: src/bare-metal/minimal.md +msgid "It can also be provided by another crate, such as `panic-halt`." msgstr "" -"Les champs d'un tuple sont accessibles par le point et l'index de la valeur, " -"par ex. `t.0`, `t.1`." -#: src/tuples-and-arrays/tuples.md +#: src/bare-metal/minimal.md msgid "" -"The empty tuple `()` is referred to as the \"unit type\" and signifies " -"absence of a return value, akin to `void` in other languages." +"Depending on the target, you may need to compile with `panic = \"abort\"` to avoid an " +"error about `eh_personality`." msgstr "" -#: src/tuples-and-arrays/iteration.md -msgid "The `for` statement supports iterating over arrays (but not tuples)." +#: src/bare-metal/minimal.md +msgid "" +"Note that there is no `main` or any other entry point; it's up to you to define your own " +"entry point. This will typically involve a linker script and some assembly code to set " +"things up ready for Rust code to run." msgstr "" -#: src/tuples-and-arrays/iteration.md +#: src/bare-metal/alloc.md +#, fuzzy msgid "" -"This functionality uses the `IntoIterator` trait, but we haven't covered " -"that yet." +"To use `alloc` you must implement a [global (heap) allocator](https://doc.rust-lang.org/" +"stable/std/alloc/trait.GlobalAlloc.html)." msgstr "" +"Pour utiliser `alloc` vous devez implémenter un [allocateur global (de tas)](https://doc." +"rust-lang.org/stable/std/alloc/trait.GlobalAlloc.html)." -#: src/tuples-and-arrays/iteration.md -msgid "" -"The `assert_ne!` macro is new here. There are also `assert_eq!` and `assert!" -"` macros. These are always checked while, debug-only variants like " -"`debug_assert!` compile to nothing in release builds." +#: src/bare-metal/alloc.md +msgid "// SAFETY: `HEAP` is only used here and `entry` is only called once.\n" msgstr "" -#: src/tuples-and-arrays/destructuring.md -msgid "" -"When working with tuples and other structured values it's common to want to " -"extract the inner values into local variables. This can be done manually by " -"directly accessing the inner values:" +#: src/bare-metal/alloc.md +msgid "// Give the allocator some memory to allocate.\n" msgstr "" -#: src/tuples-and-arrays/destructuring.md -msgid "\"left: {left}, right: {right}\"" +#: src/bare-metal/alloc.md +msgid "// Now we can do things that require heap allocation.\n" msgstr "" -#: src/tuples-and-arrays/destructuring.md +#: src/bare-metal/alloc.md +#, fuzzy +msgid "\"A string\"" +msgstr "String" + +#: src/bare-metal/alloc.md msgid "" -"However, Rust also supports using pattern matching to destructure a larger " -"value into its constituent parts:" +"`buddy_system_allocator` is a crate implementing a basic buddy system allocator. Other " +"crates are available, or you can write your own or hook into your existing allocator." msgstr "" -#: src/tuples-and-arrays/destructuring.md +#: src/bare-metal/alloc.md msgid "" -"The patterns used here are \"irrefutable\", meaning that the compiler can " -"statically verify that the value on the right of `=` has the same structure " -"as the pattern." +"The const parameter of `LockedHeap` is the max order of the allocator; i.e. in this case " +"it can allocate regions of up to 2\\*\\*32 bytes." msgstr "" -#: src/tuples-and-arrays/destructuring.md +#: src/bare-metal/alloc.md msgid "" -"A variable name is an irrefutable pattern that always matches any value, " -"hence why we can also use `let` to declare a single variable." +"If any crate in your dependency tree depends on `alloc` then you must have exactly one " +"global allocator defined in your binary. Usually this is done in the top-level binary " +"crate." msgstr "" -#: src/tuples-and-arrays/destructuring.md +#: src/bare-metal/alloc.md msgid "" -"Rust also supports using patterns in conditionals, allowing for equality " -"comparison and destructuring to happen at the same time. This form of " -"pattern matching will be discussed in more detail later." +"`extern crate panic_halt as _` is necessary to ensure that the `panic_halt` crate is " +"linked in so we get its panic handler." msgstr "" -#: src/tuples-and-arrays/destructuring.md -msgid "" -"Edit the examples above to show the compiler error when the pattern doesn't " -"match the value being matched on." +#: src/bare-metal/alloc.md +msgid "This example will build but not run, as it doesn't have an entry point." msgstr "" -#: src/tuples-and-arrays/exercise.md -msgid "Arrays can contain other arrays:" +#: src/bare-metal/microcontrollers.md +#, fuzzy +msgid "" +"The `cortex_m_rt` crate provides (among other things) a reset handler for Cortex M " +"microcontrollers." msgstr "" +"La caisse `cortex_m_rt` fournit (entre autres) un gestionnaire de réinitialisation pour " +"les microcontrôleurs Cortex M." -#: src/tuples-and-arrays/exercise.md +#: src/bare-metal/microcontrollers.md #, fuzzy -msgid "What is the type of this variable?" -msgstr "Quel est le type de \"mot\" dans chaque boucle ?" +msgid "Next we'll look at how to access peripherals, with increasing levels of abstraction." +msgstr "" +"Ensuite, nous verrons comment accéder aux périphériques, avec des niveaux d'abstraction " +"croissants." -#: src/tuples-and-arrays/exercise.md +#: src/bare-metal/microcontrollers.md #, fuzzy msgid "" -"Use an array such as the above to write a function `transpose` which will " -"transpose a matrix (turn rows into columns):" +"The `cortex_m_rt::entry` macro requires that the function have type `fn() -> !`, because " +"returning to the reset handler doesn't make sense." msgstr "" -"Utilisez ce qui précède pour écrire une fonction `pretty_print` qui imprime " -"joliment une matrice et une fonction `transpose` qui va transposer une " -"matrice (transformer les lignes en colonnes):" +"La macro `cortex_m_rt::entry` nécessite que la fonction ait le type `fn() -> !`, car le " +"retour au gestionnaire de réinitialisation n'a pas de sens." -#: src/tuples-and-arrays/exercise.md +#: src/bare-metal/microcontrollers.md #, fuzzy -msgid "Hard-code both functions to operate on 3 × 3 matrices." -msgstr "" -"Codez en dur les deux fonctions pour qu'elles fonctionnent sur des matrices " -"3 × 3." +msgid "Run the example with `cargo embed --bin minimal`" +msgstr "Exécutez l'exemple avec `cargo embed --bin minimal`" -#: src/tuples-and-arrays/exercise.md +#: src/bare-metal/microcontrollers/mmio.md #, fuzzy msgid "" -"Copy the code below to and implement the " -"functions:" +"Most microcontrollers access peripherals via memory-mapped IO. Let's try turning on an " +"LED on our micro:bit:" msgstr "" -"Copiez le code ci-dessous sur et implémentez " -"le les fonctions:" +"La plupart des microcontrôleurs accèdent aux périphériques via des E/S mappées en " +"mémoire. Essayons d'allumer une LED sur notre micro:bit:" -#: src/tuples-and-arrays/exercise.md src/borrowing/exercise.md -#: src/unsafe-rust/exercise.md -msgid "// TODO: remove this when you're done with your implementation.\n" +#: src/bare-metal/microcontrollers/mmio.md +msgid "/// GPIO port 0 peripheral address\n" msgstr "" -#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md -msgid "//\n" +#: src/bare-metal/microcontrollers/mmio.md +msgid "// GPIO peripheral offsets\n" msgstr "" -#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md -msgid "// <-- the comment makes rustfmt add a newline\n" +#: src/bare-metal/microcontrollers/mmio.md +msgid "// PIN_CNF fields\n" msgstr "" -#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md -msgid "\"matrix: {:#?}\"" +#: src/bare-metal/microcontrollers/mmio.md src/bare-metal/microcontrollers/pacs.md +#: src/bare-metal/microcontrollers/hals.md +msgid "// Configure GPIO 0 pins 21 and 28 as push-pull outputs.\n" msgstr "" -#: src/tuples-and-arrays/exercise.md src/tuples-and-arrays/solution.md -msgid "\"transposed: {:#?}\"" +#: src/bare-metal/microcontrollers/mmio.md +msgid "" +"// SAFETY: The pointers are to valid peripheral control registers, and no\n" +" // aliases exist.\n" msgstr "" -#: src/references/shared.md -msgid "" -"A reference provides a way to access another value without taking " -"responsibility for the value, and is also called \"borrowing\". Shared " -"references are read-only, and the referenced data cannot change." +#: src/bare-metal/microcontrollers/mmio.md src/bare-metal/microcontrollers/pacs.md +#: src/bare-metal/microcontrollers/hals.md +msgid "// Set pin 28 low and pin 21 high to turn the LED on.\n" msgstr "" -#: src/references/shared.md +#: src/bare-metal/microcontrollers/mmio.md +#, fuzzy msgid "" -"A shared reference to a type `T` has type `&T`. A reference value is made " -"with the `&` operator. The `*` operator \"dereferences\" a reference, " -"yielding its value." +"GPIO 0 pin 21 is connected to the first column of the LED matrix, and pin 28 to the first " +"row." msgstr "" +"La broche 21 du GPIO 0 est connectée à la première colonne de la matrice LED et la broche " +"28 à la première rangée." -#: src/references/shared.md +#: src/bare-metal/microcontrollers/mmio.md src/bare-metal/microcontrollers/pacs.md +#: src/bare-metal/microcontrollers/hals.md src/bare-metal/microcontrollers/board-support.md +#, fuzzy +msgid "Run the example with:" +msgstr "Exécutez l'exemple avec :" + +#: src/bare-metal/microcontrollers/pacs.md #, fuzzy -msgid "Rust will statically forbid dangling references:" -msgstr "Rust interdira statiquement les références pendantes :" +msgid "Peripheral Access Crates" +msgstr "Caisses d'accès périphérique" -#: src/references/shared.md +#: src/bare-metal/microcontrollers/pacs.md +#, fuzzy msgid "" -"A reference is said to \"borrow\" the value it refers to, and this is a good " -"model for students not familiar with pointers: code can use the reference to " -"access the value, but is still \"owned\" by the original variable. The " -"course will get into more detail on ownership in day 3." +"[`svd2rust`](https://crates.io/crates/svd2rust) generates mostly-safe Rust wrappers for " +"memory-mapped peripherals from [CMSIS-SVD](https://www.keil.com/pack/doc/CMSIS/SVD/html/" +"index.html) files." msgstr "" +"[`svd2rust`](https://crates.io/crates/svd2rust) génère des wrappers Rust principalement " +"sûrs pour périphériques mappés en mémoire de [CMSIS-SVD](https://www.keil.com/pack/doc/" +"CMSIS/SVD/html/index.html) des dossiers." -#: src/references/shared.md +#: src/bare-metal/microcontrollers/pacs.md +#, fuzzy msgid "" -"References are implemented as pointers, and a key advantage is that they can " -"be much smaller than the thing they point to. Students familiar with C or C+" -"+ will recognize references as pointers. Later parts of the course will " -"cover how Rust prevents the memory-safety bugs that come from using raw " -"pointers." +"SVD (System View Description) files are XML files typically provided by silicon vendors " +"that describe the memory map of the device." msgstr "" +"Les fichiers SVD (System View Description) sont des fichiers XML généralement fournis par " +"les fournisseurs de silicium qui décrire la carte mémoire de l'appareil." -#: src/references/shared.md +#: src/bare-metal/microcontrollers/pacs.md +#, fuzzy msgid "" -"Rust does not automatically create references for you - the `&` is always " -"required." +"They are organized by peripheral, register, field and value, with names, descriptions, " +"addresses and so on." msgstr "" +"Ils sont organisés par périphérique, registre, champ et valeur, avec noms, descriptions, " +"adresses et ainsi de suite." -#: src/references/shared.md +#: src/bare-metal/microcontrollers/pacs.md #, fuzzy msgid "" -"Rust will auto-dereference in some cases, in particular when invoking " -"methods (try `r.is_ascii()`). There is no need for an `->` operator like in " -"C++." +"SVD files are frequently buggy and incomplete, so there are various projects that patch " +"the mistakes, add missing details, and publish the generated crates." msgstr "" -"Rust déréférencera automatiquement dans certains cas, en particulier lors de " -"l'appel méthodes (essayez `ref_x.count_ones()`)." +"Les fichiers SVD sont souvent bogués et incomplets, il existe donc divers projets qui " +"corrigent le erreurs, ajoutez les détails manquants et publiez les caisses générées." -#: src/references/shared.md +#: src/bare-metal/microcontrollers/pacs.md +#, fuzzy +msgid "`cortex-m-rt` provides the vector table, among other things." +msgstr "`cortex-m-rt` fournit la table des vecteurs, entre autres choses." + +#: src/bare-metal/microcontrollers/pacs.md +#, fuzzy msgid "" -"In this example, `r` is mutable so that it can be reassigned (`r = &b`). " -"Note that this re-binds `r`, so that it refers to something else. This is " -"different from C++, where assignment to a reference changes the referenced " -"value." +"If you `cargo install cargo-binutils` then you can run `cargo objdump --bin pac -- -d --" +"no-show-raw-insn` to see the resulting binary." msgstr "" +"Si vous \"installez cargo cargo-binutils\", vous pouvez exécuter `cargo objdump --bin pac " +"-- -d --no-show-raw-insn` pour voir le binaire résultant." -#: src/references/shared.md +#: src/bare-metal/microcontrollers/hals.md +#, fuzzy +msgid "HAL crates" +msgstr "caisses HAL" + +#: src/bare-metal/microcontrollers/hals.md +#, fuzzy msgid "" -"A shared reference does not allow modifying the value it refers to, even if " -"that value was mutable. Try `*r = 'X'`." +"[HAL crates](https://github.com/rust-embedded/awesome-embedded-rust#hal-implementation-" +"crates) for many microcontrollers provide wrappers around various peripherals. These " +"generally implement traits from [`embedded-hal`](https://crates.io/crates/embedded-hal)." msgstr "" +"[Caisses HAL](https://github.com/rust-embedded/awesome-embedded-rust#hal-implementation-" +"crates) pour de nombreux microcontrôleurs fournissent des wrappers autour de divers " +"périphériques. Ceux-ci implémentent généralement des traits de [`embedded-hal`](https://" +"crates.io/crates/embedded-hal)." -#: src/references/shared.md -msgid "" -"Rust is tracking the lifetimes of all references to ensure they live long " -"enough. Dangling references cannot occur in safe Rust. `x_axis` would return " -"a reference to `point`, but `point` will be deallocated when the function " -"returns, so this will not compile." +#: src/bare-metal/microcontrollers/hals.md +msgid "// Create HAL wrapper for GPIO port 0.\n" msgstr "" -#: src/references/shared.md +#: src/bare-metal/microcontrollers/hals.md #, fuzzy -msgid "We will talk more about borrowing when we get to ownership." -msgstr "" -"Nous parlerons davantage de l'emprunt lorsque nous arriverons à la propriété." +msgid "`set_low` and `set_high` are methods on the `embedded_hal` `OutputPin` trait." +msgstr "`set_low` et `set_high` sont des méthodes sur le trait `embedded_hal` `OutputPin`." -#: src/references/exclusive.md +#: src/bare-metal/microcontrollers/hals.md +#, fuzzy msgid "" -"Exclusive references, also known as mutable references, allow changing the " -"value they refer to. They have type `&mut T`." +"HAL crates exist for many Cortex-M and RISC-V devices, including various STM32, GD32, " +"nRF, NXP, MSP430, AVR and PIC microcontrollers." msgstr "" +"Les caisses HAL existent pour de nombreux appareils Cortex-M et RISC-V, y compris divers " +"STM32, GD32, nRF, NXP, Microcontrôleurs MSP430, AVR et PIC." -#: src/references/exclusive.md +#: src/bare-metal/microcontrollers/board-support.md +#, fuzzy +msgid "Board support crates" +msgstr "Caisses support planche" + +#: src/bare-metal/microcontrollers/board-support.md +#, fuzzy msgid "" -"\"Exclusive\" means that only this reference can be used to access the " -"value. No other references (shared or exclusive) can exist at the same time, " -"and the referenced value cannot be accessed while the exclusive reference " -"exists. Try making an `&point.0` or changing `point.0` while `x_coord` is " -"alive." +"Board support crates provide a further level of wrapping for a specific board for " +"convenience." msgstr "" +"Les caisses de support de planche offrent un niveau supplémentaire d'emballage pour une " +"planche spécifique pour plus de commodité." -#: src/references/exclusive.md +#: src/bare-metal/microcontrollers/board-support.md #, fuzzy msgid "" -"Be sure to note the difference between `let mut x_coord: &i32` and `let " -"x_coord: &mut i32`. The first one represents a shared reference which can be " -"bound to different values, while the second represents an exclusive " -"reference to a mutable value." +"In this case the board support crate is just providing more useful names, and a bit of " +"initialization." msgstr "" -"Assurez-vous de noter la différence entre `let mut ref_x: &i32` et `let " -"ref_x: &mut i32`. Le premier représente une référence mutable qui peut être " -"liée à différentes valeurs, tandis que la seconde représente une référence à " -"une valeur modifiable." +"Dans ce cas, la caisse de support de carte fournit simplement des noms plus utiles, et un " +"peu de initialisation." -#: src/references/slices.md -msgid "Slices" -msgstr "Tranches" +#: src/bare-metal/microcontrollers/board-support.md +#, fuzzy +msgid "" +"The crate may also include drivers for some on-board devices outside of the " +"microcontroller itself." +msgstr "" +"La caisse peut également inclure des pilotes pour certains périphériques embarqués en " +"dehors du microcontrôleur lui-même." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/board-support.md #, fuzzy -msgid "A slice gives you a view into a larger collection:" -msgstr "Une tranche vous donne une vue dans une plus grande collection :" +msgid "`microbit-v2` includes a simple driver for the LED matrix." +msgstr "`microbit-v2` inclut un pilote simple pour la matrice LED." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/type-state.md #, fuzzy -msgid "Slices borrow data from the sliced type." -msgstr "" -"Les tranches empruntent des données au type en tranches. \\* Question : Que " -"se passe-t-il si vous modifiez `a[3]` ?" +msgid "The type state pattern" +msgstr "Le modèle d'état de type" -#: src/references/slices.md -msgid "Question: What happens if you modify `a[3]` right before printing `s`?" +#: src/bare-metal/microcontrollers/type-state.md +msgid "// let gpio0_01_again = gpio0.p0_01; // Error, moved.\n" msgstr "" -#: src/references/slices.md -#, fuzzy -msgid "" -"We create a slice by borrowing `a` and specifying the starting and ending " -"indexes in brackets." +#: src/bare-metal/microcontrollers/type-state.md +msgid "// pin_input.is_high(); // Error, moved.\n" msgstr "" -"Nous créons une tranche en empruntant `a` et en spécifiant les index de " -"début et de fin entre parenthèses." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/type-state.md #, fuzzy 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." +"Pins don't implement `Copy` or `Clone`, so only one instance of each can exist. Once a " +"pin is moved out of the port struct, nobody else can take it." msgstr "" -"Si la tranche commence à l'index 0, la syntaxe de plage de Rust nous permet " -"de supprimer l'index de départ, ce qui signifie que `&a[0..a.len()]` et " -"`&a[..a.len()]` sont identiques ." +"Les broches n'implémentent pas `Copy` ou `Clone`, donc une seule instance de chacun peut " +"exister. Une fois qu'une broche est déplacé hors de la structure du port, personne " +"d'autre ne peut le prendre." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/type-state.md #, fuzzy msgid "" -"The same is true for the last index, so `&a[2..a.len()]` and `&a[2..]` are " -"identical." +"Changing the configuration of a pin consumes the old pin instance, so you can't use the " +"old instance afterwards." msgstr "" -"Il en va de même pour le dernier index, donc `&a[2..a.len()]` et `&a[2..]` " -"sont identiques." +"La modification de la configuration d'une broche consomme l'ancienne instance de broche, " +"vous ne pouvez donc pas continuer à utiliser l'ancienne exemple par la suite." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/type-state.md #, fuzzy msgid "" -"To easily create a slice of the full array, we can therefore use `&a[..]`." +"The type of a value indicates the state it is in: e.g., in this case, the configuration " +"state of a GPIO pin. This encodes the state machine into the type system and ensures that " +"you don't try to use a pin in a certain way without properly configuring it first. " +"Illegal state transitions are caught at compile time." msgstr "" -"Pour créer facilement une tranche du tableau complet, on peut donc utiliser " -"`&a[..]`." +"Le type d'une valeur indique l'état dans lequel elle se trouve : par ex. dans ce cas, " +"l'état de la configuration d'une broche GPIO. Cela encode la machine d'état dans le " +"système de type et garantit que vous ne essayez d'utiliser une broche d'une certaine " +"manière sans la configurer correctement au préalable. État illégal les transitions sont " +"interceptées au moment de la compilation." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/type-state.md #, fuzzy 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." +"You can call `is_high` on an input pin and `set_high` on an output pin, but not vice-" +"versa." msgstr "" -"`s` est une référence à une tranche de `i32`s. Notez que le type de `s` " -"(`&[i32]`) ne mentionne plus la longueur du tableau. Cela nous permet " -"d'effectuer des calculs sur des tranches de tailles différentes." +"Vous pouvez appeler `is_high` sur une broche d'entrée et `set_high` sur une broche de " +"sortie, mais pas l'inverse." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/type-state.md #, fuzzy -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 "" -"Les tranches empruntent toujours à un autre objet. Dans cet exemple, \"a\" " -"doit rester \"vivant\" (dans la portée) au moins aussi longtemps que notre " -"tranche." +msgid "Many HAL crates follow this pattern." +msgstr "De nombreuses caisses HAL suivent ce modèle." -#: src/references/slices.md +#: src/bare-metal/microcontrollers/embedded-hal.md #, fuzzy 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` 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." +"The [`embedded-hal`](https://crates.io/crates/embedded-hal) crate provides a number of " +"traits covering common microcontroller peripherals:" msgstr "" -"La question sur la modification de `a[3]` peut susciter une discussion " -"intéressante, mais la réponse est que pour des raisons de sécurité de la " -"mémoire vous ne pouvez pas le faire via `a` après avoir créé une tranche, " -"mais vous pouvez lire les données de `a` et `s` en toute sécurité. Plus de " -"détails seront expliqués dans la section Vérificateur d'emprunt." +"La caisse [`embedded-hal`](https://crates.io/crates/embedded-hal) fournit un certain " +"nombre de caractéristiques couvrant les périphériques de microcontrôleur courants." -#: src/references/strings.md +#: src/bare-metal/microcontrollers/embedded-hal.md #, fuzzy -msgid "We can now understand the two string types in Rust:" -msgstr "" -"Nous pouvons maintenant comprendre les deux types de string avec Rust :" +msgid "GPIO" +msgstr "GPIO" -#: src/references/strings.md -msgid "`&str` is a slice of UTF-8 encoded bytes, similar to `&[u8]`." +#: src/bare-metal/microcontrollers/embedded-hal.md +msgid "PWM" msgstr "" -#: src/references/strings.md -msgid "`String` is an owned, heap-allocated buffer of UTF-8 bytes." +#: src/bare-metal/microcontrollers/embedded-hal.md +msgid "Delay timers" msgstr "" -#: src/references/strings.md src/std-traits/read-and-write.md -msgid "\"World\"" +#: src/bare-metal/microcontrollers/embedded-hal.md +msgid "I2C and SPI buses and devices" msgstr "" -#: src/references/strings.md -msgid "\"s1: {s1}\"" +#: src/bare-metal/microcontrollers/embedded-hal.md +msgid "" +"Similar traits for byte streams (e.g. UARTs), CAN buses and RNGs are broken out into " +"[`embedded-io`](https://crates.io/crates/embedded-io), [`embedded-can`](https://crates.io/" +"crates/embedded-can) and [`rand_core`](https://crates.io/crates/rand_core) respectively." msgstr "" -#: src/references/strings.md +#: src/bare-metal/microcontrollers/embedded-hal.md #, fuzzy -msgid "\"Hello \"" -msgstr "Bonjour le monde!" - -#: src/references/strings.md src/memory-management/move.md -msgid "\"s2: {s2}\"" -msgstr "" - -#: src/references/strings.md -msgid "\"s3: {s3}\"" -msgstr "" - -#: src/references/strings.md msgid "" -"`&str` introduces a string slice, which is an immutable reference to UTF-8 " -"encoded string data stored in a block of memory. String literals " -"(`\"Hello\"`), are stored in the program’s binary." +"Other crates then implement [drivers](https://github.com/rust-embedded/awesome-embedded-" +"rust#driver-crates) in terms of these traits, e.g. an accelerometer driver might need an " +"I2C or SPI device instance." msgstr "" +"D'autres caisses mettent alors en œuvre [pilotes](https://github.com/rust-embedded/" +"awesome-embedded-rust#driver-crates) en ce qui concerne ces traits, par ex. un pilote " +"d'accéléromètre peut nécessiter une implémentation de bus I2C ou SPI." -#: src/references/strings.md +#: src/bare-metal/microcontrollers/embedded-hal.md msgid "" -"Rust's `String` type is a wrapper around a vector of bytes. As with a " -"`Vec`, it is owned." +"The traits cover using the peripherals but not initializing or configuring them, as " +"initialization and configuration is highly platform-specific." msgstr "" -#: src/references/strings.md +#: src/bare-metal/microcontrollers/embedded-hal.md +#, fuzzy msgid "" -"As with many other types `String::from()` creates a string from a string " -"literal; `String::new()` creates a new empty string, to which string data " -"can be added using the `push()` and `push_str()` methods." +"There are implementations for many microcontrollers, as well as other platforms such as " +"Linux on Raspberry Pi." msgstr "" +"Il existe des implémentations pour de nombreux microcontrôleurs, ainsi que pour d'autres " +"plates-formes telles que Linux sur Tarte aux framboises." -#: src/references/strings.md +#: src/bare-metal/microcontrollers/embedded-hal.md +#, fuzzy msgid "" -"The `format!()` macro is a convenient way to generate an owned string from " -"dynamic values. It accepts the same format specification as `println!()`." +"[`embedded-hal-async`](https://crates.io/crates/embedded-hal-async) provides async " +"versions of the traits." msgstr "" +"La caisse [`embedded-hal`](https://crates.io/crates/embedded-hal) fournit un certain " +"nombre de caractéristiques couvrant les périphériques de microcontrôleur courants." -#: src/references/strings.md +#: src/bare-metal/microcontrollers/embedded-hal.md +#, fuzzy msgid "" -"You can borrow `&str` slices from `String` via `&` and optionally range " -"selection. If you select a byte range that is not aligned to character " -"boundaries, the expression will panic. The `chars` iterator iterates over " -"characters and is preferred over trying to get character boundaries right." +"[`embedded-hal-nb`](https://crates.io/crates/embedded-hal-nb) provides another approach " +"to non-blocking I/O, based on the [`nb`](https://crates.io/crates/nb) crate." msgstr "" +"La caisse [`embedded-hal`](https://crates.io/crates/embedded-hal) fournit un certain " +"nombre de caractéristiques couvrant les périphériques de microcontrôleur courants." -#: src/references/strings.md +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy msgid "" -"For C++ programmers: think of `&str` as `std::string_view` from C++, but the " -"one that always points to a valid string in memory. Rust `String` is a rough " -"equivalent of `std::string` from C++ (main difference: it can only contain " -"UTF-8 encoded bytes and will never use a small-string optimization)." +"[probe-rs](https://probe.rs/) is a handy toolset for embedded debugging, like OpenOCD but " +"better integrated." msgstr "" +"[probe-rs](https://probe.rs/) est un ensemble d'outils pratique pour le débogage intégré, " +"comme OpenOCD mais en mieux intégré." -#: src/references/strings.md -msgid "Byte strings literals allow you to create a `&[u8]` value directly:" -msgstr "" - -#: src/references/strings.md -msgid "" -"Raw strings allow you to create a `&str` value with escapes disabled: " -"`r\"\\n\" == \"\\\\n\"`. You can embed double-quotes by using an equal " -"amount of `#` on either side of the quotes:" -msgstr "" +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy +msgid "SWD (Serial Wire Debug) and JTAG via CMSIS-DAP, ST-Link and J-Link probes" +msgstr " et JTAG via les sondes CMSIS-DAP, ST-Link et J-Link" -#: src/references/exercise.md -msgid "" -"We will create a few utility functions for 3-dimensional geometry, " -"representing a point as `[f64;3]`. It is up to you to determine the function " -"signatures." +#: src/bare-metal/microcontrollers/probe-rs.md +msgid "GDB stub and Microsoft DAP (Debug Adapter Protocol) server" msgstr "" -#: src/references/exercise.md -msgid "" -"// Calculate the magnitude of a vector by summing the squares of its " -"coordinates\n" -"// and taking the square root. Use the `sqrt()` method to calculate the " -"square\n" -"// root, like `v.sqrt()`.\n" +#: src/bare-metal/microcontrollers/probe-rs.md +msgid "Cargo integration" msgstr "" -#: src/references/exercise.md +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy msgid "" -"// Normalize a vector by calculating its magnitude and dividing all of its\n" -"// coordinates by that magnitude.\n" +"`cargo-embed` is a cargo subcommand to build and flash binaries, log RTT (Real Time " +"Transfers) output and connect GDB. It's configured by an `Embed.toml` file in your " +"project directory." msgstr "" +" et connectez GDB. Il est configuré par un Fichier `Embed.toml` dans votre répertoire de " +"projet." -#: src/references/exercise.md -msgid "// Use the following `main` to test your work.\n" +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy +msgid "" +"[CMSIS-DAP](https://arm-software.github.io/CMSIS_5/DAP/html/index.html) is an Arm " +"standard protocol over USB for an in-circuit debugger to access the CoreSight Debug " +"Access Port of various Arm Cortex processors. It's what the on-board debugger on the BBC " +"micro:bit uses." msgstr "" +"[CMSIS-DAP](https://arm-software.github.io/CMSIS_5/DAP/html/index.html) est une norme Arm " +"protocole sur USB pour un débogueur en circuit pour accéder au port d'accès de débogage " +"CoreSight de divers Processeurs Arm Cortex. C'est ce que le débogueur embarqué sur le BBC " +"micro:bit utilise." -#: src/references/exercise.md src/references/solution.md -msgid "\"Magnitude of a unit vector: {}\"" +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy +msgid "" +"ST-Link is a range of in-circuit debuggers from ST Microelectronics, J-Link is a range " +"from SEGGER." msgstr "" +"ST-Link est une gamme de débogueurs en circuit de ST Microelectronics, J-Link est une " +"gamme de SEGER." -#: src/references/exercise.md src/references/solution.md -msgid "\"Magnitude of {v:?}: {}\"" +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy +msgid "" +"The Debug Access Port is usually either a 5-pin JTAG interface or 2-pin Serial Wire Debug." msgstr "" +"Le port d'accès au débogage est généralement une interface JTAG à 5 broches ou un " +"débogage de fil série à 2 broches." -#: src/references/exercise.md src/references/solution.md -msgid "\"Magnitude of {v:?} after normalization: {}\"" +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy +msgid "probe-rs is a library that you can integrate into your own tools if you want to." msgstr "" +"probe-rs est une bibliothèque que vous pouvez intégrer dans vos propres outils si vous le " +"souhaitez." -#: src/references/solution.md -msgid "/// Calculate the magnitude of the given vector.\n" +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy +msgid "" +"The [Microsoft Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-" +"protocol/) lets VSCode and other IDEs debug code running on any supported microcontroller." msgstr "" +"Le \\[protocole de l'adaptateur de débogage Microsoft\\] (https://microsoft.github.io/" +"debug-adapter-protocol/) permet VSCode et d'autres IDE déboguent le code s'exécutant sur " +"n'importe quel microcontrôleur pris en charge." -#: src/references/solution.md +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy +msgid "cargo-embed is a binary built using the probe-rs library." +msgstr "cargo-embed est un binaire construit à l'aide de la bibliothèque probe-rs." + +#: src/bare-metal/microcontrollers/probe-rs.md +#, fuzzy msgid "" -"/// Change the magnitude of the vector to 1.0 without changing its " -"direction.\n" +"RTT (Real Time Transfers) is a mechanism to transfer data between the debug host and the " +"target through a number of ring buffers." msgstr "" +"RTT (Real Time Transfers) est un mécanisme de transfert de données entre l'hôte de " +"débogage et la cible à travers un certain nombre de tampons circulaires." -#: src/user-defined-types/named-structs.md +#: src/bare-metal/microcontrollers/debugging.md #, fuzzy -msgid "Like C and C++, Rust has support for custom structs:" -msgstr "Comme C et C++, Rust prend en charge les structures personnalisées :" +msgid "_Embed.toml_:" +msgstr "Intégrer.toml :" -#: src/user-defined-types/named-structs.md -msgid "\"{} is {} years old\"" -msgstr "" +#: src/bare-metal/microcontrollers/debugging.md +#, fuzzy +msgid "In one terminal under `src/bare-metal/microcontrollers/examples/`:" +msgstr "Dans un terminal sous `src/bare-metal/microcontrollers/examples/` :" -#: src/user-defined-types/named-structs.md -#: src/android/interoperability/with-c/bindgen.md -msgid "\"Peter\"" -msgstr "" +#: src/bare-metal/microcontrollers/debugging.md +#, fuzzy +msgid "In another terminal in the same directory:" +msgstr "Dans un autre terminal du même répertoire :" -#: src/user-defined-types/named-structs.md -msgid "\"Avery\"" +#: src/bare-metal/microcontrollers/debugging.md +msgid "On gLinux or Debian:" msgstr "" -#: src/user-defined-types/named-structs.md -msgid "\"Jackie\"" -msgstr "" +#: src/bare-metal/microcontrollers/debugging.md +#, fuzzy +msgid "In GDB, try running:" +msgstr "Dans GDB, essayez d'exécuter :" -#: src/user-defined-types/named-structs.md src/user-defined-types/enums.md -#: src/pattern-matching/match.md src/methods-and-traits/methods.md +#: src/bare-metal/microcontrollers/other-projects.md src/bare-metal/aps/other-projects.md #, fuzzy -msgid "Key Points:" -msgstr "Points clés:" +msgid "Other projects" +msgstr "Autres projets" -#: src/user-defined-types/named-structs.md -msgid "Structs work like in C or C++." -msgstr "" +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "[RTIC](https://rtic.rs/)" +msgstr "\\* [RTIC](https://rtic.rs/)" -#: src/user-defined-types/named-structs.md -msgid "Like in C++, and unlike in C, no typedef is needed to define a type." -msgstr "" +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "\"Real-Time Interrupt-driven Concurrency\"." +msgstr "\"Concurrence pilotée par interruption en temps réel\"" -#: src/user-defined-types/named-structs.md -msgid "Unlike in C++, there is no inheritance between structs." +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "Shared resource management, message passing, task scheduling, timer queue." msgstr "" +"Gestion des ressources partagées, transmission de messages, planification des tâches, " +"file d'attente du minuteur" -#: src/user-defined-types/named-structs.md -msgid "" -"This may be a good time to let people know there are different types of " -"structs." -msgstr "" +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "[Embassy](https://embassy.dev/)" +msgstr "[Ambassade](https://embassy.dev/)" -#: src/user-defined-types/named-structs.md -msgid "" -"Zero-sized structs (e.g. `struct Foo;`) might be used when implementing a " -"trait on some type but don’t have any data that you want to store in the " -"value itself." -msgstr "" +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "`async` executors with priorities, timers, networking, USB." +msgstr "Exécuteurs \"asynchrones\" avec priorités, minuteries, mise en réseau, USB" -#: src/user-defined-types/named-structs.md -msgid "" -"The next slide will introduce Tuple structs, used when the field names are " -"not important." +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "[TockOS](https://www.tockos.org/documentation/getting-started)" +msgstr "[TockOS](https://www.tockos.org/documentation/getting-started)" + +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "Security-focused RTOS with preemptive scheduling and Memory Protection Unit support." msgstr "" +"RTOS axé sur la sécurité avec planification préemptive et prise en charge de l'unité de " +"protection de la mémoire" -#: src/user-defined-types/named-structs.md +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "[Hubris](https://hubris.oxide.computer/)" +msgstr "[Hubris](https://hubris.oxide.computer/)" + +#: src/bare-metal/microcontrollers/other-projects.md #, fuzzy msgid "" -"If you already have variables with the right names, then you can create the " -"struct using a shorthand." +"Microkernel RTOS from Oxide Computer Company with memory protection, unprivileged " +"drivers, IPC." msgstr "" -"Si vous avez déjà des variables avec les bons noms, vous pouvez créer le " -"struct en utilisant un raccourci :" +"Microkernel RTOS d'Oxide Computer Company avec protection de la mémoire, pilotes non " +"privilégiés, IPC" -#: src/user-defined-types/named-structs.md +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "[Bindings for FreeRTOS](https://github.com/lobaro/FreeRTOS-rust)." +msgstr "[Liaisons pour FreeRTOS](https://github.com/lobaro/FreeRTOS-rust)" + +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy msgid "" -"The syntax `..avery` allows us to copy the majority of the fields from the " -"old struct without having to explicitly type it all out. It must always be " -"the last element." +"Some platforms have `std` implementations, e.g. [esp-idf](https://esp-rs.github.io/book/" +"overview/using-the-standard-library.html)." msgstr "" +"Certaines plates-formes ont des implémentations \"std\", par ex. [esp-idf](https://esp-rs." +"github.io/book/overview/using-the-standard-library.html)." -#: src/user-defined-types/tuple-structs.md +#: src/bare-metal/microcontrollers/other-projects.md #, fuzzy -msgid "If the field names are unimportant, you can use a tuple struct:" -msgstr "" -"Si les noms de champ ne sont pas importants, vous pouvez utiliser une " -"structure tuple :" +msgid "RTIC can be considered either an RTOS or a concurrency framework." +msgstr "RTIC peut être considéré comme un RTOS ou un cadre de concurrence." -#: src/user-defined-types/tuple-structs.md -msgid "\"({}, {})\"" -msgstr "" +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "It doesn't include any HALs." +msgstr "Il n'inclut aucun HAL." -#: src/user-defined-types/tuple-structs.md +#: src/bare-metal/microcontrollers/other-projects.md #, fuzzy -msgid "This is often used for single-field wrappers (called newtypes):" +msgid "" +"It uses the Cortex-M NVIC (Nested Virtual Interrupt Controller) for scheduling rather " +"than a proper kernel." msgstr "" -"Ceci est souvent utilisé pour les wrappers à champ unique (appelés newtypes):" +"Il utilise le Cortex-M NVIC (Nested Virtual Interrupt Controller) pour la planification " +"plutôt qu'un noyau approprié." -#: src/user-defined-types/tuple-structs.md -msgid "\"Ask a rocket scientist at NASA\"" -msgstr "" +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "Cortex-M only." +msgstr "Cortex-M uniquement." -#: src/user-defined-types/tuple-structs.md -#: src/android/interoperability/cpp/cpp-bridge.md -#: src/bare-metal/microcontrollers/type-state.md -#: src/async/pitfalls/cancellation.md -msgid "// ...\n" -msgstr "" +#: src/bare-metal/microcontrollers/other-projects.md +#, fuzzy +msgid "Google uses TockOS on the Haven microcontroller for Titan security keys." +msgstr "Google utilise TockOS sur le microcontrôleur Haven pour les clés de sécurité Titan." -#: src/user-defined-types/tuple-structs.md +#: src/bare-metal/microcontrollers/other-projects.md #, fuzzy msgid "" -"Newtypes are a great way to encode additional information about the value in " -"a primitive type, for example:" +"FreeRTOS is mostly written in C, but there are Rust bindings for writing applications." msgstr "" -"Les nouveaux types sont un excellent moyen d'encoder des informations " -"supplémentaires sur la valeur dans un type primitif, par exemple :" +"FreeRTOS est principalement écrit en C, mais il existe des liaisons Rust pour écrire des " +"applications." -#: src/user-defined-types/tuple-structs.md +#: src/exercises/bare-metal/morning.md #, fuzzy -msgid "The number is measured in some units: `Newtons` in the example above." +msgid "" +"We will read the direction from an I2C compass, and log the readings to a serial port." msgstr "" -"Le nombre est mesuré dans certaines unités : `Newtons` dans l'exemple ci-" -"dessus." +"Nous lirons la direction à partir d'une boussole I2C et enregistrerons les lectures sur " +"un port série." -#: src/user-defined-types/tuple-structs.md +#: src/exercises/bare-metal/morning.md #, fuzzy msgid "" -"The value passed some validation when it was created, so you no longer have " -"to validate it again at every use: `PhoneNumber(String)` or `OddNumber(u32)`." +"After looking at the exercises, you can look at the [solutions](solutions-morning.md) " +"provided." msgstr "" -"La valeur a été validée lors de sa création, vous n'avez donc plus besoin de " -"la valider à chaque utilisation : 'PhoneNumber(String)`ou`OddNumber(u32)\\`." +"Après avoir regardé l'exercice, vous pouvez regarder la [solution](solutions-afternoon." +"md) fournie." -#: src/user-defined-types/tuple-structs.md +#: src/exercises/bare-metal/compass.md #, fuzzy msgid "" -"Demonstrate how to add a `f64` value to a `Newtons` type by accessing the " -"single field in the newtype." +"We will read the direction from an I2C compass, and log the readings to a serial port. If " +"you have time, try displaying it on the LEDs somehow too, or use the buttons somehow." msgstr "" -"Montrez comment ajouter une valeur `f64` à un type `Newtons` en accédant au " -"champ unique dans le nouveau type." +"Nous lirons la direction à partir d'une boussole I2C et enregistrerons les lectures sur " +"un port série. Si tu as temps, essayez de l'afficher sur les LED d'une manière ou d'une " +"autre, ou utilisez les boutons d'une manière ou d'une autre." -#: src/user-defined-types/tuple-structs.md +#: src/exercises/bare-metal/compass.md +#, fuzzy +msgid "Hints:" +msgstr "Astuces:" + +#: src/exercises/bare-metal/compass.md #, fuzzy msgid "" -"Rust generally doesn’t like inexplicit things, like automatic unwrapping or " -"for instance using booleans as integers." +"Check the documentation for the [`lsm303agr`](https://docs.rs/lsm303agr/latest/" +"lsm303agr/) and [`microbit-v2`](https://docs.rs/microbit-v2/latest/microbit/) crates, as " +"well as the [micro:bit hardware](https://tech.microbit.org/hardware/)." msgstr "" -"Rust n'aime généralement pas les choses inexplicites, comme le déballage " -"automatique ou, par exemple, l'utilisation de booléens comme entiers." +"Consultez la documentation du [`lsm303agr`](https://docs.rs/lsm303agr/latest/lsm303agr/) " +"et [`microbit-v2`](https://docs.rs/microbit-v2/latest/microbit/) caisses, ainsi que les " +"[matériel micro:bit](https://tech.microbit.org/hardware/)." -#: src/user-defined-types/tuple-structs.md +#: src/exercises/bare-metal/compass.md #, fuzzy -msgid "Operator overloading is discussed on Day 3 (generics)." -msgstr "La surcharge des opérateurs est discutée le jour 3 (génériques)." +msgid "The LSM303AGR Inertial Measurement Unit is connected to the internal I2C bus." +msgstr "La centrale de mesure inertielle LSM303AGR est connectée au bus interne I2C." -#: src/user-defined-types/tuple-structs.md +#: src/exercises/bare-metal/compass.md +#, fuzzy +msgid "TWI is another name for I2C, so the I2C master peripheral is called TWIM." +msgstr "TWI est un autre nom pour I2C, donc le périphérique maître I2C s'appelle TWIM." + +#: src/exercises/bare-metal/compass.md +#, fuzzy msgid "" -"The example is a subtle reference to the [Mars Climate Orbiter](https://en." -"wikipedia.org/wiki/Mars_Climate_Orbiter) failure." +"The LSM303AGR driver needs something implementing the `embedded_hal::i2c::I2c` trait. The " +"[`microbit::hal::Twim`](https://docs.rs/microbit-v2/latest/microbit/hal/struct.Twim.html) " +"struct implements this." msgstr "" +"Le pilote LSM303AGR a besoin de quelque chose implémentant `embedded_hal::blocking::i2c::" +"WriteRead` trait. Le [`microbit::hal::Twim`](https://docs.rs/microbit-v2/latest/microbit/" +"hal/struct.Twim.html) structure implémente cela." -#: src/user-defined-types/enums.md +#: src/exercises/bare-metal/compass.md #, fuzzy msgid "" -"The `enum` keyword allows the creation of a type which has a few different " -"variants:" +"You have a [`microbit::Board`](https://docs.rs/microbit-v2/latest/microbit/struct.Board." +"html) struct with fields for the various pins and peripherals." msgstr "" -"Le mot clé `enum` permet la création d'un type qui a quelques différentes " -"variantes :" +"Vous avez un [`microbit::Board`](https://docs.rs/microbit-v2/latest/microbit/struct.Board." +"html) structure avec des champs pour les différentes broches et périphériques." -#: src/user-defined-types/enums.md -msgid "// Simple variant\n" +#: src/exercises/bare-metal/compass.md +#, fuzzy +msgid "" +"You can also look at the [nRF52833 datasheet](https://infocenter.nordicsemi.com/pdf/" +"nRF52833_PS_v1.5.pdf) if you want, but it shouldn't be necessary for this exercise." msgstr "" +"Vous pouvez également consulter le [fiche technique nRF52833](https://infocenter." +"nordicsemi.com/pdf/nRF52833_PS_v1.5.pdf) si vous le souhaitez, mais cela ne devrait pas " +"être nécessaire pour cet exercice." -#: src/user-defined-types/enums.md -msgid "// Tuple variant\n" +#: src/exercises/bare-metal/compass.md +#, fuzzy +msgid "" +"Download the [exercise template](../../comprehensive-rust-exercises.zip) and look in the " +"`compass` directory for the following files." msgstr "" +"Téléchargez le \\[modèle d'exercice\\] (../../comprehensive-rust-exercises.zip) et " +"regardez dans la `boussole` répertoire pour les fichiers suivants." -#: src/user-defined-types/enums.md -msgid "// Struct variant\n" -msgstr "" +#: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md +#, fuzzy +msgid "_src/main.rs_:" +msgstr "`src/main.rs` :" -#: src/user-defined-types/enums.md -msgid "\"On this turn: {:?}\"" -msgstr "" +#: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md +#, fuzzy +msgid "_Cargo.toml_ (you shouldn't need to change this):" +msgstr "`Cargo.toml` (vous ne devriez pas avoir besoin de le modifier) :" -#: src/user-defined-types/enums.md +#: src/exercises/bare-metal/compass.md #, fuzzy -msgid "Enumerations allow you to collect a set of values under one type." -msgstr "" -"Les énumérations vous permettent de collecter un ensemble de valeurs sous un " -"type" +msgid "_Embed.toml_ (you shouldn't need to change this):" +msgstr "`Embed.toml` (vous ne devriez pas avoir besoin de le modifier) :" -#: src/user-defined-types/enums.md -msgid "" -"`Direction` is a type with variants. There are two values of `Direction`: " -"`Direction::Left` and `Direction::Right`." -msgstr "" +#: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md +#, fuzzy +msgid "_.cargo/config.toml_ (you shouldn't need to change this):" +msgstr "`.cargo/config.toml` (vous ne devriez pas avoir besoin de le modifier) :" -#: src/user-defined-types/enums.md -msgid "" -"`PlayerMove` is a type with three variants. In addition to the payloads, " -"Rust will store a discriminant so that it knows at runtime which variant is " -"in a `PlayerMove` value." +#: src/exercises/bare-metal/compass.md +#, fuzzy +msgid "See the serial output on Linux with:" +msgstr "Voir la sortie série sur Linux avec :" + +#: src/exercises/bare-metal/compass.md +#, fuzzy +msgid "Or on Mac OS something like (the device name may be slightly different):" msgstr "" +"Ou sur Mac OS quelque chose comme (le nom de l'appareil peut être légèrement différent) :" -#: src/user-defined-types/enums.md +#: src/exercises/bare-metal/compass.md #, fuzzy -msgid "This might be a good time to compare structs and enums:" -msgstr "C'est peut-être le bon moment pour comparer Structs et Enums :" +msgid "Use Ctrl+A Ctrl+Q to quit picocom." +msgstr "Utilisez Ctrl+A Ctrl+Q pour quitter picocom." -#: src/user-defined-types/enums.md +#: src/exercises/bare-metal/solutions-morning.md +msgid "Bare Metal Rust Morning Exercise" +msgstr "Exercice du matin avec Rust sur bare metal" + +#: src/exercises/bare-metal/solutions-morning.md #, fuzzy -msgid "" -"In both, you can have a simple version without fields (unit struct) or one " -"with different types of fields (variant payloads)." +msgid "([back to exercise](compass.md))" +msgstr "([retour à l'exercice](compass.md))" + +#: src/exercises/bare-metal/solutions-morning.md +msgid "// Configure serial port.\n" msgstr "" -"Dans les deux cas, vous pouvez avoir une version simple sans champs " -"(structure d'unité) ou une version avec différents types de champs (charges " -"utiles variantes)." -#: src/user-defined-types/enums.md -#, fuzzy -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 " -"all defined in an enum." +#: src/exercises/bare-metal/solutions-morning.md +msgid "// Use the system timer as a delay provider.\n" msgstr "" -"Vous pouvez même implémenter les différentes variantes d'une énumération " -"avec des structures distinctes, mais elles ne seraient alors pas du même " -"type que si elles étaient toutes définies dans une énumération." -#: src/user-defined-types/enums.md -msgid "Rust uses minimal space to store the discriminant." +#: src/exercises/bare-metal/solutions-morning.md +msgid "// Set up the I2C controller and Inertial Measurement Unit.\n" msgstr "" -#: src/user-defined-types/enums.md -msgid "If necessary, it stores an integer of the smallest required size" +#: src/exercises/bare-metal/solutions-morning.md +msgid "\"Setting up IMU...\"" msgstr "" -#: src/user-defined-types/enums.md -msgid "" -"If the allowed variant values do not cover all bit patterns, it will use " -"invalid bit patterns to encode the discriminant (the \"niche " -"optimization\"). For example, `Option<&u8>` stores either a pointer to an " -"integer or `NULL` for the `None` variant." +#: src/exercises/bare-metal/solutions-morning.md +msgid "// Set up display and timer.\n" msgstr "" -#: src/user-defined-types/enums.md -msgid "" -"You can control the discriminant if needed (e.g., for compatibility with C):" +#: src/exercises/bare-metal/solutions-morning.md +msgid "\"Ready.\"" msgstr "" -#: src/user-defined-types/enums.md -msgid "" -"Without `repr`, the discriminant type takes 2 bytes, because 10001 fits 2 " -"bytes." +#: src/exercises/bare-metal/solutions-morning.md +msgid "// Read compass data and log it to the serial port.\n" msgstr "" -#: src/user-defined-types/enums.md src/user-defined-types/static.md -#: src/memory-management/review.md src/memory-management/move.md -#: src/smart-pointers/box.md src/borrowing/shared.md -msgid "More to Explore" +#: src/exercises/bare-metal/solutions-morning.md +msgid "\"{},{},{}\\t{},{},{}\"" msgstr "" -#: src/user-defined-types/enums.md +#: src/exercises/bare-metal/solutions-morning.md msgid "" -"Rust has several optimizations it can employ to make enums take up less " -"space." +"// If button A is pressed, switch to the next mode and briefly blink all LEDs\n" +" // on.\n" msgstr "" -#: src/user-defined-types/enums.md +#: src/bare-metal/aps.md +#, fuzzy +msgid "Application processors" +msgstr "Processeurs d'application" + +#: src/bare-metal/aps.md msgid "" -"Null pointer optimization: For [some types](https://doc.rust-lang.org/std/" -"option/#representation), Rust guarantees that `size_of::()` equals " -"`size_of::>()`." +"So far we've talked about microcontrollers, such as the Arm Cortex-M series. These are " +"typically small systems with very limited resources." msgstr "" -#: src/user-defined-types/enums.md +#: src/bare-metal/aps.md msgid "" -"Example code if you want to show how the bitwise representation _may_ look " -"like in practice. It's important to note that the compiler provides no " -"guarantees regarding this representation, therefore this is totally unsafe." +"Larger systems with more resources are typically called application processors, built " +"around processors such as the ARM Cortex-A or Intel Atom." msgstr "" -#: src/user-defined-types/static.md +#: src/bare-metal/aps.md #, fuzzy -msgid "`static`" -msgstr "`statique`" - -#: src/user-defined-types/static.md msgid "" -"Static variables will live during the whole execution of the program, and " -"therefore will not move:" +"For simplicity we'll just work with QEMU's aarch64 ['virt'](https://qemu-project.gitlab." +"io/qemu/system/arm/virt.html) board." msgstr "" +"Jusqu'à présent, nous avons parlé de microcontrôleurs, tels que la série Arm Cortex-M. " +"Essayons maintenant d'écrire quelque chose pour Cortex-A. Pour plus de simplicité, nous " +"allons simplement travailler avec aarch64 de QEMU ['virt'](https://qemu-project.gitlab.io/" +"qemu/system/arm/virt.html)." -#: src/user-defined-types/static.md +#: src/bare-metal/aps.md #, fuzzy -msgid "\"Welcome to RustOS 3.14\"" -msgstr "Bienvenue au jour 1" - -#: src/user-defined-types/static.md -msgid "\"{BANNER}\"" +msgid "" +"Broadly speaking, microcontrollers don't have an MMU or multiple levels of privilege " +"(exception levels on Arm CPUs, rings on x86)." msgstr "" +"D'une manière générale, les microcontrôleurs n'ont pas de MMU ou plusieurs niveaux de " +"privilège (exception niveaux sur les processeurs Arm, sonne sur x86), contrairement aux " +"processeurs d'application." -#: src/user-defined-types/static.md -#, fuzzy +#: src/bare-metal/aps.md 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. When a " -"globally-scoped value does not have a reason to need object identity, " -"`const` is generally preferred." +"Application processors have more resources, and often run an operating system, instead of " +"directly executing the target application on startup." msgstr "" -"Comme indiqué dans le \\[Rust RFC Book\\] [1](https://rust-lang.github.io/" -"rfcs/0246-const-vs-static.html), ceux-ci ne sont pas alignés lors de " -"l'utilisation et ont un emplacement de mémoire associé réel. Ceci est utile " -"pour le code non sécurisé et intégré, et la variable vit tout au long de " -"l'exécution du programme." -#: src/user-defined-types/static.md +#: src/bare-metal/aps.md #, fuzzy -msgid "`static` is similar to mutable global variables in C++." +msgid "" +"QEMU supports emulating various different machines or board models for each architecture. " +"The 'virt' board doesn't correspond to any particular real hardware, but is designed " +"purely for virtual machines." msgstr "" -"`static`, d'autre part, ressemble beaucoup plus à une variable globale " -"`const` ou mutable en C++." +"QEMU prend en charge l'émulation de différentes machines ou modèles de cartes pour chaque " +"architecture. Le La carte 'virt' ne correspond à aucun matériel réel particulier, mais " +"est conçue uniquement pour machines virtuelles." -#: src/user-defined-types/static.md +#: src/bare-metal/aps.md msgid "" -"`static` provides object identity: an address in memory and state as " -"required by types with interior mutability such as `Mutex`." +"We will still address this board as bare-metal, as if we were writing an operating system." msgstr "" -#: src/user-defined-types/static.md -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." +#: src/bare-metal/aps/entry-point.md +msgid "Before we can start running Rust code, we need to do some initialization." msgstr "" -#: src/user-defined-types/static.md -msgid "Thread-local data can be created with the macro `std::thread_local`." +#: src/bare-metal/aps/entry-point.md +msgid "" +"```armasm\n" +"/**\n" +" * This is a generic entry point for an image. It carries out the\n" +" * operations required to prepare the loaded image to be run.\n" +" * Specifically, it\n" +" *\n" +" * - sets up the MMU with an identity map of virtual to physical\n" +" * addresses, and enables caching\n" +" * - enables floating point\n" +" * - zeroes the bss section using registers x25 and above\n" +" * - prepares the stack, pointing to a section within the image\n" +" * - sets up the exception vector\n" +" * - branches to the Rust `main` function\n" +" *\n" +" * It preserves x0-x3 for the Rust entry point, as these may contain\n" +" * boot parameters.\n" +" */\n" +".section .init.entry, \"ax\"\n" +".global entry\n" +"entry:\n" +" /*\n" +" * Load and apply the memory management configuration, ready to\n" +" * enable MMU and caches.\n" +" */\n" +" adrp x30, idmap\n" +" msr ttbr0_el1, x30\n" +"\n" +" mov_i x30, .Lmairval\n" +" msr mair_el1, x30\n" +"\n" +" mov_i x30, .Ltcrval\n" +" /* Copy the supported PA range into TCR_EL1.IPS. */\n" +" mrs x29, id_aa64mmfr0_el1\n" +" bfi x30, x29, #32, #4\n" +"\n" +" msr tcr_el1, x30\n" +"\n" +" mov_i x30, .Lsctlrval\n" +"\n" +" /*\n" +" * Ensure everything before this point has completed, then\n" +" * invalidate any potentially stale local TLB entries before they\n" +" * start being used.\n" +" */\n" +" isb\n" +" tlbi vmalle1\n" +" ic iallu\n" +" dsb nsh\n" +" isb\n" +"\n" +" /*\n" +" * Configure sctlr_el1 to enable MMU and cache and don't proceed\n" +" * until this has completed.\n" +" */\n" +" msr sctlr_el1, x30\n" +" isb\n" +"\n" +" /* Disable trapping floating point access in EL1. */\n" +" mrs x30, cpacr_el1\n" +" orr x30, x30, #(0x3 << 20)\n" +" msr cpacr_el1, x30\n" +" isb\n" +"\n" +" /* Zero out the bss section. */\n" +" adr_l x29, bss_begin\n" +" adr_l x30, bss_end\n" +"0: cmp x29, x30\n" +" b.hs 1f\n" +" stp xzr, xzr, [x29], #16\n" +" b 0b\n" +"\n" +"1: /* Prepare the stack. */\n" +" adr_l x30, boot_stack_end\n" +" mov sp, x30\n" +"\n" +" /* Set up exception vector. */\n" +" adr x30, vector_table_el1\n" +" msr vbar_el1, x30\n" +"\n" +" /* Call into Rust code. */\n" +" bl main\n" +"\n" +" /* Loop forever waiting for interrupts. */\n" +"2: wfi\n" +" b 2b\n" +"```" msgstr "" -#: src/user-defined-types/const.md -#, fuzzy -msgid "`const`" -msgstr "`const`" +#: src/bare-metal/aps/entry-point.md +msgid "" +"This code is in `src/bare-metal/aps/examples/src/entry.S`. It's not necessary to " +"understand this in detail -- the takeaway is that some low-level setup is needed to meet " +"Rust's expectations of the system." +msgstr "" -#: src/user-defined-types/const.md +#: src/bare-metal/aps/entry-point.md msgid "" -"Constants are evaluated at compile time and their values are inlined " -"wherever they are used:" +"This is the same as it would be for C: initializing the processor state, zeroing the BSS, " +"and setting up the stack pointer." msgstr "" -#: src/user-defined-types/const.md -#, fuzzy +#: src/bare-metal/aps/entry-point.md msgid "" -"According to the [Rust RFC Book](https://rust-lang.github.io/rfcs/0246-const-" -"vs-static.html) these are inlined upon use." +"The BSS (block starting symbol, for historical reasons) is the part of the object file " +"that contains statically allocated variables that are initialized to zero. They are " +"omitted from the image, to avoid wasting space on zeroes. The compiler assumes that the " +"loader will take care of zeroing them." msgstr "" -"Selon le \\[Rust RFC Book\\] [1](https://rust-lang.github.io/rfcs/0246-const-" -"vs-static.html), ceux-ci sont intégrés lors de l'utilisation." -#: src/user-defined-types/const.md +#: src/bare-metal/aps/entry-point.md msgid "" -"Only functions marked `const` can be called at compile time to generate " -"`const` values. `const` functions can however be called at runtime." +"The BSS may already be zeroed, depending on how memory is initialized and the image is " +"loaded, but we zero it to be sure." msgstr "" -#: src/user-defined-types/const.md -#, fuzzy -msgid "Mention that `const` behaves semantically similar to C++'s `constexpr`" +#: src/bare-metal/aps/entry-point.md +msgid "" +"We need to enable the MMU and cache before reading or writing any memory. If we don't:" msgstr "" -"Mentionnez que `const` se comporte sémantiquement de la même manière que " -"`constexpr` de C++." -#: src/user-defined-types/const.md -#, fuzzy +#: src/bare-metal/aps/entry-point.md msgid "" -"It isn't super common that one would need a runtime evaluated constant, but " -"it is helpful and safer than using a static." +"Unaligned accesses will fault. We build the Rust code for the `aarch64-unknown-none` " +"target that sets `+strict-align` to prevent the compiler from generating unaligned " +"accesses, so it should be fine in this case, but this is not necessarily the case in " +"general." msgstr "" -"Il n'est pas très courant d'avoir besoin d'une constante évaluée à " -"l'exécution, mais c'est utile et plus sûr que d'utiliser un statique." -#: src/user-defined-types/aliases.md +#: src/bare-metal/aps/entry-point.md msgid "" -"A type alias creates a name for another type. The two types can be used " -"interchangeably." +"If it were running in a VM, this can lead to cache coherency issues. The problem is that " +"the VM is accessing memory directly with the cache disabled, while the host has cacheable " +"aliases to the same memory. Even if the host doesn't explicitly access the memory, " +"speculative accesses can lead to cache fills, and then changes from one or the other will " +"get lost when the cache is cleaned or the VM enables the cache. (Cache is keyed by " +"physical address, not VA or IPA.)" msgstr "" -#: src/user-defined-types/aliases.md -msgid "// Aliases are more useful with long, complex types:\n" +#: src/bare-metal/aps/entry-point.md +msgid "" +"For simplicity, we just use a hardcoded pagetable (see `idmap.S`) that identity maps the " +"first 1 GiB of address space for devices, the next 1 GiB for DRAM, and another 1 GiB " +"higher up for more devices. This matches the memory layout that QEMU uses." msgstr "" -#: src/user-defined-types/aliases.md -msgid "C programmers will recognize this as similar to a `typedef`." +#: src/bare-metal/aps/entry-point.md +msgid "We also set up the exception vector (`vbar_el1`), which we'll see more about later." msgstr "" -#: src/user-defined-types/exercise.md +#: src/bare-metal/aps/entry-point.md msgid "" -"We will create a data structure to represent an event in an elevator control " -"system. It is up to you to define the types and functions to construct " -"various events. Use `#[derive(Debug)]` to allow the types to be formatted " -"with `{:?}`." +"All examples this afternoon assume we will be running at exception level 1 (EL1). If you " +"need to run at a different exception level, you'll need to modify `entry.S` accordingly." msgstr "" -#: src/user-defined-types/exercise.md +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy +msgid "Inline assembly" +msgstr "Assemblage en ligne" + +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy msgid "" -"This exercise only requires creating and populating data structures so that " -"`main` runs without errors. The next part of the course will cover getting " -"data out of these structures." +"Sometimes we need to use assembly to do things that aren't possible with Rust code. For " +"example, to make an HVC (hypervisor call) to tell the firmware to power off the system:" msgstr "" +"Parfois, nous devons utiliser l'assemblage pour faire des choses qui ne sont pas " +"possibles avec le code Rust. Par exemple, pour effectuer un " -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md +#: src/bare-metal/aps/inline-assembly.md msgid "" -"/// An event in the elevator system that the controller must react to.\n" +"// SAFETY: this only uses the declared registers and doesn't do anything\n" +" // with memory.\n" msgstr "" -#: src/user-defined-types/exercise.md -msgid "// TODO: add required variants\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"hvc #0\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "/// A direction of travel.\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w0\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "/// The car has arrived on the given floor.\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w1\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "/// The car doors have opened.\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w2\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "/// The car doors have closed.\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w3\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "" -"/// A directional button was pressed in an elevator lobby on the given " -"floor.\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w4\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "/// A floor button was pressed in the elevator car.\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w5\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "\"A ground floor passenger has pressed the up button: {:?}\"" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w6\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "\"The car has arrived on the ground floor: {:?}\"" +#: src/bare-metal/aps/inline-assembly.md +msgid "\"w7\"" msgstr "" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "\"The car door opened: {:?}\"" +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy +msgid "" +"(If you actually want to do this, use the [`smccc`](https://crates.io/crates/smccc) crate " +"which has wrappers for all these functions.)" msgstr "" +"(Si vous voulez vraiment faire cela, utilisez le crate [`psci`](https://crates.io/crates/" +"smccc) qui contient des wrappers pour toutes ces fonctions.)" -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "\"A passenger has pressed the 3rd floor button: {:?}\"" +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy +msgid "" +"PSCI is the Arm Power State Coordination Interface, a standard set of functions to manage " +"system and CPU power states, among other things. It is implemented by EL3 firmware and " +"hypervisors on many systems." msgstr "" +"PSCI est l'interface de coordination de l'état de l'alimentation du bras, un ensemble " +"standard de fonctions pour gérer le système et les états d'alimentation du processeur, " +"entre autres. Il est implémenté par le firmware EL3 et les hyperviseurs sur de nombreux " +"systèmes." -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "\"The car door closed: {:?}\"" +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy +msgid "" +"The `0 => _` syntax means initialize the register to 0 before running the inline assembly " +"code, and ignore its contents afterwards. We need to use `inout` rather than `in` because " +"the call could potentially clobber the contents of the registers." msgstr "" +"La syntaxe `0 => _` signifie initialiser le registre à 0 avant d'exécuter le code " +"assembleur en ligne, et ignorer son contenu par la suite. Nous devons utiliser `inout` " +"plutôt que `in` car l'appel pourrait potentiellement encombrer le contenu des registres." -#: src/user-defined-types/exercise.md src/user-defined-types/solution.md -msgid "\"The car has arrived on the 3rd floor: {:?}\"" +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy +msgid "" +"This `main` function needs to be `#[unsafe(no_mangle)]` and `extern \"C\"` because it is " +"called from our entry point in `entry.S`." msgstr "" +"Cette fonction `main` doit être `#[no_mangle]` et `extern \"C\"` car elle est appelée " +"depuis notre point d'entrée dans `entry.S`." -#: src/user-defined-types/solution.md -msgid "/// A button was pressed.\n" +#: src/bare-metal/aps/inline-assembly.md +msgid "" +"Just `#[no_mangle]` would be sufficient but [RFC3325](https://rust-lang.github.io/" +"rfcs/3325-unsafe-attributes.html) uses this notation to draw reviewer attention to " +"attributes that might cause undefined behavior if used incorrectly." msgstr "" -#: src/user-defined-types/solution.md -msgid "/// The car has arrived at the given floor.\n" +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy +msgid "" +"`_x0`–`_x3` are the values of registers `x0`–`x3`, which are conventionally used by the " +"bootloader to pass things like a pointer to the device tree. According to the standard " +"aarch64 calling convention (which is what `extern \"C\"` specifies to use), registers " +"`x0`–`x7` are used for the first 8 arguments passed to a function, so `entry.S` doesn't " +"need to do anything special except make sure it doesn't change these registers." msgstr "" +"`_x0`–`_x3` sont les valeurs des registres `x0`–`x3`, qui sont classiquement utilisés par " +"le bootloader pour passer des choses comme un pointeur vers l'arborescence des " +"périphériques. Selon l'appel standard aarch64 convention (qui est ce que `extern \"C\"` " +"spécifie d'utiliser), les registres `x0`–`x7` sont utilisés pour la 8 premiers arguments " +"passés à une fonction, donc `entry.S` n'a rien de spécial à faire sauf assurez-vous qu'il " +"ne modifie pas ces registres." -#: src/user-defined-types/solution.md -msgid "/// The car's doors have opened.\n" +#: src/bare-metal/aps/inline-assembly.md +#, fuzzy +msgid "Run the example in QEMU with `make qemu_psci` under `src/bare-metal/aps/examples`." msgstr "" +"Exécutez l'exemple dans QEMU avec `make qemu_psci` sous `src/bare-metal/aps/examples`." -#: src/user-defined-types/solution.md -msgid "/// The car's doors have closed.\n" +#: src/bare-metal/aps/mmio.md +#, fuzzy +msgid "Volatile memory access for MMIO" +msgstr "Accès mémoire volatile pour MMIO" + +#: src/bare-metal/aps/mmio.md +msgid "" +"Use [`pointer::read_volatile`](https://doc.rust-lang.org/stable/core/primitive.pointer." +"html#method.read_volatile) and [`pointer::write_volatile`](https://doc.rust-lang.org/" +"stable/core/primitive.pointer.html#method.write_volatile)." msgstr "" -#: src/user-defined-types/solution.md -msgid "/// A floor is represented as an integer.\n" +#: src/bare-metal/aps/mmio.md +msgid "" +"Never hold a reference to a location being accessed with these methods. Rust may read " +"from (or write to, for `&mut`) a reference at any time." msgstr "" -#: src/user-defined-types/solution.md -msgid "/// A user-accessible button.\n" +#: src/bare-metal/aps/mmio.md +#, fuzzy +msgid "Use `&raw` to get fields of structs without creating an intermediate reference." msgstr "" +"`addr_of!` vous permet d'obtenir des champs de structures sans créer de référence " +"intermédiaire." -#: src/user-defined-types/solution.md -msgid "/// A button in the elevator lobby on the given floor.\n" +#: src/bare-metal/aps/mmio.md +msgid "// SAFETY: Some device is mapped at this address.\n" msgstr "" -#: src/user-defined-types/solution.md -msgid "/// A floor button within the car.\n" +#: src/bare-metal/aps/mmio.md +#, fuzzy +msgid "" +"Volatile access: read or write operations may have side-effects, so prevent the compiler " +"or hardware from reordering, duplicating or eliding them." msgstr "" +"Accès volatile : les opérations de lecture ou d'écriture peuvent avoir des effets " +"secondaires, évitez donc que le compilateur ou matériel de les réorganiser, de les " +"dupliquer ou de les supprimer." -#: src/welcome-day-2.md +#: src/bare-metal/aps/mmio.md #, fuzzy -msgid "Welcome to Day 2" -msgstr "Bienvenue au jour 2" +msgid "" +"If you write and then read, e.g. via a mutable reference, the compiler may assume that " +"the value read is the same as the value just written, and not bother actually reading " +"memory." +msgstr "" +"Habituellement, si vous écrivez puis lisez, par ex. via une référence mutable, le " +"compilateur peut supposer que la valeur lue est la même que la valeur que vous venez " +"d'écrire et ne vous souciez pas de lire la mémoire." -#: src/welcome-day-2.md +#: src/bare-metal/aps/mmio.md #, fuzzy msgid "" -"Now that we have seen a fair amount of Rust, today will focus on Rust's type " -"system:" +"Some existing crates for volatile access to hardware do hold references, but this is " +"unsound. Whenever a reference exists, the compiler may choose to dereference it." msgstr "" -"Maintenant que nous avons vu une bonne quantité de Rust, nous allons " -"continuer avec :" +"Certaines caisses existantes pour l'accès volatile au matériel contiennent des " +"références, mais ce n'est pas valable. Chaque fois qu'une référence existe, le " +"compilateur peut choisir de la déréférencer." -#: src/welcome-day-2.md +#: src/bare-metal/aps/mmio.md #, fuzzy -msgid "Pattern matching: extracting data from structures." +msgid "Use `&raw` to get struct field pointers from a pointer to the struct." msgstr "" -"Filtrage par motif : déstructuration des énumérations, des structures et des " -"tableaux." +"Utilisez la macro `addr_of!` pour obtenir des pointeurs de champ struct à partir d'un " +"pointeur vers la struct." -#: src/welcome-day-2.md -msgid "Methods: associating functions with types." +#: src/bare-metal/aps/mmio.md +msgid "" +"For compatibility with old versions of Rust you can use the [`addr_of!`](https://doc.rust-" +"lang.org/stable/core/ptr/macro.addr_of.html) macro instead." msgstr "" -#: src/welcome-day-2.md -msgid "Traits: behaviors shared by multiple types." -msgstr "" +#: src/bare-metal/aps/uart.md +#, fuzzy +msgid "Let's write a UART driver" +msgstr "Écrivons un pilote UART" -#: src/welcome-day-2.md -msgid "Generics: parameterizing types on other types." +#: src/bare-metal/aps/uart.md +#, fuzzy +msgid "" +"The QEMU 'virt' machine has a [PL011](https://developer.arm.com/documentation/ddi0183/g) " +"UART, so let's write a driver for that." msgstr "" +"La machine QEMU 'virt' a un [PL011](https://developer.arm.com/documentation/ddi0183/g) " +"UART, écrivons donc un pilote pour cela." -#: src/welcome-day-2.md -msgid "" -"Standard library types and traits: a tour of Rust's rich standard library." +#: src/bare-metal/aps/uart.md +msgid "/// Minimal driver for a PL011 UART.\n" msgstr "" -#: src/pattern-matching/match.md -#, fuzzy +#: src/bare-metal/aps/uart.md msgid "" -"The `match` keyword lets you match a value against one or more _patterns_. " -"The comparisons are done from top to bottom and the first match wins." +"/// Constructs a new instance of the UART driver for a PL011 device at the\n" +" /// given base address.\n" +" ///\n" +" /// # Safety\n" +" ///\n" +" /// The given base address must point to the 8 MMIO control registers of a\n" +" /// PL011 device, which must be mapped into the address space of the process\n" +" /// as device memory and not have any other aliases.\n" msgstr "" -"Le mot clé `match` vous permet de faire correspondre une valeur à un ou " -"plusieurs _patterns_. Le les comparaisons se font de haut en bas et le " -"premier match l'emporte." -#: src/pattern-matching/match.md -#, fuzzy -msgid "The patterns can be simple values, similarly to `switch` in C and C++:" +#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md +#: src/bare-metal/aps/safemmio/driver.md +msgid "/// Writes a single byte to the UART.\n" msgstr "" -"Les modèles peuvent être des valeurs simples, de la même manière que " -"`switch` en C et C++ :" -#: src/pattern-matching/match.md -msgid "'x'" +#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md +#: src/bare-metal/aps/safemmio/driver.md +msgid "// Wait until there is room in the TX buffer.\n" msgstr "" -#: src/pattern-matching/match.md -msgid "'q'" +#: src/bare-metal/aps/uart.md +msgid "" +"// SAFETY: We know that the base address points to the control\n" +" // registers of a PL011 device which is appropriately mapped.\n" msgstr "" -#: src/pattern-matching/match.md -msgid "\"Quitting\"" +#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md +#: src/bare-metal/aps/safemmio/driver.md +msgid "// Write to the TX buffer.\n" msgstr "" -#: src/pattern-matching/match.md src/generics/exercise.md -#: src/generics/solution.md src/std-traits/solution.md -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "'a'" +#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md +#: src/bare-metal/aps/safemmio/driver.md +msgid "// Wait until the UART is no longer busy.\n" msgstr "" -#: src/pattern-matching/match.md -msgid "'s'" +#: src/bare-metal/aps/uart.md +#, fuzzy +msgid "" +"Note that `Uart::new` is unsafe while the other methods are safe. This is because as long " +"as the caller of `Uart::new` guarantees that its safety requirements are met (i.e. that " +"there is only ever one instance of the driver for a given UART, and nothing else aliasing " +"its address space), then it is always safe to call `write_byte` later because we can " +"assume the necessary preconditions." msgstr "" +"Notez que `Uart::new` n'est pas sûr alors que les autres méthodes sont sûres. C'est parce " +"que tant que le l'appelant de `Uart::new` garantit que ses exigences de sécurité sont " +"respectées (c'est-à-dire qu'il n'y a jamais une instance du pilote pour un UART donné, et " +"rien d'autre aliasant son espace d'adressage), alors il est toujours sûr d'appeler " +"`write_byte` plus tard car nous pouvons supposer que le nécessaire conditions préalables." -#: src/pattern-matching/match.md -msgid "'w'" +#: src/bare-metal/aps/uart.md +#, fuzzy +msgid "" +"We could have done it the other way around (making `new` safe but `write_byte` unsafe), " +"but that would be much less convenient to use as every place that calls `write_byte` " +"would need to reason about the safety" msgstr "" +"Nous aurions pu faire l'inverse (rendre `new` sûr mais `write_byte` non sûr), mais cela " +"serait beaucoup moins pratique à utiliser car chaque endroit qui appelle `write_byte` " +"aurait besoin de raisonner sur la sécurité" -#: src/pattern-matching/match.md -msgid "'d'" +#: src/bare-metal/aps/uart.md +#, fuzzy +msgid "" +"This is a common pattern for writing safe wrappers of unsafe code: moving the burden of " +"proof for soundness from a large number of places to a smaller number of places." msgstr "" +"Il s'agit d'un modèle courant pour écrire des wrappers sûrs de code non sécurisé : " +"déplacer la charge de la preuve pour solidité d'un grand nombre d'endroits à un plus " +"petit nombre d'endroits." -#: src/pattern-matching/match.md -msgid "\"Moving around\"" +#: src/bare-metal/aps/uart/traits.md +#, fuzzy +msgid "More traits" +msgstr "Plus de traits" + +#: src/bare-metal/aps/uart/traits.md +#, fuzzy +msgid "We derived the `Debug` trait. It would be useful to implement a few more traits too." msgstr "" +"Nous avons dérivé le trait `Debug`. Il serait également utile de mettre en œuvre quelques " +"traits supplémentaires." -#: src/pattern-matching/match.md src/error-handling/exercise.md -#: src/error-handling/solution.md -msgid "'0'" +#: src/bare-metal/aps/uart/traits.md +msgid "" +"// SAFETY: `Uart` just contains a pointer to device memory, which can be\n" +"// accessed from any context.\n" msgstr "" -#: src/pattern-matching/match.md src/error-handling/exercise.md -#: src/error-handling/solution.md -msgid "'9'" +#: src/bare-metal/aps/uart/traits.md +#, fuzzy +msgid "" +"Implementing `Write` lets us use the `write!` and `writeln!` macros with our `Uart` type." msgstr "" +"L'implémentation de `Write` nous permet d'utiliser les macros `write!` et `writeln!` avec " +"notre type `Uart`." -#: src/pattern-matching/match.md -msgid "\"Number input\"" +#: src/bare-metal/aps/uart/traits.md +msgid "" +"`Send` is an auto-trait, but not implemented automatically because it is not implemented " +"for pointers." msgstr "" -#: src/pattern-matching/match.md -msgid "\"Lowercase: {key}\"" +#: src/bare-metal/aps/uart/using.md src/bare-metal/aps/logging/using.md +#, fuzzy +msgid "Using it" +msgstr "En l'utilisant" + +#: src/bare-metal/aps/uart/using.md +#, fuzzy +msgid "Let's write a small program using our driver to write to the serial console." msgstr "" +"Écrivons un petit programme en utilisant notre pilote pour écrire sur la console série et " +"écho entrant octets." -#: src/pattern-matching/match.md -msgid "\"Something else\"" +#: src/bare-metal/aps/uart/using.md src/bare-metal/aps/safemmio/using.md +#: src/bare-metal/aps/logging/using.md src/bare-metal/aps/aarch64-rt.md +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Base address of the primary PL011 UART.\n" msgstr "" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/uart/using.md src/bare-metal/aps/safemmio/using.md +#: src/bare-metal/aps/logging/using.md src/bare-metal/aps/aarch64-rt.md +#: src/exercises/bare-metal/solutions-afternoon.md msgid "" -"The `_` pattern is a wildcard pattern which matches any value. The " -"expressions _must_ be exhaustive, meaning that it covers every possibility, " -"so `_` is often used as the final catch-all case." +"// SAFETY: `PL011_BASE_ADDRESS` is the base address of a PL011 device, and\n" +" // nothing else accesses that address range.\n" msgstr "" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/uart/using.md src/bare-metal/aps/safemmio/using.md +#: src/bare-metal/aps/logging/using.md src/bare-metal/aps/aarch64-rt.md +msgid "\"main({x0:#x}, {x1:#x}, {x2:#x}, {x3:#x})\"" +msgstr "" + +#: src/bare-metal/aps/uart/using.md #, fuzzy msgid "" -"Match can be used as an expression. Just like `if`, each match arm must have " -"the same type. The type is the last expression of the block, if any. In the " -"example above, the type is `()`." +"As in the [inline assembly](../inline-assembly.md) example, this `main` function is " +"called from our entry point code in `entry.S`. See the speaker notes there for details." msgstr "" -"Comme `if let`, chaque bras de correspondance doit avoir le même type. Le " -"type est le dernier expression du bloc, le cas échéant. Dans l'exemple ci-" -"dessus, le type est `()`." +"Comme dans l'exemple [inline assembly](../inline-assembly.md), cette fonction `main` est " +"appelée depuis notre code du point d'entrée dans `entry.S`. Voir les notes du formateur " +"pour plus de détails." -#: src/pattern-matching/match.md +#: src/bare-metal/aps/uart/using.md +#, fuzzy msgid "" -"A variable in the pattern (`key` in this example) will create a binding that " -"can be used within the match arm." +"Run the example in QEMU with `make qemu_minimal` under `src/bare-metal/aps/examples`." msgstr "" +"Exécutez l'exemple dans QEMU avec `make qemu_minimal` sous `src/bare-metal/aps/examples`." -#: src/pattern-matching/match.md -msgid "A match guard causes the arm to match only if the condition is true." -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "A better UART driver" +msgstr "Un meilleur pilote UART" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy msgid "" -"You might point out how some specific characters are being used when in a " -"pattern" +"The PL011 actually has [more registers](https://developer.arm.com/documentation/ddi0183/g/" +"programmers-model/summary-of-registers), and adding offsets to construct pointers to " +"access them is error-prone and hard to read. Additionally, some of them are bit fields, " +"which would be nice to access in a structured way." msgstr "" -"Vous pouvez indiquer comment certains caractères spécifiques sont utilisés " -"dans un modèle" +"Le PL011 a en fait \\[un tas de registres supplémentaires\\] [1](https://developer.arm." +"com/documentation/ddi0183/g/programmers-model/summary-of-registers), et ajoute des " +"décalages pour construire des pointeurs pour accéder est sujette aux erreurs et difficile " +"à lire. De plus, certains d'entre eux sont des champs de bits, ce qui serait bien de " +"accéder de manière structurée." -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`|` as an `or`" -msgstr "`|` comme un `ou`" +msgid "Offset" +msgstr "Décalage" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`..` can expand as much as it needs to be" -msgstr "`..` peut s'étendre autant que nécessaire" +msgid "Register name" +msgstr "Nom du registre" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`1..=5` represents an inclusive range" -msgstr "`1..=5` représente une plage inclusive" +msgid "Width" +msgstr "Largeur" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`_` is a wild card" -msgstr "`_` est un joker" +msgid "0x00" +msgstr "0x00" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"Match guards as a separate syntax feature are important and necessary when " -"we wish to concisely express more complex ideas than patterns alone would " -"allow." -msgstr "" -"Les gardes de correspondance en tant que fonctionnalité de syntaxe distincte " -"sont importants et nécessaires lorsque nous souhaitons exprimer de manière " -"concise des idées plus complexes que ne le permettraient les modèles seuls." +msgid "DR" +msgstr "DR" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"They are not the same as separate `if` expression inside of the match arm. " -"An `if` expression inside of the branch block (after `=>`) happens after the " -"match arm is selected. Failing the `if` condition inside of that block won't " -"result in other arms of the original `match` expression being considered." -msgstr "" -"Ils ne sont pas identiques à une expression \"if\" séparée à l'intérieur du " -"bras de match. Une expression `if` à l'intérieur du bloc de branche (après " -"`=>`) se produit après la sélection du bras de correspondance. L'échec de la " -"condition \"si\" à l'intérieur de ce bloc n'entraînera pas d'autres bras de " -"l'expression \"match\" d'origine considérée." +msgid "12" +msgstr "12" -#: src/pattern-matching/match.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"The condition defined in the guard applies to every expression in a pattern " -"with an `|`." -msgstr "" -"La condition définie dans la garde s'applique à chaque expression dans un " -"modèle avec un `|`." +msgid "0x04" +msgstr "0x04" -#: src/pattern-matching/destructuring.md -msgid "Like tuples, structs and enums can also be destructured by matching:" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "RSR" +msgstr "RSR" -#: src/pattern-matching/destructuring.md -msgid "Structs" -msgstr "Structures" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "4" +msgstr "4" -#: src/pattern-matching/destructuring.md -msgid "\"x.0 = 1, b = {b}, y = {y}\"" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x18" +msgstr "0x18" -#: src/pattern-matching/destructuring.md -msgid "\"y = 2, x = {i:?}\"" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "FR" +msgstr "EN" -#: src/pattern-matching/destructuring.md -msgid "\"y = {y}, other fields were ignored\"" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "9" +msgstr "9" -#: src/pattern-matching/destructuring.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"Patterns can also be used to bind variables to parts of your values. This is " -"how you inspect the structure of your types. Let us start with a simple " -"`enum` type:" -msgstr "" -"Les modèles peuvent également être utilisés pour lier des variables à des " -"parties de vos valeurs. C'est ainsi vous inspectez la structure de vos " -"types. Commençons par un simple type `enum` :" +msgid "0x20" +msgstr "0x20" -#: src/pattern-matching/destructuring.md -msgid "\"cannot divide {n} into two equal parts\"" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "ILPR" +msgstr "ILPR" -#: src/pattern-matching/destructuring.md -msgid "\"{n} divided in two is {half}\"" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "8" +msgstr "8" -#: src/pattern-matching/destructuring.md -msgid "\"sorry, an error happened: {msg}\"" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x24" +msgstr "0x24" -#: src/pattern-matching/destructuring.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"Here we have used the arms to _destructure_ the `Result` value. In the first " -"arm, `half` is bound to the value inside the `Ok` variant. In the second " -"arm, `msg` is bound to the error message." -msgstr "" -"Ici, nous avons utilisé les bras pour _déstructurer_ la valeur `Result`. En " -"premier arm, `half` est lié à la valeur à l'intérieur de la variante `Ok`. " -"Dans le deuxième bras, `msg` est lié au message d'erreur." +msgid "IBRD" +msgstr "BIRD" -#: src/pattern-matching/destructuring.md -msgid "Change the literal values in `foo` to match with the other patterns." -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "16" +msgstr "16" -#: src/pattern-matching/destructuring.md -msgid "Add a new field to `Foo` and make changes to the pattern as needed." -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x28" +msgstr "0x28" + +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "FBRD" +msgstr "FBRD" + +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "6" +msgstr "6" + +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x2c" +msgstr "0x2c" + +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "LCR_H" +msgstr "LCR_H" + +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x30" +msgstr "0x30" + +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "CR" +msgstr "CR" -#: src/pattern-matching/destructuring.md -msgid "" -"The distinction between a capture and a constant expression can be hard to " -"spot. Try changing the `2` in the second arm to a variable, and see that it " -"subtly doesn't work. Change it to a `const` and see it working again." -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x34" +msgstr "0x34" -#: src/pattern-matching/destructuring.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"The `if`/`else` expression is returning an enum that is later unpacked with " -"a `match`." -msgstr "" -"L'expression `if`/`else` renvoie une énumération qui est ensuite " -"décompressée avec une `match`." +msgid "IFLS" +msgstr "IFLS" -#: src/pattern-matching/destructuring.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"You can try adding a third variant to the enum definition and displaying the " -"errors when running the code. Point out the places where your code is now " -"inexhaustive and how the compiler tries to give you hints." -msgstr "" -"Vous pouvez essayer d'ajouter une troisième variante à la définition enum et " -"d'afficher les erreurs lors de l'exécution du code. Indiquez les endroits où " -"votre code est maintenant inexhaustif et comment le compilateur essaie de " -"vous donner des indices." +msgid "0x38" +msgstr "0x38" -#: src/pattern-matching/destructuring.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"The values in the enum variants can only be accessed after being pattern " -"matched." -msgstr "" -"Les valeurs des variantes enum ne sont accessibles qu'après avoir été mises " -"en correspondance avec le modèle. Le modèle lie les références aux champs " -"dans le \"match arm\" après le `=>`." +msgid "IMSC" +msgstr "IMSC" -#: src/pattern-matching/destructuring.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "" -"Demonstrate what happens when the search is inexhaustive. Note the advantage " -"the Rust compiler provides by confirming when all cases are handled." -msgstr "" -"Démontrer ce qui se passe lorsque la recherche est inépuisable. Notez " -"l'avantage que le compilateur Rust fournit en confirmant quand tous les cas " -"sont traités." +msgid "11" +msgstr "11" -#: src/pattern-matching/destructuring.md -msgid "" -"Save the result of `divide_in_two` in the `result` variable and `match` it " -"in a loop. That won't compile because `msg` is consumed when matched. To fix " -"it, match `&result` instead of `result`. That will make `msg` a reference so " -"it won't be consumed. This [\"match ergonomics\"](https://rust-lang.github." -"io/rfcs/2005-match-ergonomics.html) appeared in Rust 2018. If you want to " -"support older Rust, replace `msg` with `ref msg` in the pattern." -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x3c" +msgstr "0x3c" -#: src/pattern-matching/let-control-flow.md -msgid "" -"Rust has a few control flow constructs which differ from other languages. " -"They are used for pattern matching:" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "RIS" +msgstr "SIR" -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`if let` expressions" -msgstr "expressions `si nous allons`" +msgid "0x40" +msgstr "0x40" -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`while let` expressions" -msgstr "expressions `while let`" +msgid "MIS" +msgstr "SIG" -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`match` expressions" -msgstr "expressions \"correspondantes\"" +msgid "0x44" +msgstr "0x44" -#: src/pattern-matching/let-control-flow.md -msgid "" -"The [`if let` expression](https://doc.rust-lang.org/reference/expressions/if-" -"expr.html#if-let-expressions) lets you execute different code depending on " -"whether a value matches a pattern:" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "ICR" +msgstr "RIC" -#: src/pattern-matching/let-control-flow.md -msgid "\"slept for {:?}\"" -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "0x48" +msgstr "0x48" -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart.md #, fuzzy -msgid "`let else` expressions" -msgstr "expressions `while let`" +msgid "DMACR" +msgstr "DMACR" -#: src/pattern-matching/let-control-flow.md -msgid "" -"For the common case of matching a pattern and returning from the function, " -"use [`let else`](https://doc.rust-lang.org/rust-by-example/flow_control/" -"let_else.html). The \"else\" case must diverge (`return`, `break`, or panic " -"- anything but falling off the end of the block)." -msgstr "" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "3" +msgstr "3" -#: src/pattern-matching/let-control-flow.md -msgid "\"got None\"" +#: src/bare-metal/aps/better-uart.md +#, fuzzy +msgid "There are also some ID registers that have been omitted for brevity." msgstr "" +"Il existe également des registres d'identification qui ont été omis par souci de brièveté." -#: src/pattern-matching/let-control-flow.md -msgid "\"got empty string\"" +#: src/bare-metal/aps/better-uart/bitflags.md +#, fuzzy +msgid "" +"The [`bitflags`](https://crates.io/crates/bitflags) crate is useful for working with " +"bitflags." msgstr "" +"Le crate [`bitflags`](https://crates.io/crates/bitflags) est utile pour travailler avec " +"les bitflags." -#: src/pattern-matching/let-control-flow.md -msgid "\"not a hex digit\"" +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Flags from the UART flag register.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md src/pattern-matching/solution.md -msgid "\"result: {:?}\"" +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Clear to send.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md src/generics/trait-bounds.md -#: src/smart-pointers/solution.md src/testing/solution.md -#: src/android/testing.md src/android/testing/googletest.md -msgid "\"foo\"" +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Data set ready.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md -#, fuzzy -msgid "" -"Like with `if let`, there is a [`while let`](https://doc.rust-lang.org/" -"reference/expressions/loop-expr.html#predicate-pattern-loops) variant which " -"repeatedly tests a value against a pattern:" +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Data carrier detect.\n" msgstr "" -"Comme avec `if`, il existe une variante `while let` qui teste à plusieurs " -"reprises une valeur contre un modèle :" -#: src/pattern-matching/let-control-flow.md -#, fuzzy -msgid "" -"Here [`String::pop`](https://doc.rust-lang.org/stable/std/string/struct." -"String.html#method.pop) returns `Some(c)` until the string is empty, after " -"which it will return `None`. The `while let` lets us keep iterating through " -"all items." +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// UART busy transmitting data.\n" msgstr "" -"Ici, l'itérateur renvoyé par `v.iter()` renverra une `Option` à chaque " -"appel à `next()`. Il renvoie `Some(x)` jusqu'à ce qu'il soit terminé, après " -"quoi il renvoie \"Aucun\". Le `while let` nous permet de continuer à " -"parcourir tous les éléments." -#: src/pattern-matching/let-control-flow.md -msgid "if-let" +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Receive FIFO is empty.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md -msgid "" -"Unlike `match`, `if let` does not have to cover all branches. This can make " -"it more concise than `match`." +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Transmit FIFO is full.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md -msgid "A common usage is handling `Some` values when working with `Option`." +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Receive FIFO is full.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md -msgid "" -"Unlike `match`, `if let` does not support guard clauses for pattern matching." +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Transmit FIFO is empty.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md -msgid "let-else" +#: src/bare-metal/aps/better-uart/bitflags.md +msgid "/// Ring indicator.\n" msgstr "" -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart/bitflags.md +#, fuzzy msgid "" -"`if-let`s can pile up, as shown. The `let-else` construct supports " -"flattening this nested code. Rewrite the awkward version for students, so " -"they can see the transformation." +"The `bitflags!` macro creates a newtype something like `struct Flags(u16)`, along with a " +"bunch of method implementations to get and set flags." msgstr "" +"La macro `bitflags!` crée un nouveau type quelque chose comme `Flags(u16)`, avec un tas " +"de méthodes implémentations pour obtenir et définir des drapeaux." -#: src/pattern-matching/let-control-flow.md -msgid "The rewritten version is:" -msgstr "" - -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart/registers.md #, fuzzy -msgid "while-let" -msgstr "expressions `while let`" +msgid "Multiple registers" +msgstr "Plusieurs registres" -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart/registers.md #, fuzzy -msgid "" -"Point out that the `while let` loop will keep going as long as the value " -"matches the pattern." +msgid "We can use a struct to represent the memory layout of the UART's registers." msgstr "" -"Soulignez que la boucle `while let` continuera tant que la valeur correspond " -"au modèle." +"Nous pouvons utiliser une structure pour représenter la disposition de la mémoire des " +"registres de l'UART." -#: src/pattern-matching/let-control-flow.md +#: src/bare-metal/aps/better-uart/registers.md #, fuzzy msgid "" -"You could rewrite the `while let` loop as an infinite loop with an if " -"statement that breaks when there is no value to unwrap for `name.pop()`. The " -"`while let` provides syntactic sugar for the above scenario." +"[`#[repr(C)]`](https://doc.rust-lang.org/reference/type-layout.html#the-c-representation) " +"tells the compiler to lay the struct fields out in order, following the same rules as C. " +"This is necessary for our struct to have a predictable layout, as default Rust " +"representation allows the compiler to (among other things) reorder fields however it sees " +"fit." msgstr "" -"Vous pouvez réécrire la boucle `while let` comme une boucle infinie avec une " -"instruction if qui s'interrompt lorsqu'il n'y a pas de valeur à déballer " -"pour `iter.next()`. Le `while let` fournit du sucre syntaxique pour le " -"scénario ci-dessus." +"[`#[repr(C)]`](https://doc.rust-lang.org/reference/type-layout.html#the-c-representation) " +"indique le compilateur pour disposer les champs struct dans l'ordre, en suivant les mêmes " +"règles que C. Ceci est nécessaire pour que notre structure ait une mise en page " +"prévisible, car la représentation Rust par défaut permet compilateur pour (entre autres) " +"réorganiser les champs comme bon lui semble." -#: src/pattern-matching/exercise.md -msgid "Let's write a simple recursive evaluator for arithmetic expressions." -msgstr "" +#: src/bare-metal/aps/better-uart/driver.md src/bare-metal/aps/safemmio/driver.md +#, fuzzy +msgid "Now let's use the new `Registers` struct in our driver." +msgstr "Utilisons maintenant la nouvelle structure `Registers` dans notre pilote." -#: src/pattern-matching/exercise.md -msgid "" -"The `Box` type here is a smart pointer, and will be covered in detail later " -"in the course. An expression can be \"boxed\" with `Box::new` as seen in the " -"tests. To evaluate a boxed expression, use the deref operator (`*`) to " -"\"unbox\" it: `eval(*boxed_expr)`." +#: src/bare-metal/aps/better-uart/driver.md src/bare-metal/aps/safemmio/driver.md +msgid "/// Driver for a PL011 UART.\n" msgstr "" -#: src/pattern-matching/exercise.md +#: src/bare-metal/aps/better-uart/driver.md msgid "" -"Some expressions cannot be evaluated and will return an error. The standard " -"[`Result`](https://doc.rust-lang.org/std/result/enum.Result." -"html) type is an enum that represents either a successful value " -"(`Ok(Value)`) or an error (`Err(String)`). We will cover this type in detail " -"later." +"/// Constructs a new instance of the UART driver for a PL011 device with the\n" +" /// given set of registers.\n" +" ///\n" +" /// # Safety\n" +" ///\n" +" /// The given pointer must point to the 8 MMIO control registers of a PL011\n" +" /// device, which must be mapped into the address space of the process as\n" +" /// device memory and not have any other aliases.\n" msgstr "" -#: src/pattern-matching/exercise.md +#: src/bare-metal/aps/better-uart/driver.md msgid "" -"Copy and paste the code into the Rust playground, and begin implementing " -"`eval`. The final product should pass the tests. It may be helpful to use " -"`todo!()` and get the tests to pass one-by-one. You can also skip a test " -"temporarily with `#[ignore]`:" +"// SAFETY: We know that self.registers points to the control registers\n" +" // of a PL011 device which is appropriately mapped.\n" msgstr "" -#: src/pattern-matching/exercise.md +#: src/bare-metal/aps/better-uart/driver.md src/bare-metal/aps/safemmio/driver.md msgid "" -"If you finish early, try writing a test that results in division by zero or " -"integer overflow. How could you handle this with `Result` instead of a panic?" -msgstr "" - -#: src/pattern-matching/exercise.md src/pattern-matching/solution.md -msgid "/// An operation to perform on two subexpressions.\n" -msgstr "" - -#: src/pattern-matching/exercise.md src/pattern-matching/solution.md -msgid "/// An expression, in tree form.\n" +"/// Reads and returns a pending byte, or `None` if nothing has been\n" +" /// received.\n" msgstr "" -#: src/pattern-matching/exercise.md src/pattern-matching/solution.md -msgid "/// An operation on two subexpressions.\n" +#: src/bare-metal/aps/better-uart/driver.md +msgid "" +"// SAFETY: We know that self.registers points to the control\n" +" // registers of a PL011 device which is appropriately mapped.\n" msgstr "" -#: src/pattern-matching/exercise.md src/pattern-matching/solution.md -msgid "/// A literal value\n" +#: src/bare-metal/aps/better-uart/driver.md src/bare-metal/aps/safemmio/driver.md +msgid "// TODO: Check for error conditions in bits 8-11.\n" msgstr "" -#: src/pattern-matching/exercise.md src/pattern-matching/solution.md -msgid "\"division by zero\"" +#: src/bare-metal/aps/better-uart/driver.md +#, fuzzy +msgid "" +"Note the use of `&raw const` / `&raw mut` to get pointers to individual fields without " +"creating an intermediate reference, which would be unsound." msgstr "" +"Notez l'utilisation de `addr_of!` / `addr_of_mut!` pour obtenir des pointeurs vers des " +"champs individuels sans créer une référence intermédiaire, qui serait malsaine." -#: src/pattern-matching/solution.md -msgid "\"expr: {:?}\"" +#: src/bare-metal/aps/better-uart/driver.md +msgid "" +"The example isn't included in the slides because it is very similar to the `safe-mmio` " +"example which comes next. You can run it in QEMU with `make qemu` under `src/bare-metal/" +"aps/examples` if you need to." msgstr "" -#: src/methods-and-traits/methods.md +#: src/bare-metal/aps/safemmio/registers.md #, fuzzy msgid "" -"Rust allows you to associate functions with your new types. You do this with " -"an `impl` block:" +"The [`safe-mmio`](https://crates.io/crates/safe-mmio) crate provides types to wrap " +"registers that can be read or written safely." msgstr "" -"Rust vous permet d'associer des fonctions à vos nouveaux types. Vous faites " -"cela avec un Bloc `impl` :" +"Le crate [`spin`](https://crates.io/crates/spin) fournit des équivalents basés sur des " +"verrous d'attente de plusieurs de ces primitives." -#: src/methods-and-traits/methods.md -msgid "// No receiver, a static method\n" +#: src/bare-metal/aps/safemmio/registers.md +msgid "Can't read" msgstr "" -#: src/methods-and-traits/methods.md -msgid "// Exclusive borrowed read-write access to self\n" +#: src/bare-metal/aps/safemmio/registers.md +msgid "Read has no side-effects" msgstr "" -#: src/methods-and-traits/methods.md -msgid "// Shared and read-only borrowed access to self\n" +#: src/bare-metal/aps/safemmio/registers.md +msgid "Read has side-effects" msgstr "" -#: src/methods-and-traits/methods.md -msgid "\"Recorded {} laps for {}:\"" +#: src/bare-metal/aps/safemmio/registers.md +msgid "Can't write" msgstr "" -#: src/methods-and-traits/methods.md -msgid "\"Lap {idx}: {lap} sec\"" +#: src/bare-metal/aps/safemmio/registers.md +msgid "[`ReadPure`](https://docs.rs/safe-mmio/latest/safe_mmio/fields/struct.ReadPure.html)" msgstr "" -#: src/methods-and-traits/methods.md -msgid "// Exclusive ownership of self\n" +#: src/bare-metal/aps/safemmio/registers.md +msgid "[`ReadOnly`](https://docs.rs/safe-mmio/latest/safe_mmio/fields/struct.ReadOnly.html)" msgstr "" -#: src/methods-and-traits/methods.md -msgid "\"Race {} is finished, total lap time: {}\"" +#: src/bare-metal/aps/safemmio/registers.md +msgid "Can write" msgstr "" -#: src/methods-and-traits/methods.md -msgid "\"Monaco Grand Prix\"" +#: src/bare-metal/aps/safemmio/registers.md +msgid "" +"[`WriteOnly`](https://docs.rs/safe-mmio/latest/safe_mmio/fields/struct.WriteOnly.html)" msgstr "" -#: src/methods-and-traits/methods.md -msgid "// race.add_lap(42);\n" +#: src/bare-metal/aps/safemmio/registers.md +msgid "" +"[`ReadPureWrite`](https://docs.rs/safe-mmio/latest/safe_mmio/fields/struct.ReadPureWrite." +"html)" msgstr "" -#: src/methods-and-traits/methods.md -#, fuzzy +#: src/bare-metal/aps/safemmio/registers.md msgid "" -"The `self` arguments specify the \"receiver\" - the object the method acts " -"on. There are several common receivers for a method:" +"[`ReadWrite`](https://docs.rs/safe-mmio/latest/safe_mmio/fields/struct.ReadWrite.html)" msgstr "" -"Le `&self` ci-dessus indique que la méthode emprunte l'objet de manière " -"immuable. Là sont d'autres récepteurs possibles pour une méthode :" -#: src/methods-and-traits/methods.md -#, fuzzy -msgid "" -"`&self`: borrows the object from the caller using a shared and immutable " -"reference. The object can be used again afterwards." +#: src/bare-metal/aps/safemmio/registers.md +msgid "Reading `dr` has a side effect: it pops a byte from the receive FIFO." msgstr "" -"`&self` : emprunte l'objet à l'appelant en utilisant un partage et immuable " -"référence. L'objet peut être réutilisé par la suite." -#: src/methods-and-traits/methods.md -#, fuzzy -msgid "" -"`&mut self`: borrows the object from the caller using a unique and mutable " -"reference. The object can be used again afterwards." +#: src/bare-metal/aps/safemmio/registers.md +msgid "Reading `rsr` (and other registers) has no side-effects. It is a 'pure' read." msgstr "" -"`&mut self` : emprunte l'objet à l'appelant en utilisant un nom unique et " -"mutable référence. L'objet peut être réutilisé par la suite." -#: src/methods-and-traits/methods.md -#, fuzzy +#: src/bare-metal/aps/safemmio/registers.md msgid "" -"`self`: takes ownership of the object and moves it away from the caller. The " -"method becomes the owner of the object. The object will be dropped " -"(deallocated) when the method returns, unless its ownership is explicitly " -"transmitted. Complete ownership does not automatically mean mutability." +"There are a number of different crates providing safe abstractions around MMIO " +"operations; we recommend the `safe-mmio` crate." msgstr "" -"`self` : prend possession de l'objet et l'éloigne de l'appelant. Le méthode " -"devient le propriétaire de l'objet. L'objet sera supprimé (désalloué) " -"lorsque la méthode revient, sauf si sa propriété est explicitement transmis." -#: src/methods-and-traits/methods.md -#, fuzzy -msgid "`mut self`: same as above, but the method can mutate the object." +#: src/bare-metal/aps/safemmio/registers.md +msgid "" +"The difference between `ReadPure` or `ReadOnly` (and likewise between `ReadPureWrite` and " +"`ReadWrite`) is whether reading a register can have side-effects that change the state of " +"the device, e.g., reading the data register pops a byte from the receive FIFO. `ReadPure` " +"means that reads have no side-effects, they are purely reading data." msgstr "" -"`mut self` : comme ci-dessus, mais tant que la méthode possède l'objet, elle " -"peut le faire muter aussi. La propriété complète ne signifie pas " -"automatiquement la mutabilité." -#: src/methods-and-traits/methods.md -#, fuzzy +#: src/bare-metal/aps/safemmio/driver.md msgid "" -"No receiver: this becomes a static method on the struct. Typically used to " -"create constructors which are called `new` by convention." +"/// Constructs a new instance of the UART driver for a PL011 device with the\n" +" /// given set of registers.\n" msgstr "" -"Pas de récepteur : cela devient une méthode statique sur la structure. " -"Généralement utilisé pour créer des constructeurs appelés \"nouveaux\" par " -"convention." -#: src/methods-and-traits/methods.md -#, fuzzy -msgid "It can be helpful to introduce methods by comparing them to functions." +#: src/bare-metal/aps/safemmio/driver.md +msgid "The driver no longer needs any unsafe code!" msgstr "" -"Il peut être utile d'introduire des méthodes en les comparant à des " -"fonctions." -#: src/methods-and-traits/methods.md -#, fuzzy +#: src/bare-metal/aps/safemmio/driver.md msgid "" -"Methods are called on an instance of a type (such as a struct or enum), the " -"first parameter represents the instance as `self`." +"`UniqueMmioPointer` is a wrapper around a raw pointer to an MMIO device or register. The " +"caller of `UniqueMmioPointer::new` promises that it is valid and unique for the given " +"lifetime, so it can provide safe methods to read and write fields." msgstr "" -"Les méthodes sont appelées sur une instance d'un type (tel qu'un struct ou " -"un enum), le premier paramètre représente l'instance en tant que \"self\"." -#: src/methods-and-traits/methods.md -#, fuzzy -msgid "" -"Developers may choose to use methods to take advantage of method receiver " -"syntax and to help keep them more organized. By using methods we can keep " -"all the implementation code in one predictable place." +#: src/bare-metal/aps/safemmio/driver.md +msgid "Note that `Uart::new` is now safe; `UniqueMmioPointer::new` is unsafe instead." msgstr "" -"Les développeurs peuvent choisir d'utiliser des méthodes pour tirer parti de " -"la syntaxe du récepteur de méthode et pour mieux les organiser. En utilisant " -"des méthodes, nous pouvons conserver tout le code d'implémentation en un " -"seul endroit prévisible." - -#: src/methods-and-traits/methods.md -#, fuzzy -msgid "Point out the use of the keyword `self`, a method receiver." -msgstr "Soulignez l'utilisation du mot-clé `self`, un récepteur de méthode." -#: src/methods-and-traits/methods.md -#, fuzzy +#: src/bare-metal/aps/safemmio/driver.md msgid "" -"Show that it is an abbreviated term for `self: Self` and perhaps show how " -"the struct name could also be used." +"These MMIO accesses are generally a wrapper around `read_volatile` and `write_volatile`, " +"though on aarch64 they are instead implemented in assembly to work around a bug where the " +"compiler can emit instructions that prevent MMIO virtualization." msgstr "" -"Montrez qu'il s'agit d'un terme abrégé pour `self:&Self` et montrez peut-" -"être comment le nom de la structure pourrait également être utilisé." -#: src/methods-and-traits/methods.md +#: src/bare-metal/aps/safemmio/driver.md #, fuzzy msgid "" -"Explain that `Self` is a type alias for the type the `impl` block is in and " -"can be used elsewhere in the block." +"The `field!` and `field_shared!` macros internally use `&raw mut` and `&raw const` to get " +"pointers to individual fields without creating an intermediate reference, which would be " +"unsound." msgstr "" -"Expliquez que `Self` est un alias de type pour le type dans lequel se trouve " -"le bloc `impl` et peut être utilisé ailleurs dans le bloc." +"Notez l'utilisation de `addr_of!` / `addr_of_mut!` pour obtenir des pointeurs vers des " +"champs individuels sans créer une référence intermédiaire, qui serait malsaine." -#: src/methods-and-traits/methods.md -#, fuzzy +#: src/bare-metal/aps/safemmio/driver.md msgid "" -"Note how `self` is used like other structs and dot notation can be used to " -"refer to individual fields." +"`field!` needs a mutable reference to a `UniqueMmioPointer`, and returns a " +"`UniqueMmioPointer` that allows reads with side effects and writes." msgstr "" -"Notez comment `self` est utilisé comme d'autres structures et la notation " -"par points peut être utilisée pour faire référence à des champs individuels." -#: src/methods-and-traits/methods.md -#, fuzzy +#: src/bare-metal/aps/safemmio/driver.md msgid "" -"This might be a good time to demonstrate how the `&self` differs from `self` " -"by trying to run `finish` twice." +"`field_shared!` works with a shared reference to either a `UniqueMmioPointer` or a " +"`SharedMmioPointer`. It returns a `SharedMmioPointer` that only allows pure reads." msgstr "" -"C'est peut-être le bon moment pour démontrer en quoi `&self` diffère de " -"`self` en modifiant le code et en essayant d'exécuter say_hello deux fois." -#: src/methods-and-traits/methods.md +#: src/bare-metal/aps/safemmio/using.md #, fuzzy msgid "" -"Beyond variants on `self`, there are also [special wrapper types](https://" -"doc.rust-lang.org/reference/special-types-and-traits.html) allowed to be " -"receiver types, such as `Box`." +"Let's write a small program using our driver to write to the serial console, and echo " +"incoming bytes." msgstr "" -"Au-delà des variantes sur \"self\", il y a aussi \\[types d'emballage " -"spéciaux\\] (https://doc.rust-lang.org/reference/special-types-and-traits." -"html) autorisés à être des types de récepteurs, tels que `Box`." +"Écrivons un petit programme en utilisant notre pilote pour écrire sur la console série et " +"écho entrant octets." -#: src/methods-and-traits/traits.md -#, fuzzy -msgid "" -"Rust lets you abstract over types with traits. They're similar to interfaces:" +#: src/bare-metal/aps/safemmio/using.md +msgid "b'\\r'" msgstr "" -"Rust vous permet d'abstraire les types avec des traits. Ils sont similaires " -"aux interfaces :" -#: src/methods-and-traits/traits.md -msgid "/// Return a sentence from this pet.\n" +#: src/bare-metal/aps/safemmio/using.md src/concurrency/async-pitfalls/cancellation.md +msgid "b'\\n'" msgstr "" -#: src/methods-and-traits/traits.md -msgid "/// Print a string to the terminal greeting this pet.\n" +#: src/bare-metal/aps/safemmio/using.md +msgid "b'q'" msgstr "" -#: src/methods-and-traits/traits.md +#: src/bare-metal/aps/safemmio/using.md +msgid "\"\\n\\nBye!\"" +msgstr "" + +#: src/bare-metal/aps/safemmio/using.md +#, fuzzy msgid "" -"A trait defines a number of methods that types must have in order to " -"implement the trait." +"Run the example in QEMU with `make qemu_safemmio` under `src/bare-metal/aps/examples`." msgstr "" +"Exécutez l'exemple dans QEMU avec `make qemu_psci` sous `src/bare-metal/aps/examples`." -#: src/methods-and-traits/traits.md +#: src/bare-metal/aps/logging.md +#, fuzzy msgid "" -"In the \"Generics\" segment, next, we will see how to build functionality " -"that is generic over all types implementing a trait." +"It would be nice to be able to use the logging macros from the [`log`](https://crates.io/" +"crates/log) crate. We can do this by implementing the `Log` trait." msgstr "" +"Ce serait bien de pouvoir utiliser les macros de journalisation du crate [`log`](https://" +"crates.io/crates/log). Nous pouvons le faire en implémentant le trait `Log`." -#: src/methods-and-traits/traits/implementing.md -msgid "\"Oh you're a cutie! What's your name? {}\"" +#: src/bare-metal/aps/logging.md +msgid "\"[{}] {}\"" msgstr "" -#: src/methods-and-traits/traits/implementing.md -#: src/smart-pointers/trait-objects.md -msgid "\"Woof, my name is {}!\"" +#: src/bare-metal/aps/logging.md +msgid "/// Initialises UART logger.\n" msgstr "" -#: src/methods-and-traits/traits/implementing.md -#: src/smart-pointers/trait-objects.md -msgid "\"Fido\"" +#: src/bare-metal/aps/logging.md +#, fuzzy +msgid "" +"The first unwrap in `log` will succeed because we initialize `LOGGER` before calling " +"`set_logger`. The second will succeed because `Uart::write_str` always returns `Ok`." msgstr "" +"Le déballage dans `log` est sûr car nous initialisons `LOGGER` avant d'appeler " +"`set_logger`." -#: src/methods-and-traits/traits/implementing.md -msgid "" -"To implement `Trait` for `Type`, you use an `impl Trait for Type { .. }` " -"block." +#: src/bare-metal/aps/logging/using.md +#, fuzzy +msgid "We need to initialise the logger before we use it." +msgstr "Nous devons initialiser l'enregistreur avant de l'utiliser." + +#: src/bare-metal/aps/logging/using.md src/exercises/bare-metal/solutions-afternoon.md +msgid "\"{info}\"" msgstr "" -#: src/methods-and-traits/traits/implementing.md -msgid "" -"Unlike Go interfaces, just having matching methods is not enough: a `Cat` " -"type with a `talk()` method would not automatically satisfy `Pet` unless it " -"is in an `impl Pet` block." +#: src/bare-metal/aps/logging/using.md +#, fuzzy +msgid "Note that our panic handler can now log details of panics." msgstr "" +"Notez que notre gestionnaire de panique peut désormais enregistrer les détails des " +"paniques." -#: src/methods-and-traits/traits/implementing.md +#: src/bare-metal/aps/logging/using.md #, fuzzy -msgid "" -"Traits may provide default implementations of some methods. Default " -"implementations can rely on all the methods of the trait. In this case, " -"`greet` is provided, and relies on `talk`." +msgid "Run the example in QEMU with `make qemu_logger` under `src/bare-metal/aps/examples`." msgstr "" -"Les caractéristiques peuvent spécifier des méthodes pré-implémentées (par " -"défaut) et des méthodes que les utilisateurs sont tenus de suivre mettre en " -"œuvre eux-mêmes. Les méthodes avec des implémentations par défaut peuvent " -"s'appuyer sur les méthodes requises." +"Exécutez l'exemple dans QEMU avec `make qemu_logger` sous `src/bare-metal/aps/examples`." -#: src/methods-and-traits/traits/supertraits.md +#: src/bare-metal/aps/exceptions.md msgid "" -"A trait can require that types implementing it also implement other traits, " -"called _supertraits_. Here, any type implementing `Pet` must implement " -"`Animal`." +"AArch64 defines an exception vector table with 16 entries, for 4 types of exceptions " +"(synchronous, IRQ, FIQ, SError) from 4 states (current EL with SP0, current EL with SPx, " +"lower EL using AArch64, lower EL using AArch32). We implement this in assembly to save " +"volatile registers to the stack before calling into Rust code:" msgstr "" -#: src/methods-and-traits/traits/supertraits.md -#: src/async/control-flow/select.md -msgid "\"Rex\"" +#: src/bare-metal/aps/exceptions.md +msgid "EL is exception level; all our examples this afternoon run in EL1." msgstr "" -#: src/methods-and-traits/traits/supertraits.md -msgid "\"{} has {} legs\"" +#: src/bare-metal/aps/exceptions.md +msgid "" +"For simplicity we aren't distinguishing between SP0 and SPx for the current EL " +"exceptions, or between AArch32 and AArch64 for the lower EL exceptions." msgstr "" -#: src/methods-and-traits/traits/supertraits.md +#: src/bare-metal/aps/exceptions.md msgid "" -"This is sometimes called \"trait inheritance\" but students should not " -"expect this to behave like OO inheritance. It just specifies an additional " -"requirement on implementations of a trait." +"For this example we just log the exception and power down, as we don't expect any of them " +"to actually happen." msgstr "" -#: src/methods-and-traits/traits/associated-types.md +#: src/bare-metal/aps/exceptions.md msgid "" -"Associated types are placeholder types which are supplied by the trait " -"implementation." +"We can think of exception handlers and our main execution context more or less like " +"different threads. [`Send` and `Sync`](../../concurrency/send-sync.md) will control what " +"we can share between them, just like with threads. For example, if we want to share some " +"value between exception handlers and the rest of the program, and it's `Send` but not " +"`Sync`, then we'll need to wrap it in something like a `Mutex` and put it in a static." msgstr "" -#: src/methods-and-traits/traits/associated-types.md -#: src/async/control-flow/join.md -msgid "\"{:?}\"" +#: src/bare-metal/aps/exceptions.md +msgid "The assembly code for the exception vector:" msgstr "" -#: src/methods-and-traits/traits/associated-types.md +#: src/bare-metal/aps/aarch64-rt.md msgid "" -"Associated types are sometimes also called \"output types\". The key " -"observation is that the implementer, not the caller, chooses this type." +"The `aarch64-rt` crate provides the assembly entry point and exception vector that we " +"implemented before. We just need to mark our main function with the `entry!` macro." msgstr "" -#: src/methods-and-traits/traits/associated-types.md +#: src/bare-metal/aps/aarch64-rt.md msgid "" -"Many standard library traits have associated types, including arithmetic " -"operators and `Iterator`." +"It also provides the `initial_pagetable!` macro to let us define an initial static " +"pagetable in Rust, rather than in assembly code like we did before." msgstr "" -#: src/methods-and-traits/deriving.md +#: src/bare-metal/aps/aarch64-rt.md msgid "" -"Supported traits can be automatically implemented for your custom types, as " -"follows:" +"We can also use the UART driver from the `arm-pl011-uart` crate rather than writing our " +"own." msgstr "" -#: src/methods-and-traits/deriving.md -msgid "// Default trait adds `default` constructor.\n" +#: src/bare-metal/aps/aarch64-rt.md src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Attributes to use for device memory in the initial identity map.\n" msgstr "" -#: src/methods-and-traits/deriving.md -msgid "// Clone trait adds `clone` method.\n" +#: src/bare-metal/aps/aarch64-rt.md src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Attributes to use for normal memory in the initial identity map.\n" msgstr "" -#: src/methods-and-traits/deriving.md -msgid "\"EldurScrollz\"" +#: src/bare-metal/aps/aarch64-rt.md src/exercises/bare-metal/solutions-afternoon.md +msgid "// 1 GiB of device memory.\n" msgstr "" -#: src/methods-and-traits/deriving.md -msgid "// Debug trait adds support for printing with `{:?}`.\n" +#: src/bare-metal/aps/aarch64-rt.md src/exercises/bare-metal/solutions-afternoon.md +msgid "// 1 GiB of normal memory.\n" msgstr "" -#: src/methods-and-traits/deriving.md -msgid "\"{:?} vs. {:?}\"" +#: src/bare-metal/aps/aarch64-rt.md src/exercises/bare-metal/solutions-afternoon.md +msgid "// Another 1 GiB of device memory starting at 256 GiB.\n" msgstr "" -#: src/methods-and-traits/deriving.md -msgid "" -"Derivation is implemented with macros, and many crates provide useful derive " -"macros to add useful functionality. For example, `serde` can derive " -"serialization support for a struct using `#[derive(Serialize)]`." +#: src/bare-metal/aps/aarch64-rt.md src/exercises/bare-metal/solutions-afternoon.md +msgid "\"system_off returned\"" msgstr "" -#: src/methods-and-traits/exercise.md +#: src/bare-metal/aps/aarch64-rt.md #, fuzzy -msgid "Exercise: Logger Trait" -msgstr "Exercices" +msgid "Run the example in QEMU with `make qemu_rt` under `src/bare-metal/aps/examples`." +msgstr "Exécutez l'exemple dans QEMU avec `make qemu` sous `src/bare-metal/aps/examples`." -#: src/methods-and-traits/exercise.md +#: src/bare-metal/aps/aarch64-rt/exceptions.md msgid "" -"Let's design a simple logging utility, using a trait `Logger` with a `log` " -"method. Code which might log its progress can then take an `&impl Logger`. " -"In testing, this might put messages in the test logfile, while in a " -"production build it would send messages to a log server." +"`aarch64-rt` provides a trait to define exception handlers, and a macro to generate the " +"assembly code for the exception vector to call them." msgstr "" -#: src/methods-and-traits/exercise.md +#: src/bare-metal/aps/aarch64-rt/exceptions.md msgid "" -"However, the `StderrLogger` given below logs all messages, regardless of " -"verbosity. Your task is to write a `VerbosityFilter` type that will ignore " -"messages above a maximum verbosity." +"The trait has default implementations for each method which simply panic, so we can omit " +"methods for exceptions we don't expect to happen." msgstr "" -#: src/methods-and-traits/exercise.md +#: src/bare-metal/aps/aarch64-rt/exceptions.md msgid "" -"This is a common pattern: a struct wrapping a trait implementation and " -"implementing that same trait, adding behavior in the process. What other " -"kinds of wrappers might be useful in a logging utility?" +"The `exception_handlers` macro generates a `global_asm!` block with the exception vector " +"to call into the Rust code, similar to the `exceptions.S` we had before." msgstr "" -#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md -msgid "/// Log a message at the given verbosity level.\n" +#: src/bare-metal/aps/aarch64-rt/exceptions.md +msgid "" +"`RegisterStateRef` wraps a reference to the stack frame where the register values were " +"saved by the assembly code when the exception happed. This can be used for example to " +"extract the parameters for an SMC or HVC call from a lower EL, and update the values to " +"be restored when the exception handler returns." msgstr "" -#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md -msgid "\"verbosity={verbosity}: {message}\"" -msgstr "" +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "[oreboot](https://github.com/oreboot/oreboot)" +msgstr "[oreboot](https://github.com/oreboot/oreboot)" -#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md -msgid "\"FYI\"" -msgstr "" +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "\"coreboot without the C\"." +msgstr "\"coreboot sans le C\"" -#: src/methods-and-traits/exercise.md src/methods-and-traits/solution.md -msgid "\"Uhoh\"" -msgstr "" +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "Supports x86, aarch64 and RISC-V." +msgstr "Prend en charge x86, aarch64 et RISC-V." -#: src/methods-and-traits/exercise.md -msgid "// TODO: Define and implement `VerbosityFilter`.\n" -msgstr "" +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "Relies on LinuxBoot rather than having many drivers itself." +msgstr "S'appuie sur LinuxBoot plutôt que d'avoir lui-même de nombreux pilotes." -#: src/methods-and-traits/solution.md -msgid "/// Only log messages up to the given verbosity level.\n" +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "" +"[Rust RaspberryPi OS tutorial](https://github.com/rust-embedded/rust-raspberrypi-OS-" +"tutorials)" msgstr "" +"\\[Tutoriel Rust RaspberryPi OS\\] (https://github.com/rust-embedded/rust-raspberrypi-OS-" +"tutorials)" -#: src/generics/generic-functions.md +#: src/bare-metal/aps/other-projects.md #, fuzzy msgid "" -"Rust supports generics, which lets you abstract algorithms or data " -"structures (such as sorting or a binary tree) over the types used or stored." +"Initialization, UART driver, simple bootloader, JTAG, exception levels, exception " +"handling, page tables." msgstr "" -"Rust prend en charge les génériques, ce qui vous permet d'abstraire un " -"algorithme (comme le tri) sur les types utilisés dans l'algorithme." +"Initialisation, pilote UART, chargeur de démarrage simple, JTAG, niveaux d'exception, " +"gestion des exceptions, tables de pages" -#: src/generics/generic-functions.md -msgid "/// Pick `even` or `odd` depending on the value of `n`.\n" -msgstr "" +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "" +"Some caveats around cache maintenance and initialization in Rust, not necessarily a good " +"example to copy for production code." +msgstr "Pas tous très bien écrits, alors méfiez-vous." -#: src/generics/generic-functions.md -msgid "\"picked a number: {:?}\"" +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "[`cargo-call-stack`](https://crates.io/crates/cargo-call-stack)" +msgstr "[`pile-appel-cargo`](https://crates.io/crates/pile-appel-cargo)" + +#: src/bare-metal/aps/other-projects.md +#, fuzzy +msgid "Static analysis to determine maximum stack usage." +msgstr "Analyse statique pour déterminer l'utilisation maximale de la pile." + +#: src/bare-metal/aps/other-projects.md +msgid "" +"The RaspberryPi OS tutorial runs Rust code before the MMU and caches are enabled. This " +"will read and write memory (e.g. the stack). However, this has the problems mentioned at " +"the beginning of this session regarding unaligned access and cache coherency." msgstr "" -#: src/generics/generic-functions.md -msgid "\"picked a tuple: {:?}\"" +#: src/bare-metal/useful-crates.md +msgid "Useful crates" +msgstr "Crates utiles" + +#: src/bare-metal/useful-crates.md +#, fuzzy +msgid "" +"We'll look at a few crates that solve some common problems in bare-metal programming." msgstr "" +"Nous allons passer en revue quelques caisses qui résolvent certains problèmes courants de " +"la programmation bare-metal." -#: src/generics/generic-functions.md -msgid "\"dog\"" +#: src/bare-metal/useful-crates/zerocopy.md +#, fuzzy +msgid "" +"The [`zerocopy`](https://docs.rs/zerocopy/) crate (from Fuchsia) provides traits and " +"macros for safely converting between byte sequences and other types." msgstr "" +"La caisse [`zerocopy`](https://docs.rs/zerocopy/) (de Fuchsia) fournit des traits et des " +"macros pour convertir en toute sécurité entre séquences d'octets et autres types." -#: src/generics/generic-functions.md -msgid "\"cat\"" +#: src/bare-metal/useful-crates/zerocopy.md +#, fuzzy +msgid "" +"This is not suitable for MMIO (as it doesn't use volatile reads and writes), but can be " +"useful for working with structures shared with hardware e.g. by DMA, or sent over some " +"external interface." msgstr "" +"Ce n'est pas adapté pour MMIO (car il n'utilise pas de lectures et d'écritures " +"volatiles), mais peut être utile pour travailler avec des structures partagées avec du " +"matériel, par ex. par DMA, ou envoyé sur une interface externe." -#: src/generics/generic-functions.md +#: src/bare-metal/useful-crates/zerocopy.md +#, fuzzy msgid "" -"Rust infers a type for T based on the types of the arguments and return " -"value." +"`FromBytes` can be implemented for types for which any byte pattern is valid, and so can " +"safely be converted from an untrusted sequence of bytes." msgstr "" +"`FromBytes` peut être implémenté pour les types pour lesquels n'importe quel modèle " +"d'octet est valide, et peut donc être en toute sécurité converti à partir d'une séquence " +"d'octets non fiable." -#: src/generics/generic-functions.md +#: src/bare-metal/useful-crates/zerocopy.md +#, fuzzy msgid "" -"This is similar to C++ templates, but Rust partially compiles the generic " -"function immediately, so that function must be valid for all types matching " -"the constraints. For example, try modifying `pick` to return `even + odd` if " -"`n == 0`. Even if only the `pick` instantiation with integers is used, Rust " -"still considers it invalid. C++ would let you do this." +"Attempting to derive `FromBytes` for these types would fail, because `RequestType` " +"doesn't use all possible u32 values as discriminants, so not all byte patterns are valid." msgstr "" +"Tenter de dériver `FromBytes` pour ces types échouerait, car `RequestType` n'utilise pas " +"tous les valeurs u32 possibles comme discriminants, donc tous les modèles d'octets ne " +"sont pas valides." -#: src/generics/generic-functions.md +#: src/bare-metal/useful-crates/zerocopy.md +#, fuzzy +msgid "`zerocopy::byteorder` has types for byte-order aware numeric primitives." +msgstr "" +"`zerocopy::byteorder` a des types pour les primitives numériques sensibles à l'ordre des " +"octets." + +#: src/bare-metal/useful-crates/zerocopy.md #, fuzzy msgid "" -"Generic code is turned into non-generic code based on the call sites. This " -"is a zero-cost abstraction: you get exactly the same result as if you had " -"hand-coded the data structures without the abstraction." +"Run the example with `cargo run` under `src/bare-metal/useful-crates/zerocopy-example/`. " +"(It won't run in the Playground because of the crate dependency.)" msgstr "" -"Il s'agit d'une abstraction à coût nul : vous obtenez exactement le même " -"résultat que si vous aviez codé à la main les structures de données sans " -"l'abstraction." +"Exécutez l'exemple avec `cargo run` sous `src/bare-metal/useful-crates/zerocopy-example/" +"`. (Ce ne sera pas exécuter dans le Playground en raison de la dépendance de la caisse.)" -#: src/generics/generic-data.md +#: src/bare-metal/useful-crates/aarch64-paging.md #, fuzzy -msgid "You can use generics to abstract over the concrete field type:" +msgid "" +"The [`aarch64-paging`](https://crates.io/crates/aarch64-paging) crate lets you create " +"page tables according to the AArch64 Virtual Memory System Architecture." msgstr "" -"Vous pouvez utiliser des génériques pour résumer le type de champ concret :" +"La caisse [`aarch64-paging`](https://crates.io/crates/aarch64-paging) vous permet de " +"créer des tables de pages en fonction de la mémoire virtuelle AArch64 Architecture du " +"système." -#: src/generics/generic-data.md -msgid "// fn set_x(&mut self, x: T)\n" +#: src/bare-metal/useful-crates/aarch64-paging.md +msgid "// Create a new page table with identity mapping.\n" msgstr "" -#: src/generics/generic-data.md -msgid "\"{integer:?} and {float:?}\"" +#: src/bare-metal/useful-crates/aarch64-paging.md +msgid "// Map a 2 MiB region of memory as read-only.\n" msgstr "" -#: src/generics/generic-data.md -msgid "\"coords: {:?}\"" +#: src/bare-metal/useful-crates/aarch64-paging.md +msgid "// Set `TTBR0_EL1` to activate the page table.\n" msgstr "" -#: src/generics/generic-data.md +#: src/bare-metal/useful-crates/aarch64-paging.md #, fuzzy msgid "" -"_Q:_ Why `T` is specified twice in `impl Point {}`? Isn't that " -"redundant?" +"This is used in Android for the [Protected VM Firmware](https://cs.android.com/android/" +"platform/superproject/main/+/main:packages/modules/Virtualization/guest/pvmfw/)." msgstr "" -"_Q :_ Pourquoi `T` est spécifié deux fois dans `impl Point {}` ? N'est-" -"ce pas redondant ?" +"Ceci est utilisé dans Android pour le \\[micrologiciel de la machine virtuelle " +"protégée\\] [2](https://cs.android.com/android/platform/superproject/+/master:packages/" +"modules/Virtualization/pvmfw/)." -#: src/generics/generic-data.md +#: src/bare-metal/useful-crates/aarch64-paging.md #, fuzzy msgid "" -"This is because it is a generic implementation section for generic type. " -"They are independently generic." +"There's no easy way to run this example by itself, as it needs to run on real hardware or " +"under QEMU." msgstr "" -"C'est parce qu'il s'agit d'une section d'implémentation générique pour le " -"type générique. Ils sont indépendamment génériques." +"Il n'y a pas de moyen simple d'exécuter cet exemple, car il doit être exécuté sur du " +"matériel réel ou sous QEMU." -#: src/generics/generic-data.md +#: src/bare-metal/useful-crates/buddy_system_allocator.md #, fuzzy -msgid "It means these methods are defined for any `T`." -msgstr "Cela signifie que ces méthodes sont définies pour n'importe quel `T`." +msgid "" +"[`buddy_system_allocator`](https://crates.io/crates/buddy_system_allocator) is a crate " +"that implements a basic buddy system allocator. It can be used both to implement " +"[`GlobalAlloc`](https://doc.rust-lang.org/core/alloc/trait.GlobalAlloc.html) (using " +"[`LockedHeap`](https://docs.rs/buddy_system_allocator/0.9.0/buddy_system_allocator/struct." +"LockedHeap.html)) so you can use the standard `alloc` crate (as we saw [before](../alloc." +"md)), or for allocating other address space (using [`FrameAllocator`](https://docs.rs/" +"buddy_system_allocator/0.9.0/buddy_system_allocator/struct.FrameAllocator.html)) . For " +"example, we might want to allocate MMIO space for PCI BARs:" +msgstr "" +"[`buddy_system_allocator`](https://crates.io/crates/buddy_system_allocator) est une " +"caisse tierce implémentant un système d'allocation de copains de base. Il peut être " +"utilisé à la fois pour [`LockedHeap`](https://docs.rs/buddy_system_allocator/0.9.0/" +"buddy_system_allocator/struct.LockedHeap.html) implémentant [`GlobalAlloc`](https://doc." +"rust-lang.org/core/alloc/trait.GlobalAlloc.html) afin que vous puissiez utiliser le " +"caisse `alloc` standard (comme nous l'avons vu \\[avant\\] [4](../alloc.md)), ou pour " +"allouer un autre espace d'adressage. Par exemple, nous pourrions vouloir allouer de " +"l'espace MMIO pour les PCI BAR :" -#: src/generics/generic-data.md +#: src/bare-metal/useful-crates/buddy_system_allocator.md #, fuzzy -msgid "It is possible to write `impl Point { .. }`." -msgstr "Il est possible d'écrire `impl Point { .. }`." +msgid "PCI BARs always have alignment equal to their size." +msgstr "Les PCI BAR ont toujours un alignement égal à leur taille." -#: src/generics/generic-data.md +#: src/bare-metal/useful-crates/buddy_system_allocator.md #, fuzzy msgid "" -"`Point` is still generic and you can use `Point`, but methods in this " -"block will only be available for `Point`." +"Run the example with `cargo run` under `src/bare-metal/useful-crates/allocator-example/`. " +"(It won't run in the Playground because of the crate dependency.)" msgstr "" -"`Point` est toujours générique et vous pouvez utiliser `Point`, mais " -"les méthodes de ce bloc ne seront disponibles que pour `Point`." +"Exécutez l'exemple avec `cargo run` sous `src/bare-metal/useful-crates/allocator-example/" +"`. (Ce ne sera pas exécuter dans le Playground en raison de la dépendance de la caisse.)" -#: src/generics/generic-data.md +#: src/bare-metal/useful-crates/tinyvec.md +#, fuzzy msgid "" -"Try declaring a new variable `let p = Point { x: 5, y: 10.0 };`. Update the " -"code to allow points that have elements of different types, by using two " -"type variables, e.g., `T` and `U`." +"Sometimes you want something that can be resized like a `Vec`, but without heap " +"allocation. [`tinyvec`](https://crates.io/crates/tinyvec) provides this: a vector backed " +"by an array or slice, which could be statically allocated or on the stack, that keeps " +"track of how many elements are used and panics if you try to use more than are allocated." msgstr "" +"Parfois, vous voulez quelque chose qui peut être redimensionné comme un `Vec`, mais sans " +"allocation de tas. [`tinyvec`](https://crates.io/crates/tinyvec) fournit ceci : un " +"vecteur soutenu par un tableau ou une tranche, qui pourrait être statiquement alloué ou " +"sur la pile, qui garde une trace du nombre d'éléments utilisés et panique si vous essayez " +"de utiliser plus que ce qui est alloué." -#: src/generics/generic-traits.md -msgid "" -"Traits can also be generic, just like types and functions. A trait's " -"parameters get concrete types when it is used." +#: src/bare-metal/useful-crates/tinyvec.md +#, fuzzy +msgid "`tinyvec` requires that the element type implement `Default` for initialization." msgstr "" +"`tinyvec` nécessite que le type d'élément implémente `Default` pour l'initialisation." -#: src/generics/generic-traits.md -msgid "\"Converted from integer: {from}\"" -msgstr "" +#: src/bare-metal/useful-crates/tinyvec.md +#, fuzzy +msgid "The Rust Playground includes `tinyvec`, so this example will run fine inline." +msgstr "Le Rust Playground inclut `tinyvec`, donc cet exemple fonctionnera bien en ligne." -#: src/generics/generic-traits.md -msgid "\"Converted from bool: {from}\"" +#: src/bare-metal/useful-crates/spin.md +#, fuzzy +msgid "" +"`std::sync::Mutex` and the other synchronisation primitives from `std::sync` are not " +"available in `core` or `alloc`. How can we manage synchronisation or interior mutability, " +"such as for sharing state between different CPUs?" msgstr "" +"`std::sync::Mutex` et les autres primitives de synchronisation de `std::sync` ne sont pas " +"disponibles dans `core` ou `alloc`. Comment gérer la synchronisation ou la mutabilité " +"intérieure, comme pour le partage état entre différents processeurs ?" -#: src/generics/generic-traits.md -msgid "\"{from_int:?}, {from_bool:?}\"" +#: src/bare-metal/useful-crates/spin.md +#, fuzzy +msgid "" +"The [`spin`](https://crates.io/crates/spin) crate provides spinlock-based equivalents of " +"many of these primitives." msgstr "" +"Le crate [`spin`](https://crates.io/crates/spin) fournit des équivalents basés sur des " +"verrous d'attente de plusieurs de ces primitives." -#: src/generics/generic-traits.md -msgid "" -"The `From` trait will be covered later in the course, but its [definition in " -"the `std` docs](https://doc.rust-lang.org/std/convert/trait.From.html) is " -"simple." +#: src/bare-metal/useful-crates/spin.md +msgid "Be careful to avoid deadlock if you take locks in interrupt handlers." msgstr "" -#: src/generics/generic-traits.md +#: src/bare-metal/useful-crates/spin.md msgid "" -"Implementations of the trait do not need to cover all possible type " -"parameters. Here, `Foo::From(\"hello\")` would not compile because there is " -"no `From<&str>` implementation for `Foo`." +"`spin` also has a ticket lock mutex implementation; equivalents of `RwLock`, `Barrier` " +"and `Once` from `std::sync`; and `Lazy` for lazy initialization." msgstr "" -#: src/generics/generic-traits.md +#: src/bare-metal/useful-crates/spin.md msgid "" -"Generic traits take types as \"input\", while associated types are a kind of " -"\"output type. A trait can have multiple implementations for different input " -"types." +"The [`once_cell`](https://crates.io/crates/once_cell) crate also has some useful types " +"for late initialization with a slightly different approach to `spin::once::Once`." msgstr "" -#: src/generics/generic-traits.md -msgid "" -"In fact, Rust requires that at most one implementation of a trait match for " -"any type T. Unlike some other languages, Rust has no heuristic for choosing " -"the \"most specific\" match. There is work on adding this support, called " -"[specialization](https://rust-lang.github.io/rfcs/1210-impl-specialization." -"html)." +#: src/bare-metal/useful-crates/spin.md +msgid "The Rust Playground includes `spin`, so this example will run fine inline." msgstr "" -#: src/generics/trait-bounds.md +#: src/bare-metal/android.md #, fuzzy msgid "" -"When working with generics, you often want to require the types to implement " -"some trait, so that you can call this trait's methods." +"To build a bare-metal Rust binary in AOSP, you need to use a `rust_ffi_static` Soong rule " +"to build your Rust code, then a `cc_binary` with a linker script to produce the binary " +"itself, and then a `raw_binary` to convert the ELF to a raw binary ready to be run." msgstr "" -"Lorsque vous travaillez avec des génériques, vous souhaitez souvent exiger " -"que les types implémentent un trait, afin que vous puissiez appeler les " -"méthodes de ce trait." +"Pour construire un binaire Rust bare-metal dans AOSP, vous devez utiliser une règle Soong " +"`rust_ffi_static` pour construire votre code Rust, puis un `cc_binary` avec un script de " +"liaison pour produire le binaire lui-même, puis un `raw_binary` pour convertir l'ELF en " +"un binaire brut prêt à être exécuté." -#: src/generics/trait-bounds.md -#, fuzzy -msgid "You can do this with `T: Trait` or `impl Trait`:" -msgstr "Vous pouvez le faire avec `T: Trait` ou `impl Trait` :" - -#: src/generics/trait-bounds.md -msgid "// struct NotClonable;\n" -msgstr "" +#: src/bare-metal/android/vmbase.md +msgid "vmbase" +msgstr "vmbase" -#: src/generics/trait-bounds.md -msgid "\"{pair:?}\"" +#: src/bare-metal/android/vmbase.md +#, fuzzy +msgid "" +"For VMs running under crosvm on aarch64, the [vmbase](https://android.googlesource.com/" +"platform/packages/modules/Virtualization/+/refs/heads/main/libs/libvmbase/) library " +"provides a linker script and useful defaults for the build rules, along with an entry " +"point, UART console logging and more." msgstr "" +"Pour les machines virtuelles exécutées sous crosvm sur aarch64, la bibliothèque [vmbase]" +"(https://android.googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/" +"master/vmbase/) fournit un script de liaison et des informations utiles. valeurs par " +"défaut pour les règles de construction, ainsi qu'un point d'entrée, la journalisation de " +"la console UART et plus encore." -#: src/generics/trait-bounds.md -msgid "Try making a `NonClonable` and passing it to `duplicate`." +#: src/bare-metal/android/vmbase.md +#, fuzzy +msgid "" +"The `main!` macro marks your main function, to be called from the `vmbase` entry point." msgstr "" +"La macro `main!` marque votre fonction principale, à appeler depuis le point d'entrée " +"`vmbase`." -#: src/generics/trait-bounds.md -msgid "When multiple traits are necessary, use `+` to join them." +#: src/bare-metal/android/vmbase.md +#, fuzzy +msgid "" +"The `vmbase` entry point handles console initialisation, and issues a PSCI_SYSTEM_OFF to " +"shutdown the VM if your main function returns." msgstr "" +"Le point d'entrée `vmbase` gère l'initialisation de la console et émet un PSCI_SYSTEM_OFF " +"pour l'arrêt la VM si votre fonction principale revient." -#: src/generics/trait-bounds.md +#: src/exercises/bare-metal/afternoon.md #, fuzzy -msgid "Show a `where` clause, students will encounter it when reading code." -msgstr "" -"Montrez une clause \"où\", les étudiants la rencontreront lors de la lecture " -"du code." +msgid "We will write a driver for the PL031 real-time clock device." +msgstr "Nous allons écrire un pilote pour le dispositif d'horloge en temps réel PL031." -#: src/generics/trait-bounds.md +#: src/exercises/bare-metal/afternoon.md #, fuzzy -msgid "It declutters the function signature if you have many parameters." +msgid "" +"After looking at the exercises, you can look at the [solutions](solutions-afternoon.md) " +"provided." msgstr "" -"Cela désencombre la signature de la fonction si vous avez beaucoup de " -"paramètres." +"Après avoir regardé l'exercice, vous pouvez regarder la [solution](solutions-afternoon." +"md) fournie." -#: src/generics/trait-bounds.md +#: src/exercises/bare-metal/rtc.md src/exercises/bare-metal/solutions-afternoon.md #, fuzzy -msgid "It has additional features making it more powerful." -msgstr "Il a des fonctionnalités supplémentaires qui le rendent plus puissant." +msgid "RTC driver" +msgstr "Pilote RTC" -#: src/generics/trait-bounds.md +#: src/exercises/bare-metal/rtc.md #, fuzzy msgid "" -"If someone asks, the extra feature is that the type on the left of \":\" can " -"be arbitrary, like `Option`." +"The QEMU aarch64 virt machine has a [PL031](https://developer.arm.com/documentation/" +"ddi0224/c) real-time clock at 0x9010000. For this exercise, you should write a driver for " +"it." msgstr "" -"Si quelqu'un demande, la fonctionnalité supplémentaire est que le type à " -"gauche de \":\" peut être arbitraire, comme `Option`." +"La machine QEMU aarch64 virt a une horloge en temps réel \\[PL031\\] [1](https://" +"developer.arm.com/documentation/ddi0224/c) à 0x9010000. Pour cet exercice, vous devrait " +"écrire un pilote pour cela et l'utiliser pour imprimer l'heure actuelle sur la console " +"série. Vous pouvez utiliser la caisse [`chrono`](https://crates.io/crates/chrono) pour le " +"formatage de la date/heure." -#: src/generics/trait-bounds.md +#: src/exercises/bare-metal/rtc.md msgid "" -"Note that Rust does not (yet) support specialization. For example, given the " -"original `duplicate`, it is invalid to add a specialized `duplicate(a: u32)`." +"Use it to print the current time to the serial console. You can use the [`chrono`]" +"(https://crates.io/crates/chrono) crate for date/time formatting." msgstr "" -#: src/generics/impl-trait.md -#, fuzzy +#: src/exercises/bare-metal/rtc.md msgid "" -"Similar to trait bounds, an `impl Trait` syntax can be used in function " -"arguments and return values:" +"Use the match register and raw interrupt status to busy-wait until a given time, e.g. 3 " +"seconds in the future. (Call [`core::hint::spin_loop`](https://doc.rust-lang.org/core/" +"hint/fn.spin_loop.html) inside the loop.)" msgstr "" -"Semblable aux limites de trait, une syntaxe `impl Trait` peut être utilisée " -"dans la fonction arguments et valeurs de retour :" -#: src/generics/impl-trait.md +#: src/exercises/bare-metal/rtc.md msgid "" -"// Syntactic sugar for:\n" -"// fn add_42_millions>(x: T) -> i32 {\n" -msgstr "" - -#: src/generics/impl-trait.md -msgid "\"{many}\"" +"_Extension if you have time:_ Enable and handle the interrupt generated by the RTC match. " +"You can use the driver provided in the [`arm-gic`](https://docs.rs/arm-gic/) crate to " +"configure the Arm Generic Interrupt Controller." msgstr "" -#: src/generics/impl-trait.md -msgid "\"{many_more}\"" +#: src/exercises/bare-metal/rtc.md +msgid "Use the RTC interrupt, which is wired to the GIC as `IntId::spi(2)`." msgstr "" -#: src/generics/impl-trait.md -msgid "\"debuggable: {debuggable:?}\"" +#: src/exercises/bare-metal/rtc.md +msgid "" +"Once the interrupt is enabled, you can put the core to sleep via `arm_gic::wfi()`, which " +"will cause the core to sleep until it receives an interrupt." msgstr "" -#: src/generics/impl-trait.md +#: src/exercises/bare-metal/rtc.md #, fuzzy msgid "" -"`impl Trait` allows you to work with types which you cannot name. The " -"meaning of `impl Trait` is a bit different in the different positions." +"Download the [exercise template](../../comprehensive-rust-exercises.zip) and look in the " +"`rtc` directory for the following files." msgstr "" -"La signification de `impl Trait` est un peu différente dans les différentes " -"positions." +"Téléchargez le \\[modèle d'exercice\\] (../../comprehensive-rust-exercises.zip) et " +"regardez dans le `rtc` répertoire pour les fichiers suivants." -#: src/generics/impl-trait.md +#: src/exercises/bare-metal/rtc.md #, fuzzy msgid "" -"For a parameter, `impl Trait` is like an anonymous generic parameter with a " -"trait bound." -msgstr "" -"Pour un paramètre, `impl Trait` est comme un paramètre générique anonyme " -"avec un trait lié." +"_src/exceptions.rs_ (you should only need to change this for the 3rd part of the " +"exercise):" +msgstr "`src/exceptions.rs` (vous ne devriez pas avoir besoin de le modifier) :" -#: src/generics/impl-trait.md +#: src/exercises/bare-metal/rtc.md #, fuzzy -msgid "" -"For a return type, it means that the return type is some concrete type that " -"implements the trait, without naming the type. This can be useful when you " -"don't want to expose the concrete type in a public API." -msgstr "" -"Pour un type de retour, cela signifie que le type de retour est un type " -"concret qui implémente le trait, sans nommer le type. Cela peut être utile " -"lorsque vous ne souhaitez pas exposer le type concret dans un API publique." +msgid "_src/logger.rs_ (you shouldn't need to change this):" +msgstr "`src/logger.rs` (vous ne devriez pas avoir besoin de le modifier) :" -#: src/generics/impl-trait.md +#: src/exercises/bare-metal/rtc.md #, fuzzy -msgid "" -"Inference is hard in return position. A function returning `impl Foo` picks " -"the concrete type it returns, without writing it out in the source. A " -"function returning a generic type like `collect() -> B` can return any " -"type satisfying `B`, and the caller may need to choose one, such as with " -"`let x: Vec<_> = foo.collect()` or with the turbofish, `foo.collect::" -">()`." +msgid "_build.rs_ (you shouldn't need to change this):" +msgstr "`build.rs` (vous ne devriez pas avoir besoin de le modifier) :" + +#: src/exercises/bare-metal/rtc.md +#, fuzzy +msgid "_memory.ld_ (you shouldn't need to change this):" +msgstr "`image.ld` (vous ne devriez pas avoir besoin de le modifier) :" + +#: src/exercises/bare-metal/rtc.md +#, fuzzy +msgid "_Makefile_ (you shouldn't need to change this):" +msgstr "`Makefile` (vous ne devriez pas avoir besoin de le modifier) :" + +#: src/exercises/bare-metal/rtc.md +#, fuzzy +msgid "Run the code in QEMU with `make qemu`." +msgstr "Exécutez le code dans QEMU avec `make qemu`." + +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "Bare Metal Rust Afternoon" +msgstr "Bare Metal Rust Après-midi" + +#: src/exercises/bare-metal/solutions-afternoon.md +#, fuzzy +msgid "([back to exercise](rtc.md))" +msgstr "([retour à l'exercice](rtc.md))" + +#: src/exercises/bare-metal/solutions-afternoon.md +#, fuzzy +msgid "_main.rs_:" +msgstr "`main.rs` :" + +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Base addresses of the GICv3.\n" msgstr "" -"L'inférence est difficile en position de retour. Une fonction renvoyant " -"`impl Foo` sélectionne le type concret qu'il renvoie, sans l'écrire dans la " -"source. Une fonction retourner un type générique comme `collect() -> B` " -"peut retourner n'importe quel type satisfaisant `B`, et l'appelant peut " -"avoir besoin d'en choisir un, comme avec `let x : Vec<_> = foo.collect()` ou " -"avec le turbofish, `foo.collect ::>()`." -#: src/generics/impl-trait.md -msgid "" -"What is the type of `debuggable`? Try `let debuggable: () = ..` to see what " -"the error message shows." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Base address of the PL031 RTC.\n" msgstr "" -#: src/generics/exercise.md -#, fuzzy -msgid "" -"In this short exercise, you will implement a generic `min` function that " -"determines the minimum of two values, using the [`Ord`](https://doc.rust-" -"lang.org/stable/std/cmp/trait.Ord.html) trait." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// The IRQ used by the PL031 RTC.\n" msgstr "" -"Vous pouvez implémenter le trait [`Iterator`](https://doc.rust-lang.org/std/" -"iter/trait.Iterator.html) sur vos propres types :" -#: src/generics/exercise.md -msgid "// TODO: implement the `min` function used in `main`.\n" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "\"main({:#x}, {:#x}, {:#x}, {:#x})\"" msgstr "" -#: src/generics/exercise.md src/generics/solution.md -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "'z'" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "" +"// SAFETY: `GICD_BASE_ADDRESS` and `GICR_BASE_ADDRESS` are the base\n" +" // addresses of a GICv3 distributor and redistributor respectively, and\n" +" // nothing else accesses those address ranges.\n" msgstr "" -#: src/generics/exercise.md src/generics/solution.md -msgid "'7'" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "" +"// SAFETY: `PL031_BASE_ADDRESS` is the base address of a PL031 device, and\n" +" // nothing else accesses that address range.\n" msgstr "" -#: src/generics/exercise.md src/generics/solution.md -msgid "'1'" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "\"RTC: {time}\"" msgstr "" -#: src/generics/exercise.md src/generics/solution.md -msgid "\"goodbye\"" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "// Wait for 3 seconds, without interrupts.\n" msgstr "" -#: src/generics/exercise.md src/generics/solution.md -msgid "\"bat\"" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "\"Waiting for {}\"" msgstr "" -#: src/generics/exercise.md src/generics/solution.md -msgid "\"armadillo\"" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "\"matched={}, interrupt_pending={}\"" msgstr "" -#: src/generics/exercise.md -#, fuzzy -msgid "" -"Show students the [`Ord`](https://doc.rust-lang.org/stable/std/cmp/trait.Ord." -"html) trait and [`Ordering`](https://doc.rust-lang.org/stable/std/cmp/enum." -"Ordering.html) enum." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "\"Finished waiting\"" msgstr "" -"[`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) et [`Write`]" -"(https://doc.rust-lang.org/std/io/trait.Write.html) utilisés pour IO," -#: src/std-types.md -msgid "" -"For each of the slides in this section, spend some time reviewing the " -"documentation pages, highlighting some of the more common methods." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "// Wait another 3 seconds for an interrupt.\n" msgstr "" -#: src/std-types/std.md +#: src/exercises/bare-metal/solutions-afternoon.md #, fuzzy -msgid "" -"Rust comes with a standard library which helps establish a set of common " -"types used by Rust libraries and programs. This way, two libraries can work " -"together smoothly because they both use the same `String` type." +msgid "_pl031.rs_:" +msgstr "`pl031.rs` :" + +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Data register\n" msgstr "" -"Rust est livré avec une bibliothèque standard qui permet d'établir un " -"ensemble de types communs utilisé par la bibliothèque et les programmes " -"Rust. De cette façon, deux bibliothèques peuvent travailler ensemble en " -"douceur car ils utilisent tous les deux le même type `String`." -#: src/std-types/std.md -#, fuzzy -msgid "" -"In fact, Rust contains several layers of the Standard Library: `core`, " -"`alloc` and `std`." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Match register\n" msgstr "" -"En fait, Rust contient plusieurs couches de la bibliothèque standard : " -"`core`, `alloc` et `std`." -#: src/std-types/std.md -#, fuzzy -msgid "" -"`core` includes the most basic types and functions that don't depend on " -"`libc`, allocator or even the presence of an operating system." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Load register\n" msgstr "" -"`core` inclut les types et fonctions les plus basiques qui ne dépendent pas " -"de `libc`, de l'allocateur ou même la présence d'un système d'exploitation." -#: src/std-types/std.md -#, fuzzy -msgid "" -"`alloc` includes types which require a global heap allocator, such as `Vec`, " -"`Box` and `Arc`." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Control register\n" msgstr "" -"`alloc` inclut les types qui nécessitent un allocateur de tas global, tels " -"que `Vec`, `Box` et `Arc`." -#: src/std-types/std.md -#, fuzzy -msgid "" -"Embedded Rust applications often only use `core`, and sometimes `alloc`." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Interrupt Mask Set or Clear register\n" msgstr "" -"Les applications Embedded Rust n'utilisent souvent que \"core\" et parfois " -"\"alloc\"." -#: src/std-types/docs.md -msgid "Rust comes with extensive documentation. For example:" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Raw Interrupt Status\n" msgstr "" -#: src/std-types/docs.md -#, fuzzy -msgid "" -"All of the details about [loops](https://doc.rust-lang.org/stable/reference/" -"expressions/loop-expr.html)." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Masked Interrupt Status\n" msgstr "" -"Voir la [Rust Reference](https://doc.rust-lang.org/reference/type-layout." -"html)." -#: src/std-types/docs.md -msgid "" -"Primitive types like [`u8`](https://doc.rust-lang.org/stable/std/primitive." -"u8.html)." +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Interrupt Clear Register\n" msgstr "" -#: src/std-types/docs.md +#: src/exercises/bare-metal/solutions-afternoon.md #, fuzzy +msgid "/// Driver for a PL031 real-time clock.\n" +msgstr "Nous allons écrire un pilote pour le dispositif d'horloge en temps réel PL031." + +#: src/exercises/bare-metal/solutions-afternoon.md msgid "" -"Standard library types like [`Option`](https://doc.rust-lang.org/stable/std/" -"option/enum.Option.html) or [`BinaryHeap`](https://doc.rust-lang.org/stable/" -"std/collections/struct.BinaryHeap.html)." +"/// Constructs a new instance of the RTC driver for a PL031 device with the\n" +" /// given set of registers.\n" msgstr "" -"[`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) et [`Write`]" -"(https://doc.rust-lang.org/std/io/trait.Write.html) utilisés pour IO," -#: src/std-types/docs.md -msgid "In fact, you can document your own code:" +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Reads the current RTC value.\n" msgstr "" -#: src/std-types/docs.md +#: src/exercises/bare-metal/solutions-afternoon.md msgid "" -"/// Determine whether the first argument is divisible by the second " -"argument.\n" -"///\n" -"/// If the second argument is zero, the result is false.\n" +"/// Writes a match value. When the RTC value matches this then an interrupt\n" +" /// will be generated (if it is enabled).\n" msgstr "" -#: src/std-types/docs.md -#, fuzzy +#: src/exercises/bare-metal/solutions-afternoon.md msgid "" -"The contents are treated as Markdown. All published Rust library crates are " -"automatically documented at [`docs.rs`](https://docs.rs) using the [rustdoc]" -"(https://doc.rust-lang.org/rustdoc/what-is-rustdoc.html) tool. It is " -"idiomatic to document all public items in an API using this pattern." +"/// Returns whether the match register matches the RTC value, whether or not\n" +" /// the interrupt is enabled.\n" msgstr "" -"Le contenu est traité comme Markdown. Toutes les caisses de bibliothèque " -"Rust publiées sont automatiquement documenté sur [`docs.rs`](https://docs." -"rs) en utilisant le [rustdoc](https://doc.rust-lang.org/rustdoc/what-is-" -"rustdoc.html). C'est idiomatic pour documenter tous les éléments publics " -"dans une API utilisant ce modèle." -#: src/std-types/docs.md +#: src/exercises/bare-metal/solutions-afternoon.md msgid "" -"To document an item from inside the item (such as inside a module), use `//!" -"` or `/*! .. */`, called \"inner doc comments\":" +"/// Returns whether there is currently an interrupt pending.\n" +" ///\n" +" /// This should be true if and only if `matched` returns true and the\n" +" /// interrupt is masked.\n" msgstr "" -#: src/std-types/docs.md +#: src/exercises/bare-metal/solutions-afternoon.md msgid "" -"//! This module contains functionality relating to divisibility of " -"integers.\n" +"/// Sets or clears the interrupt mask.\n" +" ///\n" +" /// When the mask is true the interrupt is enabled; when it is false the\n" +" /// interrupt is disabled.\n" msgstr "" -#: src/std-types/docs.md +#: src/exercises/bare-metal/solutions-afternoon.md +msgid "/// Clears a pending interrupt, if any.\n" +msgstr "" + +#: src/concurrency/welcome.md #, fuzzy -msgid "" -"Show students the generated docs for the `rand` crate at ." +msgid "Welcome to Concurrency in Rust" +msgstr "Bienvenue à Comprehensive Rust(le guide complet de Rust) 🦀" + +#: src/concurrency/welcome.md +#, fuzzy +msgid "Rust has full support for concurrency using OS threads with mutexes and channels." msgstr "" -"Montrez aux élèves les documents générés pour la caisse \"rand\" sur [`docs." -"rs/rand`](https://docs.rs/rand)." +"Rust prend entièrement en charge la concurrence en utilisant des threads de système " +"d'exploitation avec des mutex et canaux." -#: src/std-types/option.md +#: src/concurrency/welcome.md #, fuzzy -msgid "Option" -msgstr "Exceptions" +msgid "" +"The Rust type system plays an important role in making many concurrency bugs compile time " +"errors. This idea is known as _fearless concurrency_ since you can rely on the compiler " +"to ensure correctness at runtime." +msgstr "" +"Le système de type Rust joue un rôle important dans la création de nombreux bugs de " +"concurrence bogues de temps de compilation. Ceci est souvent appelé _concurrence sans " +"peur_ puisque vous peut compter sur le compilateur pour assurer l'exactitude au moment de " +"l'exécution." -#: src/std-types/option.md +#: src/concurrency/welcome.md msgid "" -"We have already seen some use of `Option`. It stores either a value of " -"type `T` or nothing. For example, [`String::find`](https://doc.rust-lang.org/" -"stable/std/string/struct.String.html#method.find) returns an `Option`." +"Including 10 minute breaks, this session should take about 3 hours and 20 minutes. It " +"contains:" msgstr "" -#: src/std-types/option.md -msgid "\"Löwe 老虎 Léopard Gepardi\"" +#: src/concurrency/welcome.md +msgid "Rust lets us access OS concurrency toolkit: threads, sync. primitives, etc." msgstr "" -#: src/std-types/option.md -msgid "'é'" +#: src/concurrency/welcome.md +msgid "The type system gives us safety for concurrency without any special features." msgstr "" -#: src/std-types/option.md -msgid "\"find returned {position:?}\"" +#: src/concurrency/welcome.md +msgid "" +"The same tools that help with \"concurrent\" access in a single thread (e.g., a called " +"function that might mutate an argument or save references to it to read later) save us " +"from multi-threading issues." msgstr "" -#: src/std-types/option.md -msgid "'Z'" +#: src/concurrency/threads/plain.md +#, fuzzy +msgid "Rust threads work similarly to threads in other languages:" msgstr "" +"Les threads Rust fonctionnent de la même manière que les threads dans d'autres langages :" -#: src/std-types/option.md -msgid "\"Character not found\"" +#: src/concurrency/threads/plain.md +msgid "\"Count in thread: {i}!\"" msgstr "" -#: src/std-types/option.md -#, fuzzy -msgid "`Option` is widely used, not just in the standard library." +#: src/concurrency/threads/plain.md +msgid "\"Main thread: {i}\"" msgstr "" -"`Option` et `Result` sont largement utilisés, pas seulement dans la " -"bibliothèque standard." -#: src/std-types/option.md +#: src/concurrency/threads/plain.md msgid "" -"`unwrap` will return the value in an `Option`, or panic. `expect` is similar " -"but takes an error message." +"Spawning new threads does not automatically delay program termination at the end of " +"`main`." msgstr "" -#: src/std-types/option.md +#: src/concurrency/threads/plain.md +#, fuzzy +msgid "Thread panics are independent of each other." +msgstr "Les thread panics sont indépendants les uns des autres." + +#: src/concurrency/threads/plain.md +#, fuzzy msgid "" -"You can panic on None, but you can't \"accidentally\" forget to check for " -"None." +"Panics can carry a payload, which can be unpacked with [`Any::downcast_ref`](https://doc." +"rust-lang.org/std/any/trait.Any.html#method.downcast_ref)." msgstr "" +"Les paniques peuvent transporter une charge utile, qui peut être décompressée avec " +"`downcast_ref`." -#: src/std-types/option.md -msgid "" -"It's common to `unwrap`/`expect` all over the place when hacking something " -"together, but production code typically handles `None` in a nicer fashion." +#: src/concurrency/threads/plain.md +#, fuzzy +msgid "Run the example." +msgstr "Exécutez l'exemple avec :" + +#: src/concurrency/threads/plain.md +msgid "5ms timing is loose enough that main and spawned threads stay mostly in lockstep." msgstr "" -#: src/std-types/option.md -msgid "" -"The niche optimization means that `Option` often has the same size in " -"memory as `T`." +#: src/concurrency/threads/plain.md +msgid "Notice that the program ends before the spawned thread reaches 10!" msgstr "" -#: src/std-types/result.md -msgid "Result" +#: src/concurrency/threads/plain.md +msgid "This is because `main` ends the program and spawned threads do not make it persist." msgstr "" -#: src/std-types/result.md +#: src/concurrency/threads/plain.md +msgid "Compare to `pthreads`/C++ `std::thread`/`boost::thread` if desired." +msgstr "" + +#: src/concurrency/threads/plain.md +msgid "How do we wait around for the spawned thread to complete?" +msgstr "" + +#: src/concurrency/threads/plain.md +#, fuzzy msgid "" -"`Result` is similar to `Option`, but indicates the success or failure of an " -"operation, each with a different type. This is similar to the `Res` defined " -"in the expression exercise, but generic: `Result` where `T` is used in " -"the `Ok` variant and `E` appears in the `Err` variant." +"[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html) returns a " +"`JoinHandle`. Look at the docs." msgstr "" +"[`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) utilisé pour " +"construire une instance par défaut d'un type." -#: src/std-types/result.md -msgid "\"diary.txt\"" +#: src/concurrency/threads/plain.md +msgid "" +"`JoinHandle` has a [`.join()`](https://doc.rust-lang.org/std/thread/struct.JoinHandle." +"html#method.join) method that blocks." msgstr "" -#: src/std-types/result.md -msgid "\"Dear diary: {contents} ({bytes} bytes)\"" +#: src/concurrency/threads/plain.md +#, fuzzy +msgid "" +"Use `let handle = thread::spawn(...)` and later `handle.join()` to wait for the thread to " +"finish and have the program count all the way to 10." msgstr "" +"Utilisez `let handle = thread::spawn(...)` et plus tard `handle.join()` pour attendre le " +"fil pour finir." -#: src/std-types/result.md -msgid "\"Could not read file content\"" +#: src/concurrency/threads/plain.md +msgid "Now what if we want to return a value?" msgstr "" -#: src/std-types/result.md -msgid "\"The diary could not be opened: {err}\"" +#: src/concurrency/threads/plain.md +msgid "Look at docs again:" msgstr "" -#: src/std-types/result.md +#: src/concurrency/threads/plain.md #, fuzzy msgid "" -"As with `Option`, the successful value sits inside of `Result`, forcing the " -"developer to explicitly extract it. This encourages error checking. In the " -"case where an error should never happen, `unwrap()` or `expect()` can be " -"called, and this is a signal of the developer intent too." +"[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html)'s closure returns " +"`T`" msgstr "" -"Comme pour `Option`, la valeur réussie se trouve à l'intérieur de `Result`, " -"obligeant le développeur à l'extraire explicitement. Cela encourage la " -"vérification des erreurs. Dans le cas où une erreur ne devrait jamais se " -"produire, `unwrap()` ou `expect()` peut être appelé, et c'est aussi un " -"signal de l'intention du développeur." +"Cependant, vous pouvez utiliser un [fil de discussion de portée](https://doc.rust-lang." +"org/std/thread/fn.scope.html) pour cela :" -#: src/std-types/result.md -#, fuzzy +#: src/concurrency/threads/plain.md msgid "" -"`Result` documentation is a recommended read. Not during the course, but it " -"is worth mentioning. It contains a lot of convenience methods and functions " -"that help functional-style programming." +"`JoinHandle` [`.join()`](https://doc.rust-lang.org/std/thread/struct.JoinHandle." +"html#method.join) returns `thread::Result`" msgstr "" -"La documentation `Result` est une lecture recommandée. Pas pendant le cours, " -"mais cela vaut la peine d'être mentionné. Il contient de nombreuses méthodes " -"et fonctions pratiques qui facilitent la programmation de style fonctionnel." -#: src/std-types/result.md +#: src/concurrency/threads/plain.md #, fuzzy msgid "" -"`Result` is the standard type to implement error handling as we will see on " -"Day 4." +"Use the `Result` return value from `handle.join()` to get access to the returned value." msgstr "" -"`Result` est le type standard pour implémenter la gestion des erreurs, comme " -"nous le verrons le jour 3." +"Utilisez la valeur de retour `Result` de `handle.join()` pour accéder à la panique charge " +"utile. C'est le bon moment pour parler de \\[`Tous`\\]." -#: src/std-types/string.md -msgid "String" -msgstr "String" +#: src/concurrency/threads/plain.md +msgid "Ok, what about the other case?" +msgstr "" -#: src/std-types/string.md +#: src/concurrency/threads/plain.md +#, fuzzy +msgid "Trigger a panic in the thread. Note that this doesn't panic `main`." +msgstr "Déclenchez une panique dans le fil, notez que cela n'affecte pas `main`." + +#: src/concurrency/threads/plain.md #, fuzzy msgid "" -"[`String`](https://doc.rust-lang.org/std/string/struct.String.html) is the " -"standard heap-allocated growable UTF-8 string buffer:" +"Access the panic payload. This is a good time to talk about [`Any`](https://doc.rust-lang." +"org/std/any/index.html)." msgstr "" -"[`String`](https://doc.rust-lang.org/std/string/struct.String.html) est le " -"tampon de chaîne UTF-8 évolutif standard alloué par tas :" +"Utilisez la valeur de retour `Result` de `handle.join()` pour accéder à la panique charge " +"utile. C'est le bon moment pour parler de \\[`Tous`\\]." -#: src/std-types/string.md src/std-traits/read-and-write.md -#: src/memory-management/review.md src/testing/unit-tests.md -#: src/concurrency/scoped-threads.md -msgid "\"Hello\"" +#: src/concurrency/threads/plain.md +msgid "Now we can return values from threads! What about taking inputs?" msgstr "" -#: src/std-types/string.md -msgid "\"s1: len = {}, capacity = {}\"" +#: src/concurrency/threads/plain.md +msgid "Capture something by reference in the thread closure." msgstr "" -#: src/std-types/string.md -msgid "'!'" +#: src/concurrency/threads/plain.md +msgid "An error message indicates we must move it." msgstr "" -#: src/std-types/string.md -msgid "\"s2: len = {}, capacity = {}\"" +#: src/concurrency/threads/plain.md +msgid "Move it in, see we can compute and then return a derived value." msgstr "" -#: src/std-types/string.md -msgid "\"🇨🇭\"" +#: src/concurrency/threads/plain.md +msgid "If we want to borrow?" msgstr "" -#: src/std-types/string.md -msgid "\"s3: len = {}, number of chars = {}\"" +#: src/concurrency/threads/plain.md +msgid "" +"Main kills child threads when it returns, but another function would just return and " +"leave them running." msgstr "" -#: src/std-types/string.md +#: src/concurrency/threads/plain.md +msgid "That would be stack use-after-return, which violates memory safety!" +msgstr "" + +#: src/concurrency/threads/plain.md +msgid "How do we avoid this? See next slide." +msgstr "" + +#: src/concurrency/threads/scoped.md +#, fuzzy +msgid "Normal threads cannot borrow from their environment:" +msgstr "Les threads normaux ne peuvent pas emprunter à leur environnement :" + +#: src/concurrency/threads/scoped.md #, fuzzy msgid "" -"`String` implements [`Deref`](https://doc.rust-lang.org/std/" -"string/struct.String.html#deref-methods-str), which means that you can call " -"all `str` methods on a `String`." +"However, you can use a [scoped thread](https://doc.rust-lang.org/std/thread/fn.scope." +"html) for this:" msgstr "" -"`String` implémente [`Deref`](https://doc.rust-lang.org/std/" -"string/struct.String.html#deref-methods-str), ce qui signifie que vous " -"pouvez appeler tous Méthodes `str` sur une `String`." +"Cependant, vous pouvez utiliser un [fil de discussion de portée](https://doc.rust-lang." +"org/std/thread/fn.scope.html) pour cela :" -#: src/std-types/string.md +#: src/concurrency/threads/scoped.md +#, fuzzy msgid "" -"`String::new` returns a new empty string, use `String::with_capacity` when " -"you know how much data you want to push to the string." +"The reason for that is that when the `thread::scope` function completes, all the threads " +"are guaranteed to be joined, so they can return borrowed data." msgstr "" +"La raison en est que lorsque la fonction `thread::scope` se termine, tous les threads " +"sont garantis d'être joints, afin qu'ils puissent renvoyer des données empruntées." -#: src/std-types/string.md +#: src/concurrency/threads/scoped.md +#, fuzzy msgid "" -"`String::len` returns the size of the `String` in bytes (which can be " -"different from its length in characters)." +"Normal Rust borrowing rules apply: you can either borrow mutably by one thread, or " +"immutably by any number of threads." msgstr "" +"Les règles d'emprunt normales de Rust s'appliquent : vous pouvez soit emprunter de " +"manière mutable par un thread, soit de manière immuable par n'importe quel nombre de " +"threads." -#: src/std-types/string.md -msgid "" -"`String::chars` returns an iterator over the actual characters. Note that a " -"`char` can be different from what a human will consider a \"character\" due " -"to [grapheme clusters](https://docs.rs/unicode-segmentation/latest/" -"unicode_segmentation/struct.Graphemes.html)." +#: src/concurrency/channels.md src/concurrency/async-control-flow.md +msgid "This segment should take about 20 minutes. It contains:" msgstr "" -#: src/std-types/string.md +#: src/concurrency/channels/senders-receivers.md +#, fuzzy msgid "" -"When people refer to strings they could either be talking about `&str` or " -"`String`." +"Rust channels have two parts: a [`Sender`](https://doc.rust-lang.org/std/sync/mpsc/" +"struct.Sender.html) and a [`Receiver`](https://doc.rust-lang.org/std/sync/mpsc/struct." +"Receiver.html). The two parts are connected via the channel, but you only see the end-" +"points." msgstr "" +"Les canaux Rust ont deux parties : un `Sender` et un `Receiver`. Les deux parties " +"sont connectés via le canal, mais vous ne voyez que les extrémités." -#: src/std-types/string.md -msgid "" -"When a type implements `Deref`, the compiler will let you " -"transparently call methods from `T`." +#: src/concurrency/channels/senders-receivers.md +msgid "\"Received: {:?}\"" msgstr "" -#: src/std-types/string.md +#: src/concurrency/channels/senders-receivers.md +#, fuzzy msgid "" -"We haven't discussed the `Deref` trait yet, so at this point this mostly " -"explains the structure of the sidebar in the documentation." +"[`mpsc`](https://doc.rust-lang.org/std/sync/mpsc/index.html) stands for Multi-Producer, " +"Single-Consumer. `Sender` and `SyncSender` implement `Clone` (so you can make multiple " +"producers) but `Receiver` does not." msgstr "" +"`mpsc` signifie Multi-Producer, Single-Consumer. `Sender` et `SyncSender` implémentent " +"`Clone` (donc vous pouvez créer plusieurs producteurs) mais `Receiver` ne le fait pas." -#: src/std-types/string.md +#: src/concurrency/channels/senders-receivers.md +#, fuzzy msgid "" -"`String` implements `Deref` which transparently gives it " -"access to `str`'s methods." +"[`send()`](https://doc.rust-lang.org/std/sync/mpsc/struct.Sender.html#method.send) and " +"[`recv()`](https://doc.rust-lang.org/std/sync/mpsc/struct.Receiver.html#method.recv) " +"return `Result`. If they return `Err`, it means the counterpart `Sender` or `Receiver` is " +"dropped and the channel is closed." msgstr "" +"`send()` et `recv()` renvoient `Result`. S'ils renvoient `Err`, cela signifie que la " +"contrepartie `Sender` ou `Receiver` est supprimé et le canal est fermé." -#: src/std-types/string.md -msgid "Write and compare `let s3 = s1.deref();` and `let s3 = &*s1;`." +#: src/concurrency/channels/unbounded.md +#, fuzzy +msgid "" +"You get an unbounded and asynchronous channel with [`mpsc::channel()`](https://doc.rust-" +"lang.org/std/sync/mpsc/fn.channel.html):" +msgstr "Vous obtenez un canal illimité et asynchrone avec `mpsc::channel()` :" + +#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md +msgid "\"Message {i}\"" msgstr "" -#: src/std-types/string.md -msgid "" -"`String` is implemented as a wrapper around a vector of bytes, many of the " -"operations you see supported on vectors are also supported on `String`, but " -"with some extra guarantees." +#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md +msgid "\"{thread_id:?}: sent Message {i}\"" msgstr "" -#: src/std-types/string.md -msgid "Compare the different ways to index a `String`:" +#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md +msgid "\"{thread_id:?}: done\"" msgstr "" -#: src/std-types/string.md -msgid "" -"To a character by using `s3.chars().nth(i).unwrap()` where `i` is in-bound, " -"out-of-bounds." +#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md +msgid "\"Main: got {msg}\"" msgstr "" -#: src/std-types/string.md +#: src/concurrency/channels/unbounded.md msgid "" -"To a substring by using `s3[0..4]`, where that slice is on character " -"boundaries or not." +"An unbounded channel will allocate as much space as is necessary to store pending " +"messages. The `send()` method will not block the calling thread." msgstr "" -#: src/std-types/string.md +#: src/concurrency/channels/unbounded.md msgid "" -"Many types can be converted to a string with the [`to_string`](https://doc." -"rust-lang.org/std/string/trait.ToString.html#tymethod.to_string) method. " -"This trait is automatically implemented for all types that implement " -"`Display`, so anything that can be formatted can also be converted to a " -"string." +"A call to `send()` will abort with an error (that is why it returns `Result`) if the " +"channel is closed. A channel is closed when the receiver is dropped." msgstr "" -#: src/std-types/vec.md +#: src/concurrency/channels/bounded.md #, fuzzy msgid "" -"[`Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html) is the standard " -"resizable heap-allocated buffer:" -msgstr "" -"[`Vec`](https://doc.rust-lang.org/std/vec/struct.Vec.html) est le tampon " -"standard redimensionnable alloué au tas :" +"With bounded (synchronous) channels, [`send()`](https://doc.rust-lang.org/std/sync/mpsc/" +"struct.SyncSender.html#method.send) can block the current thread:" +msgstr "Les canaux bornés et synchrones font que \"send\" bloque le thread actuel :" -#: src/std-types/vec.md -msgid "\"v1: len = {}, capacity = {}\"" +#: src/concurrency/channels/bounded.md +msgid "" +"Calling `send()` will block the current thread until there is space in the channel for " +"the new message. The thread can be blocked indefinitely if there is nobody who reads from " +"the channel." msgstr "" -#: src/std-types/vec.md -msgid "\"v2: len = {}, capacity = {}\"" +#: src/concurrency/channels/bounded.md +msgid "" +"Like unbounded channels, a call to `send()` will abort with an error if the channel is " +"closed." msgstr "" -#: src/std-types/vec.md -msgid "// Canonical macro to initialize a vector with elements.\n" +#: src/concurrency/channels/bounded.md +msgid "" +"A bounded channel with a size of zero is called a \"rendezvous channel\". Every send will " +"block the current thread until another thread calls [`recv()`](https://doc.rust-lang.org/" +"std/sync/mpsc/struct.Receiver.html#method.recv)." msgstr "" -#: src/std-types/vec.md -msgid "// Retain only the even elements.\n" -msgstr "" +#: src/concurrency/send-sync.md +#, fuzzy +msgid "Send" +msgstr "`Envoyer`" -#: src/std-types/vec.md -msgid "\"{v3:?}\"" +#: src/concurrency/send-sync.md +#, fuzzy +msgid "Sync" +msgstr "`Synchroniser`" + +#: src/concurrency/send-sync/marker-traits.md +#, fuzzy +msgid "" +"How does Rust know to forbid shared access across threads? The answer is in two traits:" msgstr "" +"Comment Rust sait-il interdire l'accès partagé à travers le thread? La réponse est en " +"deux traits :" -#: src/std-types/vec.md -msgid "// Remove consecutive duplicates.\n" +#: src/concurrency/send-sync/marker-traits.md +#, fuzzy +msgid "" +"[`Send`](https://doc.rust-lang.org/std/marker/trait.Send.html): a type `T` is `Send` if " +"it is safe to move a `T` across a thread boundary." msgstr "" +"[`Send`](https://doc.rust-lang.org/std/marker/trait.Send.html) : un type `T` est `Send` " +"s'il est sûr de déplacer un `T` à travers un thread frontière." -#: src/std-types/vec.md +#: src/concurrency/send-sync/marker-traits.md #, fuzzy msgid "" -"`Vec` implements [`Deref`](https://doc.rust-lang.org/std/vec/" -"struct.Vec.html#deref-methods-%5BT%5D), which means that you can call slice " -"methods on a `Vec`." +"[`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync.html): a type `T` is `Sync` if " +"it is safe to move a `&T` across a thread boundary." msgstr "" -"`Vec` implémente [`Deref`](https://doc.rust-lang.org/std/vec/" -"struct.Vec.html#deref-methods-%5BT%5D), ce qui signifie que vous pouvez " -"appeler slice méthodes sur un `Vec`." +"[`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync.html) : un type `T` est `Sync` " +"s'il est sûr de déplacer un `&T` à travers un thread frontière." -#: src/std-types/vec.md +#: src/concurrency/send-sync/marker-traits.md +#, fuzzy msgid "" -"`Vec` is a type of collection, along with `String` and `HashMap`. The data " -"it contains is stored on the heap. This means the amount of data doesn't " -"need to be known at compile time. It can grow or shrink at runtime." +"`Send` and `Sync` are [unsafe traits](../../unsafe-rust/unsafe-traits.md). The compiler " +"will automatically derive them for your types as long as they only contain `Send` and " +"`Sync` types. You can also implement them manually when you know it is valid." msgstr "" +"`Send` et `Sync` sont des \\[caractéristiques non sécurisées\\] [3](../unsafe/unsafe-" +"traits.md). Le compilateur les dérivera automatiquement pour vos types tant qu'ils ne " +"contiennent que les types `Send` et `Sync`. Vous pouvez également les implémenter " +"manuellement lorsque vous sachez qu'il est valide." -#: src/std-types/vec.md +#: src/concurrency/send-sync/marker-traits.md +#, fuzzy msgid "" -"Notice how `Vec` is a generic type too, but you don't have to specify `T` " -"explicitly. As always with Rust type inference, the `T` was established " -"during the first `push` call." +"One can think of these traits as markers that the type has certain thread-safety " +"properties." msgstr "" +"On peut considérer ces traits comme des marqueurs indiquant que le type possède certaines " +"propriétés de sécurité des threads." -#: src/std-types/vec.md +#: src/concurrency/send-sync/marker-traits.md +#, fuzzy +msgid "They can be used in the generic constraints as normal traits." +msgstr "Ils peuvent être utilisés dans les contraintes génériques comme des traits normaux." + +#: src/concurrency/send-sync/send.md +#, fuzzy msgid "" -"`vec![...]` is a canonical macro to use instead of `Vec::new()` and it " -"supports adding initial elements to the vector." +"A type `T` is [`Send`](https://doc.rust-lang.org/std/marker/trait.Send.html) if it is " +"safe to move a `T` value to another thread." msgstr "" +"Un type `T` est [`Send`](https://doc.rust-lang.org/std/marker/trait.Send.html) s'il est " +"sûr de déplacer une valeur `T` vers un autre thread." -#: src/std-types/vec.md +#: src/concurrency/send-sync/send.md +#, fuzzy msgid "" -"To index the vector you use `[` `]`, but they will panic if out of bounds. " -"Alternatively, using `get` will return an `Option`. The `pop` function will " -"remove the last element." +"The effect of moving ownership to another thread is that _destructors_ will run in that " +"thread. So the question is when you can allocate a value in one thread and deallocate it " +"in another." msgstr "" +"L'effet du déplacement de la propriété vers un autre thread est que _destructors_ " +"s'exécutera dans ce fil. La question est donc de savoir quand vous pouvez allouer une " +"valeur dans un thread et le désallouer dans un autre." -#: src/std-types/vec.md +#: src/concurrency/send-sync/send.md msgid "" -"Slices are covered on day 3. For now, students only need to know that a " -"value of type `Vec` gives access to all of the documented slice methods, too." +"As an example, a connection to the SQLite library must only be accessed from a single " +"thread." msgstr "" -#: src/std-types/hashmap.md +#: src/concurrency/send-sync/sync.md #, fuzzy -msgid "Standard hash map with protection against HashDoS attacks:" +msgid "" +"A type `T` is [`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync.html) if it is " +"safe to access a `T` value from multiple threads at the same time." msgstr "" -"Carte de hachage standard avec protection contre les attaques HashDoS :" +"Un type `T` est [`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync.html) s'il est " +"sûr d'accéder à une valeur `T` à partir de plusieurs fils en même temps." -#: src/std-types/hashmap.md -msgid "\"Adventures of Huckleberry Finn\"" -msgstr "" +#: src/concurrency/send-sync/sync.md +#, fuzzy +msgid "More precisely, the definition is:" +msgstr "Plus précisément, la définition est :" -#: src/std-types/hashmap.md -msgid "\"Grimms' Fairy Tales\"" -msgstr "" +#: src/concurrency/send-sync/sync.md +#, fuzzy +msgid "`T` is `Sync` if and only if `&T` is `Send`" +msgstr "`T` est `Sync` si et seulement si `&T` est `Envoyer`" -#: src/std-types/hashmap.md -msgid "\"Pride and Prejudice\"" +#: src/concurrency/send-sync/sync.md +#, fuzzy +msgid "" +"This statement is essentially a shorthand way of saying that if a type is thread-safe for " +"shared use, it is also thread-safe to pass references of it across threads." msgstr "" +"Cette déclaration est essentiellement une manière abrégée de dire que si un type est " +"thread-safe pour une utilisation partagée, il est également thread-safe pour en passer " +"des références à travers les threads." -#: src/std-types/hashmap.md -msgid "\"Les Misérables\"" +#: src/concurrency/send-sync/sync.md +#, fuzzy +msgid "" +"This is because if a type is Sync it means that it can be shared across multiple threads " +"without the risk of data races or other synchronization issues, so it is safe to move it " +"to another thread. A reference to the type is also safe to move to another thread, " +"because the data it references can be accessed from any thread safely." msgstr "" +"En effet, si un type est Sync, cela signifie qu'il peut être partagé sur plusieurs " +"threads sans risque de courses de données ou d'autres problèmes de synchronisation, il " +"est donc sûr de le déplacer vers un autre thread. Une référence au type peut également " +"être déplacée en toute sécurité vers un autre thread, car les données auxquelles elle " +"fait référence sont accessibles à partir de n'importe quel thread en toute sécurité." -#: src/std-types/hashmap.md -msgid "\"We know about {} books, but not Les Misérables.\"" +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`Send + Sync`" +msgstr "`Envoyer + Synchroniser`" + +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "Most types you come across are `Send + Sync`:" +msgstr "La plupart des types que vous rencontrez sont `Send + Sync` :" + +#: src/concurrency/send-sync/examples.md +msgid "`i8`, `f32`, `bool`, `char`, `&str`, ..." msgstr "" -#: src/std-types/hashmap.md -msgid "\"Alice's Adventure in Wonderland\"" +#: src/concurrency/send-sync/examples.md +msgid "`(T1, T2)`, `[T; N]`, `&[T]`, `struct { x: T }`, ..." msgstr "" -#: src/std-types/hashmap.md -msgid "\"{book}: {count} pages\"" +#: src/concurrency/send-sync/examples.md +msgid "`String`, `Option`, `Vec`, `Box`, ..." msgstr "" -#: src/std-types/hashmap.md -msgid "\"{book} is unknown.\"" +#: src/concurrency/send-sync/examples.md +msgid "`Arc`: Explicitly thread-safe via atomic reference count." msgstr "" -#: src/std-types/hashmap.md -msgid "// Use the .entry() method to insert a value if nothing is found.\n" +#: src/concurrency/send-sync/examples.md +msgid "`Mutex`: Explicitly thread-safe via internal locking." msgstr "" -#: src/std-types/hashmap.md -msgid "\"{page_counts:#?}\"" +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`mpsc::Sender`: As of 1.72.0." +msgstr "`mpsc::Expéditeur`" + +#: src/concurrency/send-sync/examples.md +msgid "`AtomicBool`, `AtomicU8`, ...: Uses special atomic instructions." msgstr "" -#: src/std-types/hashmap.md +#: src/concurrency/send-sync/examples.md +#, fuzzy msgid "" -"`HashMap` is not defined in the prelude and needs to be brought into scope." +"The generic types are typically `Send + Sync` when the type parameters are `Send + Sync`." msgstr "" +"Les types génériques sont généralement \"Send + Sync\" lorsque les paramètres de type " +"sont `Envoyer + Synchroniser`." -#: src/std-types/hashmap.md +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`Send + !Sync`" +msgstr "`Envoyer + !Sync`" + +#: src/concurrency/send-sync/examples.md +#, fuzzy msgid "" -"Try the following lines of code. The first line will see if a book is in the " -"hashmap and if not return an alternative value. The second line will insert " -"the alternative value in the hashmap if the book is not found." +"These types can be moved to other threads, but they're not thread-safe. Typically because " +"of interior mutability:" msgstr "" +"Ces types peuvent être déplacés vers d'autres threads, mais ils ne sont pas thread-safe. " +"Typiquement à cause de la mutabilité intérieure :" -#: src/std-types/hashmap.md -msgid "\"Harry Potter and the Sorcerer's Stone\"" -msgstr "" +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`mpsc::Receiver`" +msgstr "`mpsc::Récepteur`" -#: src/std-types/hashmap.md -msgid "\"The Hunger Games\"" -msgstr "" +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`Cell`" +msgstr "`Cellule`" -#: src/std-types/hashmap.md -msgid "Unlike `vec!`, there is unfortunately no standard `hashmap!` macro." -msgstr "" +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`RefCell`" +msgstr "`RefCell`" -#: src/std-types/hashmap.md -msgid "" -"Although, since Rust 1.56, HashMap implements [`From<[(K, V); N]>`](https://" -"doc.rust-lang.org/std/collections/hash_map/struct.HashMap.html#impl-" -"From%3C%5B(K,+V);+N%5D%3E-for-HashMap%3CK,+V,+RandomState%3E), which allows " -"us to easily initialize a hash map from a literal array:" -msgstr "" +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`!Send + Sync`" +msgstr "` !Envoyer + Synchroniser`" -#: src/std-types/hashmap.md +#: src/concurrency/send-sync/examples.md +#, fuzzy msgid "" -"Alternatively HashMap can be built from any `Iterator` which yields key-" -"value tuples." +"These types are safe to access (via shared references) from multiple threads, but they " +"cannot be moved to another thread:" msgstr "" +"Ces types sont thread-safe, mais ils ne peuvent pas être déplacés vers un autre thread :" -#: src/std-types/hashmap.md +#: src/concurrency/send-sync/examples.md msgid "" -"We are showing `HashMap`, and avoid using `&str` as key to make " -"examples easier. Using references in collections can, of course, be done, " -"but it can lead into complications with the borrow checker." +"`MutexGuard`: Uses OS level primitives which must be deallocated on the thread which " +"created them. However, an already-locked mutex can have its guarded variable read by any " +"thread with which the guard is shared (unless `T` itself is `!Sync`)." msgstr "" -#: src/std-types/hashmap.md -msgid "" -"Try removing `to_string()` from the example above and see if it still " -"compiles. Where do you think we might run into issues?" +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "`!Send + !Sync`" +msgstr "`!Envoyer + !Synchroniser`" + +#: src/concurrency/send-sync/examples.md +#, fuzzy +msgid "These types are not thread-safe and cannot be moved to other threads:" msgstr "" +"Ces types ne sont pas thread-safe et ne peuvent pas être déplacés vers d'autres threads :" -#: src/std-types/hashmap.md +#: src/concurrency/send-sync/examples.md +#, fuzzy msgid "" -"This type has several \"method-specific\" return types, such as `std::" -"collections::hash_map::Keys`. These types often appear in searches of the " -"Rust docs. Show students the docs for this type, and the helpful link back " -"to the `keys` method." +"`Rc`: each `Rc` has a reference to an `RcBox`, which contains a non-atomic " +"reference count." msgstr "" +"`Rc` : chaque `Rc` a une référence à un `RcBox`, qui contient un comptage de " +"référence non atomique." -#: src/std-types/exercise.md +#: src/concurrency/send-sync/examples.md +#, fuzzy msgid "" -"In this exercise you will take a very simple data structure and make it " -"generic. It uses a [`std::collections::HashMap`](https://doc.rust-lang.org/" -"stable/std/collections/struct.HashMap.html) to keep track of which values " -"have been seen and how many times each one has appeared." +"`*const T`, `*mut T`: Rust assumes raw pointers may have special concurrency " +"considerations." msgstr "" +"`*const T`, `*mut T` : Rust suppose que les pointeurs bruts peuvent avoir des " +"considérations de concurrence." -#: src/std-types/exercise.md -msgid "" -"The initial version of `Counter` is hard coded to only work for `u32` " -"values. Make the struct and its methods generic over the type of value being " -"tracked, that way `Counter` can track any type of value." -msgstr "" +#: src/concurrency/shared-state.md +#, fuzzy +msgid "Arc" +msgstr "`Arc`" -#: src/std-types/exercise.md +#: src/concurrency/shared-state/arc.md +#, fuzzy msgid "" -"If you finish early, try using the [`entry`](https://doc.rust-lang.org/" -"stable/std/collections/struct.HashMap.html#method.entry) method to halve the " -"number of hash lookups required to implement the `count` method." +"[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html) allows shared, read-only " +"ownership via `Arc::clone`:" msgstr "" +"[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html) permet un accès partagé en " +"lecture seule via sa méthode `clone` :" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "" -"/// Counter counts the number of times each value of type T has been seen.\n" +#: src/concurrency/shared-state/arc.md +msgid "/// A struct that prints which thread drops it.\n" msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "/// Create a new Counter.\n" +#: src/concurrency/shared-state/arc.md +msgid "\"Dropped by {:?}\"" msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "/// Count an occurrence of the given value.\n" +#: src/concurrency/shared-state/arc.md +msgid "// Sleep for 0-500ms.\n" msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "/// Return the number of times the given value has been seen.\n" +#: src/concurrency/shared-state/arc.md +msgid "\"{thread_id:?}: {v:?}\"" msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "\"saw {} values equal to {}\"" +#: src/concurrency/shared-state/arc.md +msgid "// Now only the spawned threads will hold clones of `v`.\n" msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "\"apple\"" +#: src/concurrency/shared-state/arc.md +msgid "// When the last spawned thread finishes, it will drop `v`'s contents.\n" msgstr "" -#: src/std-types/exercise.md src/std-types/solution.md -msgid "\"orange\"" +#: src/concurrency/shared-state/arc.md +#, fuzzy +msgid "" +"`Arc` stands for \"Atomic Reference Counted\", a thread safe version of `Rc` that uses " +"atomic operations." msgstr "" +"`Arc` signifie \"Atomic Reference Counted\", une version thread-safe de `Rc` qui utilise " +"opérations." -#: src/std-types/exercise.md src/std-types/solution.md -msgid "\"got {} apples\"" +#: src/concurrency/shared-state/arc.md +#, fuzzy +msgid "" +"`Arc` implements `Clone` whether or not `T` does. It implements `Send` and `Sync` if " +"and only if `T` implements them both." msgstr "" +"`Arc` implémente `Clone` que `T` le fasse ou non. Il implémente `Send` et `Sync` ssi " +"`T` les met en œuvre tous les deux." -#: src/std-traits.md +#: src/concurrency/shared-state/arc.md +#, fuzzy msgid "" -"As with the standard-library types, spend time reviewing the documentation " -"for each trait." +"`Arc::clone()` has the cost of atomic operations that get executed, but after that the " +"use of the `T` is free." msgstr "" +"`Arc::clone()` a le coût des opérations atomiques qui sont exécutées, mais après cela, " +"l'utilisation du 'T' est libre." -#: src/std-traits.md -msgid "This section is long. Take a break midway through." +#: src/concurrency/shared-state/arc.md +#, fuzzy +msgid "Beware of reference cycles, `Arc` does not use a garbage collector to detect them." msgstr "" +"Méfiez-vous des cycles de référence, `Arc` n'utilise pas de ramasse-miettes pour les " +"détecter." -#: src/std-traits/comparisons.md +#: src/concurrency/shared-state/arc.md +#, fuzzy +msgid "`std::sync::Weak` can help." +msgstr "`std::sync::Weak` peut aider." + +#: src/concurrency/shared-state/mutex.md +#, fuzzy msgid "" -"These traits support comparisons between values. All traits can be derived " -"for types containing fields that implement these traits." +"[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) ensures mutual " +"exclusion _and_ allows mutable access to `T` behind a read-only interface (another form " +"of [interior mutability](../../borrowing/interior-mutability.md)):" msgstr "" +"[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) garantit l'exclusion " +"mutuelle _et_ permet un accès mutable à `T` derrière une interface en lecture seule :" -#: src/std-traits/comparisons.md -msgid "`PartialEq` and `Eq`" +#: src/concurrency/shared-state/mutex.md +msgid "\"v: {:?}\"" msgstr "" -#: src/std-traits/comparisons.md +#: src/concurrency/shared-state/mutex.md +#, fuzzy msgid "" -"`PartialEq` is a partial equivalence relation, with required method `eq` and " -"provided method `ne`. The `==` and `!=` operators will call these methods." +"Notice how we have a [`impl Sync for Mutex`](https://doc.rust-lang.org/std/" +"sync/struct.Mutex.html#impl-Sync-for-Mutex%3CT%3E) blanket implementation." msgstr "" +"Remarquez comment nous avons une couverture [`impl Sync for Mutex`](https://" +"doc.rust-lang.org/std/sync/struct.Mutex.html#impl-Sync-for-Mutex%3CT%3E) mise en œuvre." -#: src/std-traits/comparisons.md +#: src/concurrency/shared-state/mutex.md +#, fuzzy msgid "" -"`Eq` is a full equivalence relation (reflexive, symmetric, and transitive) " -"and implies `PartialEq`. Functions that require full equivalence will use " -"`Eq` as a trait bound." +"`Mutex` in Rust looks like a collection with just one element --- the protected data." msgstr "" +"`Mutex` dans Rust ressemble à une collection avec un seul élément - les données protégées." -#: src/std-traits/comparisons.md +#: src/concurrency/shared-state/mutex.md #, fuzzy -msgid "`PartialOrd` and `Ord`" -msgstr "`Lire` et `Ecrire`" - -#: src/std-traits/comparisons.md msgid "" -"`PartialOrd` defines a partial ordering, with a `partial_cmp` method. It is " -"used to implement the `<`, `<=`, `>=`, and `>` operators." -msgstr "" - -#: src/std-traits/comparisons.md -msgid "`Ord` is a total ordering, with `cmp` returning `Ordering`." +"It is not possible to forget to acquire the mutex before accessing the protected data." msgstr "" +"Il n'est pas possible d'oublier d'acquérir le mutex avant d'accéder aux données protégées." -#: src/std-traits/comparisons.md +#: src/concurrency/shared-state/mutex.md +#, fuzzy msgid "" -"`PartialEq` can be implemented between different types, but `Eq` cannot, " -"because it is reflexive:" +"You can get an `&mut T` from an `&Mutex` by taking the lock. The `MutexGuard` ensures " +"that the `&mut T` doesn't outlive the lock being held." msgstr "" +"Vous pouvez obtenir un `&mut T` à partir d'un `&Mutex` en prenant le verrou. Le " +"`MutexGuard` garantit que le `&mut T` ne survit pas au verrouillage en cours." -#: src/std-traits/comparisons.md +#: src/concurrency/shared-state/mutex.md +#, fuzzy +msgid "`Mutex` implements both `Send` and `Sync` if and only if `T` implements `Send`." +msgstr "`Mutex` implémente à la fois `Send` et `Sync` ssi `T` implémente `Send`." + +#: src/concurrency/shared-state/mutex.md +#, fuzzy +msgid "A read-write lock counterpart: `RwLock`." +msgstr "Un homologue de verrouillage en lecture-écriture - `RwLock`." + +#: src/concurrency/shared-state/mutex.md +#, fuzzy +msgid "Why does `lock()` return a `Result`?" +msgstr "Pourquoi `lock()` renvoie-t-il un `Result` ?" + +#: src/concurrency/shared-state/mutex.md +#, fuzzy msgid "" -"In practice, it's common to derive these traits, but uncommon to implement " -"them." +"If the thread that held the `Mutex` panicked, the `Mutex` becomes \"poisoned\" to signal " +"that the data it protected might be in an inconsistent state. Calling `lock()` on a " +"poisoned mutex fails with a [`PoisonError`](https://doc.rust-lang.org/std/sync/struct." +"PoisonError.html). You can call `into_inner()` on the error to recover the data " +"regardless." msgstr "" +"Si le thread qui contenait le `Mutex` a paniqué, le `Mutex` devient \"empoisonné\" pour " +"signaler que les données qu'il protège peuvent être dans un état incohérent. Appel de " +"`lock()` sur un mutex empoisonné échoue avec une [`PoisonError`](https://doc.rust-lang." +"org/std/sync/struct.PoisonError.html). Vous pouvez appeler `into_inner()` sur l'erreur " +"pour récupérer les données indépendamment de." -#: src/std-traits/operators.md +#: src/concurrency/shared-state/example.md #, fuzzy -msgid "" -"Operator overloading is implemented via traits in [`std::ops`](https://doc." -"rust-lang.org/std/ops/index.html):" +msgid "Let us see `Arc` and `Mutex` in action:" +msgstr "Voyons `Arc` et `Mutex` en action :" + +#: src/concurrency/shared-state/example.md +msgid "// use std::sync::{Arc, Mutex};\n" msgstr "" -"La surcharge d'opérateur est implémentée via des traits dans [`std::ops`]" -"(https://doc.rust-lang.org/std/ops/index.html) :" -#: src/std-traits/operators.md -msgid "\"{:?} + {:?} = {:?}\"" +#: src/concurrency/shared-state/example.md +msgid "\"v: {v:?}\"" msgstr "" -#: src/std-traits/operators.md src/memory-management/drop.md +#: src/concurrency/shared-state/example.md #, fuzzy -msgid "Discussion points:" -msgstr "Points de discussion:" +msgid "Possible solution:" +msgstr "Solution possible:" -#: src/std-traits/operators.md +#: src/concurrency/shared-state/example.md #, fuzzy -msgid "" -"You could implement `Add` for `&Point`. In which situations is that useful?" -msgstr "" -"Vous pouvez implémenter `Add` pour `&Point`. Dans quelles situations est-ce " -"utile ?" +msgid "Notable parts:" +msgstr "Parties notables :" -#: src/std-traits/operators.md +#: src/concurrency/shared-state/example.md #, fuzzy -msgid "" -"Answer: `Add:add` consumes `self`. If type `T` for which you are overloading " -"the operator is not `Copy`, you should consider overloading the operator for " -"`&T` as well. This avoids unnecessary cloning on the call site." +msgid "`v` is wrapped in both `Arc` and `Mutex`, because their concerns are orthogonal." msgstr "" -"Réponse : `Add:add` consomme `self`. Si tapez `T` pour lequel vous êtes la " -"surcharge de l'opérateur n'est pas `Copy`, vous devriez envisager de " -"surcharger l'opérateur pour `&T` également. Cela évite un clonage inutile " -"sur le site d'appel. \\* Pourquoi `Output` est-il un type associé ? Pourrait-" -"il en faire un paramètre de type?" +"`v` est enveloppé à la fois dans `Arc` et `Mutex`, car leurs préoccupations sont " +"orthogonales." -#: src/std-traits/operators.md +#: src/concurrency/shared-state/example.md #, fuzzy msgid "" -"Why is `Output` an associated type? Could it be made a type parameter of the " -"method?" -msgstr "" -"Réponse courte : les paramètres de type sont contrôlés par l'appelant, mais " -"les types associés (comme `Output`) sont contrôlés par l'implémenteur d'un " -"trait." - -#: src/std-traits/operators.md -msgid "" -"Short answer: Function type parameters are controlled by the caller, but " -"associated types (like `Output`) are controlled by the implementer of a " -"trait." +"Wrapping a `Mutex` in an `Arc` is a common pattern to share mutable state between threads." msgstr "" +"Envelopper un `Mutex` dans un `Arc` est un modèle courant pour partager un état mutable " +"entre les threads." -#: src/std-traits/operators.md +#: src/concurrency/shared-state/example.md +#, fuzzy msgid "" -"You could implement `Add` for two different types, e.g. `impl Add<(i32, " -"i32)> for Point` would add a tuple to a `Point`." +"`v: Arc<_>` needs to be cloned to make a new reference for each new spawned thread. Note " +"`move` was added to the lambda signature." msgstr "" +"`v: Arc<_>` doit être cloné en tant que `v2` avant de pouvoir être déplacé dans un autre " +"thread. Remarque \"move\" a été ajouté à la signature lambda." -#: src/std-traits/from-and-into.md +#: src/concurrency/shared-state/example.md #, fuzzy -msgid "" -"Types implement [`From`](https://doc.rust-lang.org/std/convert/trait.From." -"html) and [`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) to " -"facilitate type conversions:" +msgid "Blocks are introduced to narrow the scope of the `LockGuard` as much as possible." msgstr "" -"Les types implémentent [`From`](https://doc.rust-lang.org/std/convert/trait." -"From.html) et [`Into`](https://doc.rust-lang.org/std/convert/trait.Into." -"html) pour faciliter les conversions de type :" +"Des blocs sont introduits pour réduire autant que possible la portée du \"LockGuard\"." -#: src/std-traits/from-and-into.md -msgid "\"{s}, {addr}, {one}, {bigger}\"" +#: src/concurrency/sync-exercises.md src/concurrency/async-exercises.md +#: src/unsafe-deep-dive/introduction.md +msgid "This segment should take about 1 hour and 10 minutes. It contains:" msgstr "" -#: src/std-traits/from-and-into.md +#: src/concurrency/sync-exercises/dining-philosophers.md #, fuzzy -msgid "" -"[`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) is " -"automatically implemented when [`From`](https://doc.rust-lang.org/std/" -"convert/trait.From.html) is implemented:" -msgstr "" -"[`Into`](https://doc.rust-lang.org/std/convert/trait.Into.html) est " -"automatiquement implémenté lorsque [`From`](https://doc.rust-lang.org/std/" -"convert/trait.From.html) est implémenté :" +msgid "The dining philosophers problem is a classic problem in concurrency:" +msgstr "Le problème du dîner des philosophes est un problème classique en concurrence :" -#: src/std-traits/from-and-into.md +#: src/concurrency/sync-exercises/dining-philosophers.md #, fuzzy msgid "" -"That's why it is common to only implement `From`, as your type will get " -"`Into` implementation too." +"Five philosophers dine together at the same table. Each philosopher has their own place " +"at the table. There is a chopstick between each plate. The dish served is spaghetti which " +"requires two chopsticks to eat. Each philosopher can only alternately think and eat. " +"Moreover, a philosopher can only eat their spaghetti when they have both a left and right " +"chopstick. Thus two chopsticks will only be available when their two nearest neighbors " +"are thinking, not eating. After an individual philosopher finishes eating, they will put " +"down both chopsticks." msgstr "" -"C'est pourquoi il est courant de n'implémenter que `From`, car votre type " -"recevra également l'implémentation `Into`." +"Cinq philosophes dînent ensemble à la même table. Chaque philosophe a son propre place à " +"table. Il y a une fourchette entre chaque assiette. Le plat servi est une sorte de " +"spaghetti qui se mange avec deux fourchettes. Chaque philosophe peut seulement penser et " +"manger alternativement. De plus, un philosophe ne peut que manger leur des spaghettis " +"lorsqu'ils ont à la fois une fourchette gauche et droite. Ainsi deux fourches ne feront " +"que être disponible lorsque ses deux voisins les plus proches pensent, ne mangent pas. " +"Après un philosophe individuel finit de manger, ils poseront les deux fourchettes." -#: src/std-traits/from-and-into.md +#: src/concurrency/sync-exercises/dining-philosophers.md #, fuzzy msgid "" -"When declaring a function argument input type like \"anything that can be " -"converted into a `String`\", the rule is opposite, you should use `Into`. " -"Your function will accept types that implement `From` and those that _only_ " -"implement `Into`." +"You will need a local [Cargo installation](../../cargo/running-locally.md) for this " +"exercise. Copy the code below to a file called `src/main.rs`, fill out the blanks, and " +"test that `cargo run` does not deadlock:" msgstr "" -"Lors de la déclaration d'un type d'entrée d'argument de fonction comme " -"\"tout ce qui peut être converti en `String`\", la règle est opposée, vous " -"devez utiliser `Into`. Votre fonction acceptera les types qui implémentent " -"`From` et ceux qui implémentent _uniquement_ `Into`." +"Vous aurez besoin d'une [installation Cargo](../../cargo/running-locally.md) locale pour " +"cet exercice. Copiez le code ci-dessous dans un fichier appelé `src/main.rs`, remplissez " +"le vides, et testez que `cargo run` ne se bloque pas :" -#: src/std-traits/casting.md +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/dining-philosophers.md msgid "" -"Rust has no _implicit_ type conversions, but does support explicit casts " -"with `as`. These generally follow C semantics where those are defined." +"// left_chopstick: ...\n" +" // right_chopstick: ...\n" +" // thoughts: ...\n" msgstr "" -#: src/std-traits/casting.md -msgid "\"as u16: {}\"" +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "\"Eureka! {} has a new idea!\"" msgstr "" -#: src/std-traits/casting.md -msgid "\"as i16: {}\"" +#: src/concurrency/sync-exercises/dining-philosophers.md +msgid "// Pick up chopsticks...\n" msgstr "" -#: src/std-traits/casting.md -msgid "\"as u8: {}\"" +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "\"{} is eating...\"" msgstr "" -#: src/std-traits/casting.md -msgid "" -"The results of `as` are _always_ defined in Rust and consistent across " -"platforms. This might not match your intuition for changing sign or casting " -"to a smaller type -- check the docs, and comment for clarity." +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +#, fuzzy +msgid "\"Socrates\"" +msgstr "caisses HAL" + +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "\"Hypatia\"" msgstr "" -#: src/std-traits/casting.md -msgid "" -"Casting with `as` is a relatively sharp tool that is easy to use " -"incorrectly, and can be a source of subtle bugs as future maintenance work " -"changes the types that are used or the ranges of values in types. Casts are " -"best used only when the intent is to indicate unconditional truncation (e.g. " -"selecting the bottom 32 bits of a `u64` with `as u32`, regardless of what " -"was in the high bits)." +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"Plato\"" msgstr "" -#: src/std-traits/casting.md -msgid "" -"For infallible casts (e.g. `u32` to `u64`), prefer using `From` or `Into` " -"over `as` to confirm that the cast is in fact infallible. For fallible " -"casts, `TryFrom` and `TryInto` are available when you want to handle casts " -"that fit differently from those that don't." +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"Aristotle\"" msgstr "" -#: src/std-traits/casting.md -msgid "Consider taking a break after this slide." +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"Pythagoras\"" msgstr "" -#: src/std-traits/casting.md -msgid "" -"`as` is similar to a C++ static cast. Use of `as` in cases where data might " -"be lost is generally discouraged, or at least deserves an explanatory " -"comment." +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "// Create chopsticks\n" msgstr "" -#: src/std-traits/casting.md -msgid "This is common in casting integers to `usize` for use as an index." +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "// Create philosophers\n" msgstr "" -#: src/std-traits/read-and-write.md +#: src/concurrency/sync-exercises/dining-philosophers.md +msgid "// Make each of them think and eat 100 times\n" +msgstr "" + +#: src/concurrency/sync-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "// Output their thoughts\n" +msgstr "" + +#: src/concurrency/sync-exercises/dining-philosophers.md #, fuzzy +msgid "You can use the following `Cargo.toml`:" +msgstr "Vous pouvez utiliser le fichier `Cargo.toml` suivant :" + +#: src/concurrency/sync-exercises/dining-philosophers.md msgid "" -"Using [`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) and " -"[`BufRead`](https://doc.rust-lang.org/std/io/trait.BufRead.html), you can " -"abstract over `u8` sources:" +"```toml\n" +"[package]\n" +"name = \"dining-philosophers\"\n" +"version = \"0.1.0\"\n" +"edition = \"2024\"\n" +"```" msgstr "" -"En utilisant [`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) et " -"[`BufRead`](https://doc.rust-lang.org/std/io/trait.BufRead.html), vous " -"pouvez résumer les sources `u8` :" -#: src/std-traits/read-and-write.md -msgid "b\"foo\\nbar\\nbaz\\n\"" +#: src/concurrency/sync-exercises/dining-philosophers.md +msgid "Encourage students to focus first on implementing a solution that \"mostly\" works." msgstr "" -#: src/std-traits/read-and-write.md -msgid "\"lines in slice: {}\"" +#: src/concurrency/sync-exercises/dining-philosophers.md +msgid "" +"The deadlock in the simplest solution is a general concurrency problem and highlights " +"that Rust does not automatically prevent this sort of bug." msgstr "" -#: src/std-traits/read-and-write.md -msgid "\"lines in file: {}\"" +#: src/concurrency/sync-exercises/link-checker.md +#, fuzzy +msgid "" +"Let us use our new knowledge to create a multi-threaded link checker. It should start at " +"a webpage and check that links on the page are valid. It should recursively check other " +"pages on the same domain and keep doing this until all pages have been validated." msgstr "" +"Utilisons nos nouvelles connaissances pour créer un vérificateur de liens multi-thread. " +"Cela devrait commencez par une page Web et vérifiez que les liens sur la page sont " +"valides. Cela devrait vérifier récursivement d'autres pages sur le même domaine et " +"continuer à le faire jusqu'à ce que tous les pages ont été validées." -#: src/std-traits/read-and-write.md -#, fuzzy +#: src/concurrency/sync-exercises/link-checker.md msgid "" -"Similarly, [`Write`](https://doc.rust-lang.org/std/io/trait.Write.html) lets " -"you abstract over `u8` sinks:" +"For this, you will need an HTTP client such as [`reqwest`](https://docs.rs/reqwest/). You " +"will also need a way to find links, we can use [`scraper`](https://docs.rs/scraper/). " +"Finally, we'll need some way of handling errors, we will use [`thiserror`](https://docs." +"rs/thiserror/)." msgstr "" -"De même, [`Write`](https://doc.rust-lang.org/std/io/trait.Write.html) vous " -"permet d'abstraire les puits `u8` :" -#: src/std-traits/read-and-write.md -msgid "\"\\n\"" +#: src/concurrency/sync-exercises/link-checker.md +#, fuzzy +msgid "Create a new Cargo project and `reqwest` it as a dependency with:" msgstr "" +"Pour cela, vous aurez besoin d'un client HTTP tel que [`reqwest`](https://docs.rs/" +"reqwest/). Créer un nouveau Projet Cargo et `reqwest` comme dépendance avec :" -#: src/std-traits/read-and-write.md -msgid "\"Logged: {:?}\"" +#: src/concurrency/sync-exercises/link-checker.md +#, fuzzy +msgid "" +"If `cargo add` fails with `error: no such subcommand`, then please edit the `Cargo.toml` " +"file by hand. Add the dependencies listed below." msgstr "" +"Si `cargo add` échoue avec `error: no such subcommand`, veuillez modifier le Fichier " +"`Cargo.toml` à la main. Ajoutez les dépendances répertoriées ci-dessous." -#: src/std-traits/default.md +#: src/concurrency/sync-exercises/link-checker.md #, fuzzy -msgid "The `Default` Trait" -msgstr "Le trait \"par défaut\"" +msgid "The `cargo add` calls will update the `Cargo.toml` file to look like this:" +msgstr "" +"Les appels `cargo add` mettront à jour le fichier `Cargo.toml` pour qu'il ressemble à " +"ceci :" -#: src/std-traits/default.md +#: src/concurrency/sync-exercises/link-checker.md +msgid "" +"```toml\n" +"[package]\n" +"name = \"link-checker\"\n" +"version = \"0.1.0\"\n" +"edition = \"2024\"\n" +"publish = false\n" +"\n" +"[dependencies]\n" +"reqwest = { version = \"0.13.1\", features = [\"blocking\"] }\n" +"scraper = \"0.25.0\"\n" +"thiserror = \"2.0.18\"\n" +"```" +msgstr "" + +#: src/concurrency/sync-exercises/link-checker.md #, fuzzy msgid "" -"[`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) trait " -"produces a default value for a type." +"You can now download the start page. Try with a small site such as `https://www.google." +"org/`." msgstr "" -"[`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) trait " -"fournit une implémentation par défaut d'un trait." +"Vous pouvez maintenant télécharger la page de démarrage. Essayez avec un petit site comme " +"`https://www.google.org/`." -#: src/std-traits/default.md -msgid "\"John Smith\"" +#: src/concurrency/sync-exercises/link-checker.md +#, fuzzy +msgid "Your `src/main.rs` file should look something like this:" +msgstr "Votre fichier `src/main.rs` devrait ressembler à ceci :" + +#: src/concurrency/sync-exercises/link-checker.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"request error: {0}\"" msgstr "" -#: src/std-traits/default.md -msgid "\"{default_struct:#?}\"" +#: src/concurrency/sync-exercises/link-checker.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"bad http response: {0}\"" msgstr "" -#: src/std-traits/default.md -msgid "\"Y is set!\"" +#: src/concurrency/sync-exercises/link-checker.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"Checking {:#}\"" msgstr "" -#: src/std-traits/default.md -msgid "\"{almost_default_struct:#?}\"" +#: src/concurrency/sync-exercises/link-checker.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"href\"" msgstr "" -#: src/std-traits/default.md src/lifetimes/exercise.md -#: src/lifetimes/solution.md -msgid "\"{:#?}\"" +#: src/concurrency/sync-exercises/link-checker.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"On {base_url:#}: ignored unparsable {href:?}: {err}\"" msgstr "" -#: src/std-traits/default.md -#, fuzzy -msgid "" -"It can be implemented directly or it can be derived via `#[derive(Default)]`." +#: src/concurrency/sync-exercises/link-checker.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"https://www.google.org\"" msgstr "" -"Il peut être implémenté directement ou il peut être dérivé via " -"`#[derive(Default)]`." -#: src/std-traits/default.md -#, fuzzy -msgid "" -"A derived implementation will produce a value where all fields are set to " -"their default values." +#: src/concurrency/sync-exercises/link-checker.md +msgid "\"Links: {links:#?}\"" msgstr "" -"L'implémentation dérivée produira une instance où tous les champs sont " -"définis sur leurs valeurs par défaut." -#: src/std-traits/default.md -#, fuzzy -msgid "This means all types in the struct must implement `Default` too." +#: src/concurrency/sync-exercises/link-checker.md +msgid "\"Could not extract links: {err:#}\"" msgstr "" -"Cela signifie que tous les types de la structure doivent également " -"implémenter `Default`." -#: src/std-traits/default.md +#: src/concurrency/sync-exercises/link-checker.md #, fuzzy -msgid "" -"Standard Rust types often implement `Default` with reasonable values (e.g. " -"`0`, `\"\"`, etc)." -msgstr "" -"Les types Rust standard implémentent souvent `Default` avec des valeurs " -"raisonnables (par exemple `0`, `\"\"`, etc.)." +msgid "Run the code in `src/main.rs` with" +msgstr "Exécutez le code dans `src/main.rs` avec" -#: src/std-traits/default.md +#: src/concurrency/sync-exercises/link-checker.md #, fuzzy -msgid "The partial struct initialization works nicely with default." +msgid "" +"Use threads to check the links in parallel: send the URLs to be checked to a channel and " +"let a few threads check the URLs in parallel." msgstr "" -"La copie de structure partielle fonctionne bien avec la valeur par défaut." +"Utilisez des threads pour vérifier les liens en parallèle : envoyez les URL à vérifier à " +"un channel et laissez quelques threads vérifier les URL en parallèle." -#: src/std-traits/default.md +#: src/concurrency/sync-exercises/link-checker.md #, fuzzy msgid "" -"The Rust standard library is aware that types can implement `Default` and " -"provides convenience methods that use it." +"Extend this to recursively extract links from all pages on the `www.google.org` domain. " +"Put an upper limit of 100 pages or so so that you don't end up being blocked by the site." msgstr "" -"La bibliothèque standard Rust est consciente que les types peuvent " -"implémenter `Default` et fournit des méthodes pratiques qui l'utilisent." +"Étendez ceci pour extraire de manière récursive les liens de toutes les pages du domaine " +"\"www.google.org\". Fixez une limite supérieure de 100 pages environ afin que vous ne " +"finissez pas par être bloqué par le site." -#: src/std-traits/default.md +#: src/concurrency/sync-exercises/link-checker.md msgid "" -"The `..` syntax is called [struct update syntax](https://doc.rust-lang.org/" -"book/ch05-01-defining-structs.html#creating-instances-from-other-instances-" -"with-struct-update-syntax)." +"This is a complex exercise and intended to give students an opportunity to work on a " +"larger project than others. A success condition for this exercise is to get stuck on some " +"\"real\" issue and work through it with the support of other students or the instructor." msgstr "" -#: src/std-traits/closures.md -#, fuzzy +#: src/concurrency/sync-exercises/solutions.md +msgid "\"{} is trying to eat\"" +msgstr "" + +#: src/concurrency/sync-exercises/solutions.md msgid "" -"Closures or lambda expressions have types which cannot be named. However, " -"they implement special [`Fn`](https://doc.rust-lang.org/std/ops/trait.Fn." -"html), [`FnMut`](https://doc.rust-lang.org/std/ops/trait.FnMut.html), and " -"[`FnOnce`](https://doc.rust-lang.org/std/ops/trait.FnOnce.html) traits:" +"// To avoid a deadlock, we have to break the symmetry\n" +" // somewhere. This will swap the chopsticks without deinitializing\n" +" // either of them.\n" msgstr "" -"Les fermetures ou les expressions lambda ont des types qui ne peuvent pas " -"être nommés. Cependant, ils implémenter [`Fn`](https://doc.rust-lang.org/std/" -"ops/trait.Fn.html) spécial, [`FnMut`](https://doc.rust-lang.org/std/ops/" -"trait.FnMut.html), et [`FnOnce`](https://doc.rust-lang.org/std/ops/trait." -"FnOnce.html) :" -#: src/std-traits/closures.md +#: src/concurrency/sync-exercises/solutions.md +msgid "\"{thought}\"" +msgstr "" + +#: src/concurrency/sync-exercises/solutions.md #, fuzzy -msgid "\"Calling function on {input}\"" -msgstr "Appel de fonctions non sécurisées" +msgid "Link Checker" +msgstr "Vérificateur de liens à plusieurs threads" -#: src/std-traits/closures.md -msgid "\"add_3: {}\"" +#: src/concurrency/sync-exercises/solutions.md +msgid "/// Determine whether links within the given page should be extracted.\n" msgstr "" -#: src/std-traits/closures.md -msgid "\"accumulate: {}\"" +#: src/concurrency/sync-exercises/solutions.md +msgid "" +"/// Mark the given page as visited, returning false if it had already\n" +" /// been visited.\n" msgstr "" -#: src/std-traits/closures.md -msgid "\"multiply_sum: {}\"" +#: src/concurrency/sync-exercises/solutions.md +msgid "// To multiplex the non-cloneable Receiver, wrap it in Arc>.\n" msgstr "" -#: src/std-traits/closures.md -#, fuzzy -msgid "" -"An `Fn` (e.g. `add_3`) neither consumes nor mutates captured values, or " -"perhaps captures nothing at all. It can be called multiple times " -"concurrently." +#: src/concurrency/sync-exercises/solutions.md +msgid "// The sender got dropped. No more commands coming in.\n" msgstr "" -"Un `Fn` ne consomme ni ne modifie les valeurs capturées, ou peut-être ne " -"capture rien du tout, il peut donc être appelé plusieurs fois simultanément." -#: src/std-traits/closures.md -#, fuzzy -msgid "" -"An `FnMut` (e.g. `accumulate`) might mutate captured values. You can call it " -"multiple times, but not concurrently." +#: src/concurrency/sync-exercises/solutions.md +msgid "\"Got crawling error: {:#}\"" +msgstr "" + +#: src/concurrency/sync-exercises/solutions.md +msgid "\"Bad URLs: {:#?}\"" msgstr "" -"Un `FnMut` peut faire muter les valeurs capturées, vous pouvez donc " -"l'appeler plusieurs fois mais pas simultanément." -#: src/std-traits/closures.md -#, fuzzy +#: src/concurrency/welcome-async.md msgid "" -"If you have an `FnOnce` (e.g. `multiply_sum`), you may only call it once. It " -"might consume captured values." +"\"Async\" is a concurrency model where multiple tasks are executed concurrently by " +"executing each task until it would block, then switching to another task that is ready to " +"make progress. The model allows running a larger number of tasks on a limited number of " +"threads. This is because the per-task overhead is typically very low and operating " +"systems provide primitives for efficiently identifying I/O that is able to proceed." msgstr "" -"Si vous avez un \"FnOnce\", vous ne pouvez l'appeler qu'une seule fois. Cela " -"peut consommer des valeurs capturées." -#: src/std-traits/closures.md -#, fuzzy +#: src/concurrency/welcome-async.md msgid "" -"`FnMut` is a subtype of `FnOnce`. `Fn` is a subtype of `FnMut` and `FnOnce`. " -"I.e. you can use an `FnMut` wherever an `FnOnce` is called for, and you can " -"use an `Fn` wherever an `FnMut` or `FnOnce` is called for." +"Rust's asynchronous operation is based on \"futures\", which represent work that may be " +"completed in the future. Futures are \"polled\" until they signal that they are complete." msgstr "" -"`FnMut` est un sous-type de `FnOnce`. `Fn` est un sous-type de `FnMut` et " -"`FnOnce`. C'est à dire. vous pouvez utiliser un `FnMut` partout où un " -"`FnOnce` est appelé, et vous pouvez utiliser un `Fn` partout où un `FnMut` " -"ou `FnOnce` est réclamé." -#: src/std-traits/closures.md +#: src/concurrency/welcome-async.md msgid "" -"When you define a function that takes a closure, you should take `FnOnce` if " -"you can (i.e. you call it once), or `FnMut` else, and last `Fn`. This allows " -"the most flexibility for the caller." +"Futures are polled by an async runtime, and several different runtimes are available." msgstr "" -#: src/std-traits/closures.md +#: src/concurrency/welcome-async.md msgid "" -"In contrast, when you have a closure, the most flexible you can have is `Fn` " -"(it can be passed everywhere), then `FnMut`, and lastly `FnOnce`." +"Python has a similar model in its `asyncio`. However, its `Future` type is callback-" +"based, and not polled. Async Python programs require a \"loop\", similar to a runtime in " +"Rust." msgstr "" -#: src/std-traits/closures.md +#: src/concurrency/welcome-async.md msgid "" -"The compiler also infers `Copy` (e.g. for `add_3`) and `Clone` (e.g. " -"`multiply_sum`), depending on what the closure captures." +"JavaScript's `Promise` is similar, but again callback-based. The language runtime " +"implements the event loop, so the majority of the details of Promise resolution are " +"hidden." msgstr "" -#: src/std-traits/closures.md +#: src/concurrency/welcome-async.md msgid "" -"By default, closures will capture by reference if they can. The `move` " -"keyword makes them capture by value." +"Including 10 minute breaks, this session should take about 3 hours and 30 minutes. It " +"contains:" msgstr "" -#: src/std-traits/closures.md src/smart-pointers/trait-objects.md -msgid "\"{} {}\"" -msgstr "" +#: src/concurrency/async.md +#, fuzzy +msgid "async/await" +msgstr "Traits asynchrones" -#: src/std-traits/closures.md -msgid "\"Hi\"" +#: src/concurrency/async/async-await.md +msgid "At a high level, async Rust code looks very much like \"normal\" sequential code:" msgstr "" -#: src/std-traits/closures.md -msgid "\"Greg\"" +#: src/concurrency/async/async-await.md +msgid "\"Count is: {i}!\"" msgstr "" -#: src/std-traits/exercise.md +#: src/concurrency/async/async-await.md msgid "" -"In this example, you will implement the classic [\"ROT13\" cipher](https://" -"en.wikipedia.org/wiki/ROT13). Copy this code to the playground, and " -"implement the missing bits. Only rotate ASCII alphabetic characters, to " -"ensure the result is still valid UTF-8." -msgstr "" - -#: src/std-traits/exercise.md -msgid "// Implement the `Read` trait for `RotDecoder`.\n" +"Note that this is a simplified example to show the syntax. There is no long running " +"operation or any real concurrency in it!" msgstr "" -#: src/std-traits/exercise.md src/std-traits/solution.md -msgid "\"Gb trg gb gur bgure fvqr!\"" +#: src/concurrency/async/async-await.md +msgid "" +"The \"async\" keyword is syntactic sugar. The compiler replaces the return type with a " +"future." msgstr "" -#: src/std-traits/exercise.md src/std-traits/solution.md -msgid "\"To get to the other side!\"" +#: src/concurrency/async/async-await.md +msgid "" +"You cannot make `main` async, without additional instructions to the compiler on how to " +"use the returned future." msgstr "" -#: src/std-traits/exercise.md +#: src/concurrency/async/async-await.md msgid "" -"What happens if you chain two `RotDecoder` instances together, each rotating " -"by 13 characters?" +"You need an executor to run async code. `block_on` blocks the current thread until the " +"provided future has run to completion." msgstr "" -#: src/std-traits/solution.md -msgid "'A'" +#: src/concurrency/async/async-await.md +msgid "" +"`.await` asynchronously waits for the completion of another operation. Unlike `block_on`, " +"`.await` doesn't block the current thread." msgstr "" -#: src/welcome-day-3.md -#, fuzzy -msgid "Welcome to Day 3" -msgstr "Bienvenue au jour 3" - -#: src/welcome-day-3.md -msgid "Today, we will cover:" +#: src/concurrency/async/async-await.md +msgid "" +"`.await` can only be used inside an `async` function (or block; these are introduced " +"later)." msgstr "" -#: src/welcome-day-3.md +#: src/concurrency/async/futures.md msgid "" -"Memory management, lifetimes, and the borrow checker: how Rust ensures " -"memory safety." +"[`Future`](https://doc.rust-lang.org/std/future/trait.Future.html) is a trait, " +"implemented by objects that represent an operation that may not be complete yet. A future " +"can be polled, and `poll` returns a [`Poll`](https://doc.rust-lang.org/std/task/enum.Poll." +"html)." msgstr "" -#: src/welcome-day-3.md -msgid "Smart pointers: standard library pointer types." +#: src/concurrency/async/futures.md +msgid "" +"An async function returns an `impl Future`. It's also possible (but uncommon) to " +"implement `Future` for your own types. For example, the `JoinHandle` returned from " +"`tokio::spawn` implements `Future` to allow joining to it." msgstr "" -#: src/memory-management/review.md -msgid "Programs allocate memory in two ways:" +#: src/concurrency/async/futures.md +msgid "" +"The `.await` keyword, applied to a Future, causes the current async function to pause " +"until that Future is ready, and then evaluates to its output." msgstr "" -#: src/memory-management/review.md -#, fuzzy -msgid "Stack: Continuous area of memory for local variables." -msgstr "Pile : Zone continue de mémoire pour les variables locales." - -#: src/memory-management/review.md -#, fuzzy -msgid "Values have fixed sizes known at compile time." -msgstr "Les valeurs ont des tailles fixes connues au moment de la compilation." - -#: src/memory-management/review.md -#, fuzzy -msgid "Extremely fast: just move a stack pointer." -msgstr "Extrêmement rapide : il suffit de déplacer un pointeur de pile." - -#: src/memory-management/review.md -#, fuzzy -msgid "Easy to manage: follows function calls." -msgstr "Facile à gérer : suit les appels de fonction." - -#: src/memory-management/review.md -#, fuzzy -msgid "Great memory locality." -msgstr "Grande localité de mémoire." - -#: src/memory-management/review.md -#, fuzzy -msgid "Heap: Storage of values outside of function calls." -msgstr "Heap : Stockage de valeurs en dehors des appels de fonction." - -#: src/memory-management/review.md -#, fuzzy -msgid "Values have dynamic sizes determined at runtime." +#: src/concurrency/async/futures.md +msgid "" +"The `Future` and `Poll` types are implemented exactly as shown; click the links to show " +"the implementations in the docs." msgstr "" -"Les valeurs ont des tailles dynamiques déterminées au moment de l'exécution." -#: src/memory-management/review.md -#, fuzzy -msgid "Slightly slower than the stack: some book-keeping needed." +#: src/concurrency/async/futures.md +msgid "" +"`Context` allows a Future to schedule itself to be polled again when an event such as a " +"timeout occurs." msgstr "" -"Légèrement plus lent que la pile : une certaine comptabilité est nécessaire." -#: src/memory-management/review.md -#, fuzzy -msgid "No guarantee of memory locality." -msgstr "Aucune garantie de localisation de la mémoire." - -#: src/memory-management/review.md -#, fuzzy +#: src/concurrency/async/futures.md msgid "" -"Creating a `String` puts fixed-sized metadata on the stack and dynamically " -"sized data, the actual string, on the heap:" +"`Pin` ensures that the Future isn't moved in memory, so that pointers into that future " +"remain valid. This is required to allow references to remain valid after an `.await`. We " +"will address `Pin` in the \"Pitfalls\" segment." msgstr "" -"La création d'une \"chaîne\" place des données de taille fixe sur la pile et " -"dimensionnées dynamiquement données sur le tas :" -#: src/memory-management/review.md +#: src/concurrency/async/state-machine.md msgid "" -"Mention that a `String` is backed by a `Vec`, so it has a capacity and " -"length and can grow if mutable via reallocation on the heap." +"Rust transforms an async function or block to a hidden type that implements `Future`, " +"using a state machine to track the function's progress. The details of this transform are " +"complex, but it is beneficial to have a schematic understanding of what is happening. The " +"following function" msgstr "" -#: src/memory-management/review.md -msgid "" -"If students ask about it, you can mention that the underlying memory is heap " -"allocated using the [System Allocator](https://doc.rust-lang.org/std/alloc/" -"struct.System.html) and custom allocators can be implemented using the " -"[Allocator API](https://doc.rust-lang.org/std/alloc/index.html)" +#: src/concurrency/async/state-machine.md +msgid "/// Sum two D10 rolls plus a modifier.\n" msgstr "" -#: src/memory-management/review.md -msgid "" -"We can inspect the memory layout with `unsafe` Rust. However, you should " -"point out that this is rightfully unsafe!" +#: src/concurrency/async/state-machine.md +msgid "is transformed to something like" msgstr "" -#: src/memory-management/review.md src/testing/unit-tests.md -msgid "' '" +#: src/concurrency/async/state-machine.md +msgid "// Function has not begun yet.\n" msgstr "" -#: src/memory-management/review.md -msgid "\"world\"" +#: src/concurrency/async/state-machine.md +msgid "// Waiting for first `.await` to complete.\n" msgstr "" -#: src/memory-management/review.md -msgid "" -"// DON'T DO THIS AT HOME! For educational purposes only.\n" -" // String provides no guarantees about its layout, so this could lead " -"to\n" -" // undefined behavior.\n" +#: src/concurrency/async/state-machine.md +msgid "// Waiting for second `.await` to complete.\n" msgstr "" -#: src/memory-management/review.md -msgid "\"capacity = {capacity}, ptr = {ptr:#x}, len = {len}\"" +#: src/concurrency/async/state-machine.md +msgid "// Create future for first dice roll.\n" msgstr "" -#: src/memory-management/approaches.md -#, fuzzy -msgid "Traditionally, languages have fallen into two broad categories:" +#: src/concurrency/async/state-machine.md +msgid "// Poll sub-future for first dice roll.\n" msgstr "" -"Traditionnellement, les langues se répartissent en deux grandes catégories :" -#: src/memory-management/approaches.md -#, fuzzy -msgid "Full control via manual memory management: C, C++, Pascal, ..." +#: src/concurrency/async/state-machine.md +msgid "// Create future for second roll.\n" msgstr "" -"Contrôle total via la gestion manuelle de la mémoire : C, C++, Pascal, ..." -#: src/memory-management/approaches.md -msgid "Programmer decides when to allocate or free heap memory." +#: src/concurrency/async/state-machine.md +msgid "// Poll sub-future for second dice roll.\n" msgstr "" -#: src/memory-management/approaches.md +#: src/concurrency/async/state-machine.md msgid "" -"Programmer must determine whether a pointer still points to valid memory." +"This example is illustrative, and isn't an accurate representation of the Rust compiler's " +"transformation. The important things to notice here are:" msgstr "" -#: src/memory-management/approaches.md -msgid "Studies show, programmers make mistakes." +#: src/concurrency/async/state-machine.md +msgid "Calling an async function does nothing but construct and return a future." msgstr "" -#: src/memory-management/approaches.md -#, fuzzy +#: src/concurrency/async/state-machine.md msgid "" -"Full safety via automatic memory management at runtime: Java, Python, Go, " -"Haskell, ..." +"All local variables are stored in the function's future, using an enum to identify where " +"execution is currently suspended." msgstr "" -"Sécurité totale via la gestion automatique de la mémoire à l'exécution : " -"Java, Python, Go, Haskell, ..." -#: src/memory-management/approaches.md +#: src/concurrency/async/state-machine.md msgid "" -"A runtime system ensures that memory is not freed until it can no longer be " -"referenced." +"An `.await` in the async function is translated into an a new state containing all live " +"variables and the awaited future. The `loop` then handles that updated state, polling the " +"future until it returns `Poll::Ready`." msgstr "" -#: src/memory-management/approaches.md +#: src/concurrency/async/state-machine.md msgid "" -"Typically implemented with reference counting, garbage collection, or RAII." +"Execution continues eagerly until a `Poll::Pending` occurs. In this simple example, every " +"future is ready immediately." msgstr "" -#: src/memory-management/approaches.md -#, fuzzy -msgid "Rust offers a new mix:" -msgstr "Rust propose un nouveau mix :" - -#: src/memory-management/approaches.md -#, fuzzy +#: src/concurrency/async/state-machine.md msgid "" -"Full control _and_ safety via compile time enforcement of correct memory " -"management." +"`main` contains a naïve executor, which just busy-loops until the future is ready. We " +"will discuss real executors shortly." msgstr "" -"Contrôle total * et * sécurité via l'application du temps de compilation de " -"la mémoire correcte gestion." - -#: src/memory-management/approaches.md -#, fuzzy -msgid "It does this with an explicit ownership concept." -msgstr "Il le fait avec un concept de propriété explicite." -#: src/memory-management/approaches.md +#: src/concurrency/async/state-machine.md msgid "" -"This slide is intended to help students coming from other languages to put " -"Rust in context." +"Imagine the `Future` data structure for a deeply nested stack of async functions. Each " +"function's `Future` contains the `Future` structures for the functions it calls. This can " +"result in unexpectedly large compiler-generated `Future` types." msgstr "" -#: src/memory-management/approaches.md +#: src/concurrency/async/state-machine.md msgid "" -"C must manage heap manually with `malloc` and `free`. Common errors include " -"forgetting to call `free`, calling it multiple times for the same pointer, " -"or dereferencing a pointer after the memory it points to has been freed." +"This also means that recursive async functions are challenging. Compare to the common " +"error of building recursive type, such as" msgstr "" -#: src/memory-management/approaches.md +#: src/concurrency/async/state-machine.md msgid "" -"C++ has tools like smart pointers (`unique_ptr`, `shared_ptr`) that take " -"advantage of language guarantees about calling destructors to ensure memory " -"is freed when a function returns. It is still quite easy to mis-use these " -"tools and create similar bugs to C." +"The fix for a recursive type is to add a layer of indrection, such as with `Box`. " +"Similarly, a recursive async function must box the recursive future:" msgstr "" -#: src/memory-management/approaches.md -msgid "" -"Java, Go, and Python rely on the garbage collector to identify memory that " -"is no longer reachable and discard it. This guarantees that any pointer can " -"be dereferenced, eliminating use-after-free and other classes of bugs. But, " -"GC has a runtime cost and is difficult to tune properly." +#: src/concurrency/async/state-machine.md +msgid "\"{n}\"" msgstr "" -#: src/memory-management/approaches.md +#: src/concurrency/async/runtimes.md msgid "" -"Rust's ownership and borrowing model can, in many cases, get the performance " -"of C, with alloc and free operations precisely where they are required -- " -"zero cost. It also provides tools similar to C++'s smart pointers. When " -"required, other options such as reference counting are available, and there " -"are even third-party crates available to support runtime garbage collection " -"(not covered in this class)." +"A _runtime_ provides support for performing operations asynchronously (a _reactor_) and " +"is responsible for executing futures (an _executor_). Rust does not have a \"built-in\" " +"runtime, but several options are available:" msgstr "" -#: src/memory-management/ownership.md -#, fuzzy +#: src/concurrency/async/runtimes.md msgid "" -"All variable bindings have a _scope_ where they are valid and it is an error " -"to use a variable outside its scope:" +"[Tokio](https://tokio.rs/): performant, with a well-developed ecosystem of functionality " +"like [Hyper](https://hyper.rs/) for HTTP or [Tonic](https://github.com/hyperium/tonic) " +"for gRPC." msgstr "" -"Toutes les liaisons de variables ont un _scope_ où elles sont valides et " -"c'est une erreur de utiliser une variable en dehors de sa portée :" -#: src/memory-management/ownership.md -#, fuzzy +#: src/concurrency/async/runtimes.md +msgid "[smol](https://docs.rs/smol/latest/smol/): simple and lightweight" +msgstr "" + +#: src/concurrency/async/runtimes.md msgid "" -"We say that the variable _owns_ the value. Every Rust value has precisely " -"one owner at all times." -msgstr "On dit que la variable _possède_ la valeur." +"Several larger applications have their own runtimes. For example, [Fuchsia](https://" +"fuchsia.googlesource.com/fuchsia/+/refs/heads/main/src/lib/fuchsia-async/src/lib.rs) " +"already has one." +msgstr "" -#: src/memory-management/ownership.md -#, fuzzy +#: src/concurrency/async/runtimes.md msgid "" -"At the end of the scope, the variable is _dropped_ and the data is freed. A " -"destructor can run here to free up resources." +"Note that of the listed runtimes, only Tokio is supported in the Rust playground. The " +"playground also does not permit any I/O, so most interesting async things can't run in " +"the playground." msgstr "" -"A la fin du scope, la variable est _dropped_ et les données sont libérées." -#: src/memory-management/ownership.md +#: src/concurrency/async/runtimes.md msgid "" -"Students familiar with garbage-collection implementations will know that a " -"garbage collector starts with a set of \"roots\" to find all reachable " -"memory. Rust's \"single owner\" principle is a similar idea." +"Futures are \"inert\" in that they do not do anything (not even start an I/O operation) " +"unless there is an executor polling them. This differs from JS Promises, for example, " +"which will run to completion even if they are never used." msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "An assignment will transfer _ownership_ between variables:" -msgstr "Une affectation transférera la propriété entre les variables :" +#: src/concurrency/async/runtimes/tokio.md +msgid "Tokio provides:" +msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "\"Hello!\"" -msgstr "Bonjour le monde!" +#: src/concurrency/async/runtimes/tokio.md +msgid "A multi-threaded runtime for executing asynchronous code." +msgstr "" -#: src/memory-management/move.md -msgid "// println!(\"s1: {s1}\");\n" +#: src/concurrency/async/runtimes/tokio.md +msgid "An asynchronous version of the standard library." msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "The assignment of `s1` to `s2` transfers ownership." -msgstr "L'affectation de `s1` à `s2` transfère la propriété." +#: src/concurrency/async/runtimes/tokio.md +msgid "A large ecosystem of libraries." +msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "When `s1` goes out of scope, nothing happens: it does not own anything." +#: src/concurrency/async/runtimes/tokio.md +msgid "\"Count in task: {i}!\"" msgstr "" -"Lorsque `s1` sort de la portée, rien ne se passe : il n'a pas de propriété." -#: src/memory-management/move.md -#, fuzzy -msgid "When `s2` goes out of scope, the string data is freed." +#: src/concurrency/async/runtimes/tokio.md +msgid "\"Main task: {i}\"" msgstr "" -"Lorsque `s2` sort de la portée, les données de la chaîne sont libérées." -#: src/memory-management/move.md -#, fuzzy -msgid "Before move to `s2`:" -msgstr "Avant de passer à `s2` :" +#: src/concurrency/async/runtimes/tokio.md +msgid "With the `tokio::main` macro we can now make `main` async." +msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "After move to `s2`:" -msgstr "Après le passage à `s2` :" +#: src/concurrency/async/runtimes/tokio.md +msgid "The `spawn` function creates a new, concurrent \"task\"." +msgstr "" -#: src/memory-management/move.md -msgid "" -"```bob\n" -" Stack Heap\n" -".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - -.\n" -": : : :\n" -": s1 \"(inaccessible)\" : : :\n" -": +-----------+-------+ : : +----+----+----+----+----+----+ :\n" -": | ptr | o---+---+--+--+-->| H | e | l | l | o | ! | :\n" -": | len | 6 | : | : +----+----+----+----+----+----+ :\n" -": | capacity | 6 | : | : :\n" -": +-----------+-------+ : | : :\n" -": : | `- - - - - - - - - - - - - - - - - - -'\n" -": s2 : |\n" -": +-----------+-------+ : |\n" -": | ptr | o---+---+--'\n" -": | len | 6 | :\n" -": | capacity | 6 | :\n" -": +-----------+-------+ :\n" -": :\n" -"`- - - - - - - - - - - - - -'\n" -"```" +#: src/concurrency/async/runtimes/tokio.md +msgid "Note: `spawn` takes a `Future`, you don't call `.await` on `count_to`." msgstr "" -#: src/memory-management/move.md -#, fuzzy +#: src/concurrency/async/runtimes/tokio.md +msgid "**Further exploration:**" +msgstr "" + +#: src/concurrency/async/runtimes/tokio.md msgid "" -"When you pass a value to a function, the value is assigned to the function " -"parameter. This transfers ownership:" +"Why does `count_to` not get to 10? This is an example of async cancellation. `tokio::" +"spawn` returns a handle which can be awaited to wait until it finishes." msgstr "" -"Lorsque vous transmettez une valeur à une fonction, la valeur est affectée à " -"la fonction paramètre. Cela transfère la propriété :" -#: src/memory-management/move.md -msgid "\"Hello {name}\"" +#: src/concurrency/async/runtimes/tokio.md +msgid "Try `count_to(10).await` instead of spawning." msgstr "" -#: src/memory-management/move.md src/android/interoperability/java.md -#, fuzzy -msgid "\"Alice\"" -msgstr "Tranches" +#: src/concurrency/async/runtimes/tokio.md +msgid "Try awaiting the task returned from `tokio::spawn`." +msgstr "" -#: src/memory-management/move.md -msgid "// say_hello(name);\n" +#: src/concurrency/async/tasks.md +msgid "Rust has a task system, which is a form of lightweight threading." msgstr "" -#: src/memory-management/move.md -#, fuzzy +#: src/concurrency/async/tasks.md 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!)." +"A task has a single top-level future which the executor polls to make progress. That " +"future may have one or more nested futures that its `poll` method polls, corresponding " +"loosely to a call stack. Concurrency within a task is possible by polling multiple child " +"futures, such as racing a timer and an I/O operation." msgstr "" -"Mentionnez que c'est l'opposé des valeurs par défaut en C++, qui copie par " -"valeur à moins que vous n'utilisiez `std::move` (et que le constructeur de " -"déplacement soit défini !)." -#: src/memory-management/move.md -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." +#: src/concurrency/async/tasks.md +msgid "\"127.0.0.1:0\"" msgstr "" -#: src/memory-management/move.md -msgid "" -"Simple values (such as integers) can be marked `Copy` (see later slides)." +#: src/concurrency/async/tasks.md +msgid "\"listening on port {}\"" msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "In Rust, clones are explicit (by using `clone`)." -msgstr "Dans Rust, les clones sont explicites (en utilisant `clone`)." +#: src/concurrency/async/tasks.md +msgid "\"connection from {addr:?}\"" +msgstr "" -#: src/memory-management/move.md -msgid "In the `say_hello` example:" +#: src/concurrency/async/tasks.md +msgid "b\"Who are you?\\n\"" msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "" -"With the first call to `say_hello`, `main` gives up ownership of `name`. " -"Afterwards, `name` cannot be used anymore within `main`." +#: src/concurrency/async/tasks.md +msgid "\"socket error\"" msgstr "" -"Avec le premier appel à `say_hello`, `main` abandonne la propriété de " -"`name`. Ensuite, `name` ne peut plus être utilisé dans `main`." -#: src/memory-management/move.md -#, fuzzy -msgid "" -"The heap memory allocated for `name` will be freed at the end of the " -"`say_hello` function." +#: src/concurrency/async/tasks.md +msgid "\"Thanks for dialing in, {name}!\\n\"" msgstr "" -"La mémoire de tas allouée pour `name` sera libérée à la fin de la fonction " -"`say_hello`." -#: src/memory-management/move.md -#, fuzzy -msgid "" -"`main` can retain ownership if it passes `name` as a reference (`&name`) and " -"if `say_hello` accepts a reference as a parameter." +#: src/concurrency/async/tasks.md src/concurrency/async-control-flow/join.md +msgid "Copy this example into your prepared `src/main.rs` and run it from there." msgstr "" -"`main` peut conserver la propriété s'il passe `name` comme référence " -"(`&name`) et si `say_hello` accepte une référence comme paramètre." -#: src/memory-management/move.md -#, fuzzy +#: src/concurrency/async/tasks.md msgid "" -"Alternatively, `main` can pass a clone of `name` in the first call (`name." -"clone()`)." +"Try connecting to it with a TCP connection tool like [nc](https://www.unix.com/man-page/" +"linux/1/nc/) or [telnet](https://www.unix.com/man-page/linux/1/telnet/)." msgstr "" -"Alternativement, `main` peut passer un clone de `name` dans le premier appel " -"(`name.clone()`)." -#: src/memory-management/move.md -#, fuzzy +#: src/concurrency/async/tasks.md msgid "" -"Rust makes it harder than C++ to inadvertently create copies by making move " -"semantics the default, and by forcing programmers to make clones explicit." +"Ask students to visualize what the state of the example server would be with a few " +"connected clients. What tasks exist? What are their Futures?" msgstr "" -"Rust rend plus difficile que C++ la création de copies par inadvertance en " -"faisant de la sémantique de déplacement la valeur par défaut et en forçant " -"les programmeurs à rendre les clones explicites." - -#: src/memory-management/move.md -#, fuzzy -msgid "Defensive Copies in Modern C++" -msgstr "Double libération de mémoire en C++ moderne" -#: src/memory-management/move.md -#, fuzzy -msgid "Modern C++ solves this differently:" -msgstr "Le C++ moderne résout cela différemment :" +#: src/concurrency/async/tasks.md +msgid "" +"This is the first time we've seen an `async` block. This is similar to a closure, but " +"does not take any arguments. Its return value is a Future, similar to an `async fn`." +msgstr "" -#: src/memory-management/move.md -msgid "\"Cpp\"" +#: src/concurrency/async/tasks.md +msgid "Refactor the async block into a function, and improve the error handling using `?`." msgstr "" -#: src/memory-management/move.md -msgid "// Duplicate the data in s1.\n" +#: src/concurrency/async-control-flow/channels.md +msgid "Several crates have support for asynchronous channels. For instance `tokio`:" msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "" -"The heap data from `s1` is duplicated and `s2` gets its own independent copy." +#: src/concurrency/async-control-flow/channels.md +msgid "\"Received {count} pings so far.\"" msgstr "" -"Les données de tas de `s1` sont dupliquées et `s2` obtient sa propre copie " -"indépendante." -#: src/memory-management/move.md -#, fuzzy -msgid "When `s1` and `s2` go out of scope, they each free their own memory." +#: src/concurrency/async-control-flow/channels.md +msgid "\"ping_handler complete\"" msgstr "" -"Lorsque `s1` et `s2` sortent de la portée, ils libèrent chacun leur propre " -"mémoire." -#: src/memory-management/move.md -#, fuzzy -msgid "Before copy-assignment:" -msgstr "Avant l'affectation de copie :" +#: src/concurrency/async-control-flow/channels.md +msgid "\"Failed to send ping.\"" +msgstr "" -#: src/memory-management/move.md -#, fuzzy -msgid "After copy-assignment:" -msgstr "Après l'affectation de copie :" +#: src/concurrency/async-control-flow/channels.md +msgid "\"Sent {} pings so far.\"" +msgstr "" -#: src/memory-management/move.md -msgid "" -"C++ has made a slightly different choice than Rust. Because `=` copies data, " -"the string data has to be cloned. Otherwise we would get a double-free when " -"either string goes out of scope." +#: src/concurrency/async-control-flow/channels.md +msgid "\"Something went wrong in ping handler task.\"" msgstr "" -#: src/memory-management/move.md -msgid "" -"C++ also has [`std::move`](https://en.cppreference.com/w/cpp/utility/move), " -"which is used to indicate when a value may be moved from. If the example had " -"been `s2 = std::move(s1)`, no heap allocation would take place. After the " -"move, `s1` would be in a valid but unspecified state. Unlike Rust, the " -"programmer is allowed to keep using `s1`." +#: src/concurrency/async-control-flow/channels.md +msgid "Change the channel size to `3` and see how it affects the execution." msgstr "" -#: src/memory-management/move.md +#: src/concurrency/async-control-flow/channels.md msgid "" -"Unlike Rust, `=` in C++ can run arbitrary code as determined by the type " -"which is being copied or moved." +"Overall, the interface is similar to the `sync` channels as seen in the [morning class]" +"(../channels.md)." msgstr "" -#: src/memory-management/clone.md -msgid "Clone" +#: src/concurrency/async-control-flow/channels.md +msgid "Try removing the `std::mem::drop` call. What happens? Why?" msgstr "" -#: src/memory-management/clone.md +#: src/concurrency/async-control-flow/channels.md msgid "" -"Sometimes you _want_ to make a copy of a value. The `Clone` trait " -"accomplishes this." +"The [Flume](https://docs.rs/flume/latest/flume/) crate has channels that implement both " +"`sync` and `async` `send` and `recv`. This can be convenient for complex applications " +"with both IO and heavy CPU processing tasks." msgstr "" -#: src/memory-management/clone.md +#: src/concurrency/async-control-flow/channels.md msgid "" -"The idea of `Clone` is to make it easy to spot where heap allocations are " -"occurring. Look for `.clone()` and a few others like `Vec::new` or `Box::" -"new`." +"What makes working with `async` channels preferable is the ability to combine them with " +"other `future`s to combine them and create complex control flow." msgstr "" -#: src/memory-management/clone.md +#: src/concurrency/async-control-flow/join.md msgid "" -"It's common to \"clone your way out\" of problems with the borrow checker, " -"and return later to try to optimize those clones away." +"A join operation waits until all of a set of futures are ready, and returns a collection " +"of their results. This is similar to `Promise.all` in JavaScript or `asyncio.gather` in " +"Python." msgstr "" -#: src/memory-management/copy-types.md -#, fuzzy -msgid "" -"While move semantics are the default, certain types are copied by default:" +#: src/concurrency/async-control-flow/join.md +msgid "\"https://google.com\"" msgstr "" -"Bien que la sémantique de déplacement soit la valeur par défaut, certains " -"types sont copiés par défaut :" -#: src/memory-management/copy-types.md -#, fuzzy -msgid "These types implement the `Copy` trait." -msgstr "Ces types implémentent le trait \"Copier\"." - -#: src/memory-management/copy-types.md -#, fuzzy -msgid "You can opt-in your own types to use copy semantics:" +#: src/concurrency/async-control-flow/join.md +msgid "\"https://httpbin.org/ip\"" msgstr "" -"Vous pouvez activer vos propres types pour utiliser la sémantique de copie :" -#: src/memory-management/copy-types.md -#, fuzzy -msgid "After the assignment, both `p1` and `p2` own their own data." -msgstr "Après l'affectation, `p1` et `p2` possèdent leurs propres données." +#: src/concurrency/async-control-flow/join.md +msgid "\"https://play.rust-lang.org/\"" +msgstr "" -#: src/memory-management/copy-types.md -#, fuzzy -msgid "We can also use `p1.clone()` to explicitly copy the data." +#: src/concurrency/async-control-flow/join.md +msgid "\"BAD_URL\"" msgstr "" -"Nous pouvons également utiliser `p1.clone()` pour copier explicitement les " -"données." -#: src/memory-management/copy-types.md -#, fuzzy -msgid "Copying and cloning are not the same thing:" -msgstr "La copie et le clonage ne sont pas la même chose :" +#: src/concurrency/async-control-flow/join.md +msgid "\"{page_sizes_dict:?}\"" +msgstr "" -#: src/memory-management/copy-types.md -#, fuzzy +#: src/concurrency/async-control-flow/join.md msgid "" -"Copying refers to bitwise copies of memory regions and does not work on " -"arbitrary objects." +"For multiple futures of disjoint types, you can use `std::future::join!` but you must " +"know how many futures you will have at compile time. This is currently in the `futures` " +"crate, soon to be stabilised in `std::future`." msgstr "" -"La copie fait référence aux copies au niveau du bit des régions de mémoire " -"et ne fonctionne pas sur des objets arbitraires." -#: src/memory-management/copy-types.md -#, fuzzy +#: src/concurrency/async-control-flow/join.md msgid "" -"Copying does not allow for custom logic (unlike copy constructors in C++)." +"The risk of `join` is that one of the futures may never resolve, this would cause your " +"program to stall." msgstr "" -"La copie ne permet pas de logique personnalisée (contrairement aux " -"constructeurs de copie en C++)." -#: src/memory-management/copy-types.md -#, fuzzy +#: src/concurrency/async-control-flow/join.md msgid "" -"Cloning is a more general operation and also allows for custom behavior by " -"implementing the `Clone` trait." +"You can also combine `join_all` with `join!` for instance to join all requests to an http " +"service as well as a database query. Try adding a `tokio::time::sleep` to the future, " +"using `futures::join!`. This is not a timeout (that requires `select!`, explained in the " +"next chapter), but demonstrates `join!`." msgstr "" -"Le clonage est une opération plus générale et permet également un " -"comportement personnalisé en implémentant le trait \"Cloner\"." -#: src/memory-management/copy-types.md -#, fuzzy -msgid "Copying does not work on types that implement the `Drop` trait." +#: src/concurrency/async-control-flow/select.md +msgid "" +"A select operation waits until any of a set of futures is ready, and responds to that " +"future's result. In JavaScript, this is similar to `Promise.race`. In Python, it compares " +"to `asyncio.wait(task_set, return_when=asyncio.FIRST_COMPLETED)`." msgstr "" -"La copie ne fonctionne pas sur les types qui implémentent le trait `Drop`." -#: src/memory-management/copy-types.md -#, fuzzy -msgid "In the above example, try the following:" -msgstr "Dans l'exemple ci-dessus, essayez ce qui suit :" - -#: src/memory-management/copy-types.md -#, fuzzy +#: src/concurrency/async-control-flow/select.md msgid "" -"Add a `String` field to `struct Point`. It will not compile because `String` " -"is not a `Copy` type." +"Similar to a match statement, the body of `select!` has a number of arms, each of the " +"form `pattern = future => statement`. When a `future` is ready, its return value is " +"destructured by the `pattern`. The `statement` is then run with the resulting variables. " +"The `statement` result becomes the result of the `select!` macro." msgstr "" -"Ajoutez un champ `String` à `struct Point`. Il ne sera pas compilé car " -"`String` n'est pas un type `Copy`." -#: src/memory-management/copy-types.md -#, fuzzy -msgid "" -"Remove `Copy` from the `derive` attribute. The compiler error is now in the " -"`println!` for `p1`." +#: src/concurrency/async-control-flow/select.md +msgid "\"got: {msg}\"" msgstr "" -"Supprimer `Copy` de l'attribut `derive`. L'erreur du compilateur est " -"maintenant dans `println!` pour `p1`." -#: src/memory-management/copy-types.md -#, fuzzy -msgid "Show that it works if you clone `p1` instead." -msgstr "Montrez que cela fonctionne si vous clonez `p1` à la place." +#: src/concurrency/async-control-flow/select.md +msgid "\"timeout\"" +msgstr "" -#: src/memory-management/drop.md -#, fuzzy -msgid "The `Drop` Trait" -msgstr "Le trait `Lâcher`" +#: src/concurrency/async-control-flow/select.md +msgid "\"Failed to send greeting\"" +msgstr "" -#: src/memory-management/drop.md -#, fuzzy +#: src/concurrency/async-control-flow/select.md +msgid "\"Listener failed\"" +msgstr "" + +#: src/concurrency/async-control-flow/select.md msgid "" -"Values which implement [`Drop`](https://doc.rust-lang.org/std/ops/trait.Drop." -"html) can specify code to run when they go out of scope:" +"The `listener` async block here is a common form: wait for some async event, or for a " +"timeout. Change the `sleep` to sleep longer to see it fail. Why does the `send` also fail " +"in this situation?" msgstr "" -"Les valeurs qui implémentent [`Drop`](https://doc.rust-lang.org/std/ops/" -"trait.Drop.html) peuvent spécifier le code à exécuter lorsqu'elles sortent " -"de la portée :" -#: src/memory-management/drop.md -msgid "\"Dropping {}\"" +#: src/concurrency/async-control-flow/select.md +msgid "" +"`select!` is also frequently used in a loop in \"actor\" architectures, where a task " +"reacts to events in a loop. That has some pitfalls, which will be discussed in the next " +"segment." msgstr "" -#: src/memory-management/drop.md src/exercises/concurrency/link-checker.md -#: src/exercises/concurrency/solutions-morning.md -msgid "\"a\"" +#: src/concurrency/async-pitfalls.md +msgid "" +"Async / await provides convenient and efficient abstraction for concurrent asynchronous " +"programming. However, the async/await model in Rust also comes with its share of pitfalls " +"and footguns. We illustrate some of them in this chapter." msgstr "" -#: src/memory-management/drop.md src/android/testing/googletest.md -msgid "\"b\"" +#: src/concurrency/async-pitfalls.md +msgid "Pin" msgstr "" -#: src/memory-management/drop.md -msgid "\"c\"" +#: src/concurrency/async-pitfalls/blocking-executor.md +msgid "Blocking the executor" msgstr "" -#: src/memory-management/drop.md -msgid "\"d\"" +#: src/concurrency/async-pitfalls/blocking-executor.md +msgid "" +"Most async runtimes only allow IO tasks to run concurrently. This means that CPU blocking " +"tasks will block the executor and prevent other tasks from being executed. An easy " +"workaround is to use async equivalent methods where possible." msgstr "" -#: src/memory-management/drop.md -msgid "\"Exiting block B\"" +#: src/concurrency/async-pitfalls/blocking-executor.md +msgid "\"future {id} slept for {duration_ms}ms, finished after {}ms\"" msgstr "" -#: src/memory-management/drop.md -msgid "\"Exiting block A\"" +#: src/concurrency/async-pitfalls/blocking-executor.md +msgid "\"current_thread\"" msgstr "" -#: src/memory-management/drop.md -msgid "\"Exiting main\"" +#: src/concurrency/async-pitfalls/blocking-executor.md +msgid "Run the code and see that the sleeps happen consecutively rather than concurrently." msgstr "" -#: src/memory-management/drop.md -msgid "Note that `std::mem::drop` is not the same as `std::ops::Drop::drop`." +#: src/concurrency/async-pitfalls/blocking-executor.md +msgid "" +"The `\"current_thread\"` flavor puts all tasks on a single thread. This makes the effect " +"more obvious, but the bug is still present in the multi-threaded flavor." msgstr "" -#: src/memory-management/drop.md -msgid "Values are automatically dropped when they go out of scope." +#: src/concurrency/async-pitfalls/blocking-executor.md +msgid "Switch the `std::thread::sleep` to `tokio::time::sleep` and await its result." msgstr "" -#: src/memory-management/drop.md +#: src/concurrency/async-pitfalls/blocking-executor.md msgid "" -"When a value is dropped, if it implements `std::ops::Drop` then its `Drop::" -"drop` implementation will be called." +"Another fix would be to `tokio::task::spawn_blocking` which spawns an actual thread and " +"transforms its handle into a future without blocking the executor." msgstr "" -#: src/memory-management/drop.md +#: src/concurrency/async-pitfalls/blocking-executor.md msgid "" -"All its fields will then be dropped too, whether or not it implements `Drop`." +"You should not think of tasks as OS threads. They do not map 1 to 1 and executors will " +"allow multiple tasks to run on a single OS thread. This is particularly problematic when " +"interacting with other libraries via FFI, where that library might depend on thread-local " +"storage or map to specific OS threads (e.g., CUDA). Prefer `tokio::task::spawn_blocking` " +"in such situations." msgstr "" -#: src/memory-management/drop.md +#: src/concurrency/async-pitfalls/blocking-executor.md msgid "" -"`std::mem::drop` is just an empty function that takes any value. The " -"significance is that it takes ownership of the value, so at the end of its " -"scope it gets dropped. This makes it a convenient way to explicitly drop " -"values earlier than they would otherwise go out of scope." +"Use sync mutexes with care. Holding a mutex over an `.await` may cause another task to " +"block, and that task may be running on the same thread." msgstr "" -#: src/memory-management/drop.md +#: src/concurrency/async-pitfalls/pin.md msgid "" -"This can be useful for objects that do some work on `drop`: releasing locks, " -"closing files, etc." +"Recall an async function or block creates a type implementing `Future` and containing all " +"of the local variables. Some of those variables can hold references (pointers) to other " +"local variables. To ensure those remain valid, the future can never be moved to a " +"different memory location." msgstr "" -#: src/memory-management/drop.md -#, fuzzy -msgid "Why doesn't `Drop::drop` take `self`?" -msgstr "Pourquoi `Drop::drop` ne prend-il pas `self` ?" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"To prevent moving the future type in memory, it can only be polled through a pinned " +"pointer. `Pin` is a wrapper around a reference that disallows all operations that would " +"move the instance it points to into a different memory location." +msgstr "" -#: src/memory-management/drop.md -#, fuzzy +#: src/concurrency/async-pitfalls/pin.md msgid "" -"Short-answer: If it did, `std::mem::drop` would be called at the end of the " -"block, resulting in another call to `Drop::drop`, and a stack overflow!" +"// A work item. In this case, just sleep for the given time and respond\n" +"// with a message on the `respond_on` channel.\n" msgstr "" -"Réponse courte : si c'était le cas, `std::mem::drop` serait appelé à la fin " -"de le bloc, résultant en un autre appel à `Drop :: drop`, et une pile " -"débordement!" -#: src/memory-management/drop.md -#, fuzzy -msgid "Try replacing `drop(a)` with `a.drop()`." -msgstr "Essayez de remplacer `drop(a)` par `a.drop()`." +#: src/concurrency/async-pitfalls/pin.md +msgid "// A worker which listens for work on a queue and performs it.\n" +msgstr "" -#: src/memory-management/exercise.md -msgid "" -"In this example, we will implement a complex data type that owns all of its " -"data. We will use the \"builder pattern\" to support building a new value " -"piece-by-piece, using convenience functions." +#: src/concurrency/async-pitfalls/pin.md +msgid "// Pretend to work.\n" msgstr "" -#: src/memory-management/exercise.md -msgid "Fill in the missing pieces." +#: src/concurrency/async-pitfalls/pin.md +msgid "\"failed to send response\"" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "/// A representation of a software package.\n" +#: src/concurrency/async-pitfalls/pin.md +msgid "// TODO: report number of iterations every 100ms\n" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "" -"/// Return a representation of this package as a dependency, for use in\n" -" /// building other packages.\n" +#: src/concurrency/async-pitfalls/pin.md +msgid "// A requester which requests work and waits for it to complete.\n" msgstr "" -#: src/memory-management/exercise.md -msgid "\"1\"" +#: src/concurrency/async-pitfalls/pin.md +msgid "\"failed to send on work queue\"" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md +#: src/concurrency/async-pitfalls/pin.md +msgid "\"failed waiting for response\"" +msgstr "" + +#: src/concurrency/async-pitfalls/pin.md +msgid "\"work result for iteration {i}: {resp}\"" +msgstr "" + +#: src/concurrency/async-pitfalls/pin.md msgid "" -"/// A builder for a Package. Use `build()` to create the `Package` itself.\n" +"You may recognize this as an example of the actor pattern. Actors typically call `select!" +"` in a loop." msgstr "" -#: src/memory-management/exercise.md -msgid "\"2\"" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"This serves as a summation of a few of the previous lessons, so take your time with it." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "/// Set the package version.\n" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"Naively add a `_ = sleep(Duration::from_millis(100)) => { println!(..) }` to the `select!" +"`. This will never execute. Why?" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "/// Set the package authors.\n" +#: src/concurrency/async-pitfalls/pin.md +msgid "Instead, add a `timeout_fut` containing that future outside of the `loop`:" msgstr "" -#: src/memory-management/exercise.md -msgid "\"3\"" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"This still doesn't work. Follow the compiler errors, adding `&mut` to the `timeout_fut` " +"in the `select!` to work around the move, then using `Box::pin`:" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "/// Add an additional dependency.\n" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"This compiles, but once the timeout expires it is `Poll::Ready` on every iteration (a " +"fused future would help with this). Update to reset `timeout_fut` every time it expires:" msgstr "" -#: src/memory-management/exercise.md -msgid "\"4\"" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"Box allocates on the heap. In some cases, `std::pin::pin!` (only recently stabilized, " +"with older code often using `tokio::pin!`) is also an option, but that is difficult to " +"use for a future that is reassigned." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "/// Set the language. If not set, language defaults to None.\n" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"Another alternative is to not use `pin` at all but spawn another task that will send to a " +"`oneshot` channel every 100ms." msgstr "" -#: src/memory-management/exercise.md -msgid "\"5\"" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"Data that contains pointers to itself is called self-referential. Normally, the Rust " +"borrow checker would prevent self-referential data from being moved, as the references " +"cannot outlive the data they point to. However, the code transformation for async blocks " +"and functions is not verified by the borrow checker." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"base64\"" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"`Pin` is a wrapper around a reference. An object cannot be moved from its place using a " +"pinned pointer. However, it can still be moved through an unpinned pointer." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"0.13\"" +#: src/concurrency/async-pitfalls/pin.md +msgid "" +"The `poll` method of the `Future` trait uses `Pin<&mut Self>` instead of `&mut Self` to " +"refer to the instance. That's why it can only be called on a pinned pointer." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"base64: {base64:?}\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"Async methods in traits were stabilized in the 1.75 release. This required support for " +"using return-position `impl Trait` in traits, as the desugaring for `async fn` includes `-" +"> impl Future`." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"log\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"However, even with the native support, there are specific pitfalls around `async fn`:" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"0.4\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"Return-position `impl Trait` captures all in-scope lifetimes (so certain patterns of " +"borrowing cannot be expressed)." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"log: {log:?}\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"Async traits cannot be used with [trait objects](../../smart-pointers/trait-objects.md) " +"(`dyn Trait` support)." msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"serde\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"The [async_trait](https://docs.rs/async-trait/) crate provides a workaround for `dyn` " +"support through a macro, with specific caveats:" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"djmitche\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "\"Running all sleepers...\"" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"4.0\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "\"Slept for {} ms\"" msgstr "" -#: src/memory-management/exercise.md src/memory-management/solution.md -msgid "\"serde: {serde:?}\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"`async_trait` is easy to use, but note that it's using heap allocations to achieve this. " +"This heap allocation has performance overhead." msgstr "" -#: src/memory-management/solution.md -msgid "\"0.1\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"The challenges in language support for `async trait` are too deep to describe in-depth in " +"this class. See [this blog post](https://smallcultfollowing.com/babysteps/blog/2019/10/26/" +"async-fn-in-traits-are-hard/) by Niko Matsakis if you are interested in digging deeper. " +"See also these keywords:" msgstr "" -#: src/smart-pointers/box.md -#, fuzzy +#: src/concurrency/async-pitfalls/async-traits.md msgid "" -"[`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html) is an owned " -"pointer to data on the heap:" +"[RPIT](https://doc.rust-lang.org/reference/types/impl-trait.html#abstract-return-types): " +"short for [return-position `impl Trait`](../../generics/impl-trait.md)." msgstr "" -"[`Box`](https://doc.rust-lang.org/std/boxed/struct.Box.html) est un pointeur " -"propriétaire vers des données sur le tas :" -#: src/smart-pointers/box.md -msgid "\"five: {}\"" +#: src/concurrency/async-pitfalls/async-traits.md +msgid "" +"[RPITIT](https://blog.rust-lang.org/2023/12/21/async-fn-rpit-in-traits.html): short for " +"return-position `impl Trait` in trait (RPIT in trait)." msgstr "" -#: src/smart-pointers/box.md -#, fuzzy +#: src/concurrency/async-pitfalls/async-traits.md msgid "" -"`Box` implements `Deref`, which means that you can [call " -"methods from `T` directly on a `Box`](https://doc.rust-lang.org/std/ops/" -"trait.Deref.html#more-on-deref-coercion)." +"Try creating a new sleeper struct that will sleep for a random amount of time and adding " +"it to the `Vec`." msgstr "" -"`Box` implémente `Deref`, ce qui signifie que vous pouvez " -"[appeler des méthodes depuis `T` directement sur une `Box`](https://doc." -"rust-lang.org/std/ops/trait.Deref.html#more-on-deref-coercion)." -#: src/smart-pointers/box.md -#, fuzzy +#: src/concurrency/async-pitfalls/cancellation.md msgid "" -"Recursive data types or data types with dynamic sizes need to use a `Box`:" +"Dropping a future implies it can never be polled again. This is called _cancellation_ and " +"it can occur at any `await` point. Care is needed to ensure the system works correctly " +"even when futures are cancelled. For example, it shouldn't deadlock or lose data." msgstr "" -"Les types de données récursifs ou les types de données avec des tailles " -"dynamiques doivent utiliser une `Box` :" -#: src/smart-pointers/box.md -msgid "/// A non-empty list: first element and the rest of the list.\n" +#: src/concurrency/async-pitfalls/cancellation.md +msgid "\"not UTF-8\"" msgstr "" -#: src/smart-pointers/box.md -msgid "/// An empty list.\n" +#: src/concurrency/async-pitfalls/cancellation.md +msgid "\"hi\\nthere\\n\"" msgstr "" -#: src/smart-pointers/box.md -msgid "\"{list:?}\"" +#: src/concurrency/async-pitfalls/cancellation.md +msgid "\"tick!\"" msgstr "" -#: src/smart-pointers/box.md +#: src/concurrency/async-pitfalls/cancellation.md msgid "" -"```bob\n" -" Stack Heap\n" -".- - - - - - - - - - - - - - . .- - - - - - - - - - - - - - - - - - - - " -"- - - - -.\n" -": : : :\n" -": " -"list : : :\n" -": +---------+----+----+ : : +---------+----+----+ +------+----" -"+----+ :\n" -": | Element | 1 | o--+----+-----+--->| Element | 2 | o--+--->| Nil | // " -"| // | :\n" -": +---------+----+----+ : : +---------+----+----+ +------+----" -"+----+ :\n" -": : : :\n" -": : : :\n" -"'- - - - - - - - - - - - - - ' '- - - - - - - - - - - - - - - - - - - - " -"- - - - -'\n" -"```" +"The compiler doesn't help with cancellation-safety. You need to read API documentation " +"and consider what state your `async fn` holds." msgstr "" -#: src/smart-pointers/box.md -#, fuzzy +#: src/concurrency/async-pitfalls/cancellation.md msgid "" -"`Box` is like `std::unique_ptr` in C++, except that it's guaranteed to be " -"not null." +"Unlike `panic` and `?`, cancellation is part of normal control flow (vs error-handling)." msgstr "" -"`Box` est comme `std::unique_ptr` en C++, sauf qu'il est garanti qu'il n'est " -"pas nul." -#: src/smart-pointers/box.md -#, fuzzy -msgid "A `Box` can be useful when you:" -msgstr "Une `Box` peut être utile lorsque vous :" +#: src/concurrency/async-pitfalls/cancellation.md +msgid "The example loses parts of the string." +msgstr "" -#: src/smart-pointers/box.md -#, fuzzy +#: src/concurrency/async-pitfalls/cancellation.md +msgid "Whenever the `tick()` branch finishes first, `next()` and its `buf` are dropped." +msgstr "" + +#: src/concurrency/async-pitfalls/cancellation.md +msgid "`LinesReader` can be made cancellation-safe by making `buf` part of the struct:" +msgstr "" + +#: src/concurrency/async-pitfalls/cancellation.md +msgid "// prefix buf and bytes with self.\n" +msgstr "" + +#: src/concurrency/async-pitfalls/cancellation.md msgid "" -"have a type whose size that can't be known at compile time, but the Rust " -"compiler wants to know an exact size." +"[`Interval::tick`](https://docs.rs/tokio/latest/tokio/time/struct.Interval.html#method." +"tick) is cancellation-safe because it keeps track of whether a tick has been 'delivered'." msgstr "" -"avoir un type dont la taille ne peut pas être connue au moment de la " -"compilation, mais le compilateur Rust veut connaître une taille exacte." -#: src/smart-pointers/box.md -#, fuzzy +#: src/concurrency/async-pitfalls/cancellation.md msgid "" -"want to transfer ownership of a large amount of data. To avoid copying large " -"amounts of data on the stack, instead store the data on the heap in a `Box` " -"so only the pointer is moved." +"[`AsyncReadExt::read`](https://docs.rs/tokio/latest/tokio/io/trait.AsyncReadExt." +"html#method.read) is cancellation-safe because it either returns or doesn't read data." msgstr "" -"souhaitez transférer la propriété d'une grande quantité de données. Pour " -"éviter de copier de grandes quantités de données sur la pile, stockez plutôt " -"les données sur le tas dans une `Box` afin que seul le pointeur soit déplacé." -#: src/smart-pointers/box.md -#, fuzzy +#: src/concurrency/async-pitfalls/cancellation.md msgid "" -"If `Box` was not used and we attempted to embed a `List` directly into the " -"`List`, the compiler would not be able to compute a fixed size for the " -"struct in memory (the `List` would be of infinite size)." +"[`AsyncBufReadExt::read_line`](https://docs.rs/tokio/latest/tokio/io/trait." +"AsyncBufReadExt.html#method.read_line) is similar to the example and _isn't_ cancellation-" +"safe. See its documentation for details and alternatives." msgstr "" -"Si la `Box` n'a pas été utilisée ici et que nous avons essayé d'intégrer une " -"`List` directement dans la `List`, le compilateur ne calculerait pas une " -"taille fixe de la structure en mémoire, elle semblerait infinie." -#: src/smart-pointers/box.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md #, fuzzy +msgid "Dining Philosophers --- Async" +msgstr "Dîner des philosophes - Asynchrone" + +#: src/concurrency/async-exercises/dining-philosophers.md msgid "" -"`Box` solves this problem as it has the same size as a regular pointer and " -"just points at the next element of the `List` in the heap." +"See [dining philosophers](../sync-exercises/dining-philosophers.md) for a description of " +"the problem." msgstr "" -"`Box` résout ce problème car il a la même taille qu'un pointeur normal et " -"pointe simplement vers le prochain élément de la `Liste` dans le tas." -#: src/smart-pointers/box.md +#: src/concurrency/async-exercises/dining-philosophers.md #, fuzzy msgid "" -"Remove the `Box` in the List definition and show the compiler error. We get " -"the message \"recursive without indirection\", because for data recursion, " -"we have to use indirection, a `Box` or reference of some kind, instead of " -"storing the value directly." +"As before, you will need a local [Cargo installation](../../cargo/running-locally.md) for " +"this exercise. Copy the code below to a file called `src/main.rs`, fill out the blanks, " +"and test that `cargo run` does not deadlock:" msgstr "" -"Supprimez la `Box` dans la définition de la liste et affichez l'erreur du " -"compilateur. \"Récursif avec indirection\" est un indice que vous voudrez " -"peut-être utiliser une boîte ou une référence quelconque, au lieu de stocker " -"une valeur directement." +"Vous aurez besoin d'une [installation Cargo](../../cargo/running-locally.md) locale pour " +"cet exercice. Copiez le code ci-dessous dans un fichier appelé `src/main.rs`, remplissez " +"le vides, et testez que `cargo run` ne se bloque pas :" -#: src/smart-pointers/box.md -msgid "Niche Optimization" -msgstr "Optimisation niche" +#: src/concurrency/async-exercises/dining-philosophers.md +msgid "// Keep trying until we have both chopsticks\n" +msgstr "" -#: src/smart-pointers/box.md +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "// tokio scheduler doesn't deadlock with 5 philosophers, so have 2.\n" +msgstr "" + +#: src/concurrency/async-exercises/dining-philosophers.md +#: src/concurrency/async-exercises/solutions.md +msgid "// Make them think and eat\n" +msgstr "" + +#: src/concurrency/async-exercises/dining-philosophers.md msgid "" -"Though `Box` looks like `std::unique_ptr` in C++, it cannot be empty/null. " -"This makes `Box` one of the types that allow the compiler to optimize " -"storage of some enums." +"Since this time you are using Async Rust, you'll need a `tokio` dependency. You can use " +"the following `Cargo.toml`:" msgstr "" -#: src/smart-pointers/box.md +#: src/concurrency/async-exercises/dining-philosophers.md msgid "" -"For example, `Option>` has the same size, as just `Box`, because " -"compiler uses NULL-value to discriminate variants instead of using explicit " -"tag ([\"Null Pointer Optimization\"](https://doc.rust-lang.org/std/option/" -"#representation)):" +"```toml\n" +"[package]\n" +"name = \"dining-philosophers-async-dine\"\n" +"version = \"0.1.0\"\n" +"edition = \"2024\"\n" +"\n" +"[dependencies]\n" +"tokio = { version = \"1.26.0\", features = [\"sync\", \"time\", \"macros\", \"rt-multi-" +"thread\"] }\n" +"```" msgstr "" -#: src/smart-pointers/box.md -msgid "\"Just box\"" +#: src/concurrency/async-exercises/dining-philosophers.md +msgid "" +"Also note that this time you have to use the `Mutex` and the `mpsc` module from the " +"`tokio` crate." msgstr "" -#: src/smart-pointers/box.md -#, fuzzy -msgid "\"Optional box\"" -msgstr "Exceptions" +#: src/concurrency/async-exercises/dining-philosophers.md +msgid "Can you make your implementation single-threaded?" +msgstr "" -#: src/smart-pointers/box.md -msgid "\"Size of just_box: {}\"" +#: src/concurrency/async-exercises/chat-app.md +msgid "" +"In this exercise, we want to use our new knowledge to implement a broadcast chat " +"application. We have a chat server that the clients connect to and publish their " +"messages. The client reads user messages from the standard input, and sends them to the " +"server. The chat server broadcasts each message that it receives to all the clients." msgstr "" -#: src/smart-pointers/box.md -msgid "\"Size of optional_box: {}\"" +#: src/concurrency/async-exercises/chat-app.md +msgid "" +"For this, we use [a broadcast channel](https://docs.rs/tokio/latest/tokio/sync/broadcast/" +"fn.channel.html) on the server, and [`tokio_websockets`](https://docs.rs/tokio-" +"websockets/) for the communication between the client and the server." msgstr "" -#: src/smart-pointers/box.md -msgid "\"Size of none: {}\"" +#: src/concurrency/async-exercises/chat-app.md +msgid "Create a new Cargo project and add the following dependencies:" msgstr "" -#: src/smart-pointers/rc.md -#, fuzzy +#: src/concurrency/async-exercises/chat-app.md +msgid "_Cargo.toml_:" +msgstr "" + +#: src/concurrency/async-exercises/chat-app.md msgid "" -"[`Rc`](https://doc.rust-lang.org/std/rc/struct.Rc.html) is a reference-" -"counted shared pointer. Use this when you need to refer to the same data " -"from multiple places:" +"```toml\n" +"[package]\n" +"name = \"chat-async\"\n" +"version = \"0.1.0\"\n" +"edition = \"2024\"\n" +"\n" +"[dependencies]\n" +"futures-util = { version = \"0.3.31\", features = [\"sink\"] }\n" +"http = \"1.4.0\"\n" +"tokio = { version = \"1.49.0\", features = [\"full\"] }\n" +"tokio-websockets = { version = \"0.13.1\", features = [\"client\", \"fastrand\", " +"\"server\", \"sha1_smol\"] }\n" +"```" msgstr "" -"[`Rc`](https://doc.rust-lang.org/std/rc/struct.Rc.html) est un pointeur " -"partagé compté par référence. Utilisez-le lorsque vous avez besoin de vous " -"référer aux mêmes données depuis plusieurs endroits :" -#: src/smart-pointers/rc.md -msgid "\"a: {a}\"" +#: src/concurrency/async-exercises/chat-app.md +msgid "The required APIs" msgstr "" -#: src/smart-pointers/rc.md -msgid "\"b: {b}\"" +#: src/concurrency/async-exercises/chat-app.md +msgid "" +"You are going to need the following functions from `tokio` and [`tokio_websockets`]" +"(https://docs.rs/tokio-websockets/). Take time to familiarize yourself with the API." msgstr "" -#: src/smart-pointers/rc.md -#, fuzzy +#: src/concurrency/async-exercises/chat-app.md msgid "" -"See [`Arc`](../concurrency/shared_state/arc.md) and [`Mutex`](https://doc." -"rust-lang.org/std/sync/struct.Mutex.html) if you are in a multi-threaded " -"context." +"[StreamExt::next()](https://docs.rs/futures-util/0.3.28/futures_util/stream/trait." +"StreamExt.html#method.next) implemented by `WebSocketStream`: for asynchronously reading " +"messages from a Websocket Stream." msgstr "" -"Voir [`Arc`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) si vous " -"êtes dans un contexte multi-thread." -#: src/smart-pointers/rc.md -#, fuzzy +#: src/concurrency/async-exercises/chat-app.md msgid "" -"You can _downgrade_ a shared pointer into a [`Weak`](https://doc.rust-lang." -"org/std/rc/struct.Weak.html) pointer to create cycles that will get dropped." +"[SinkExt::send()](https://docs.rs/futures-util/0.3.28/futures_util/sink/trait.SinkExt." +"html#method.send) implemented by `WebSocketStream`: for asynchronously sending messages " +"on a Websocket Stream." msgstr "" -"Vous pouvez _rétrograder_ un pointeur partagé en un pointeur [`Weak`]" -"(https://doc.rust-lang.org/std/rc/struct.Weak.html) pour créer des cycles " -"qui va tomber." -#: src/smart-pointers/rc.md -#, fuzzy +#: src/concurrency/async-exercises/chat-app.md msgid "" -"`Rc`'s count ensures that its contained value is valid for as long as there " -"are references." +"[Lines::next_line()](https://docs.rs/tokio/latest/tokio/io/struct.Lines.html#method." +"next_line): for asynchronously reading user messages from the standard input." msgstr "" -"Le comptage de `Rc` garantit que sa valeur contenue est valide tant qu'il y " -"a des références." -#: src/smart-pointers/rc.md -#, fuzzy -msgid "`Rc` in Rust is like `std::shared_ptr` in C++." -msgstr "Comme `std::shared_ptr` de C++." +#: src/concurrency/async-exercises/chat-app.md +msgid "" +"[Sender::subscribe()](https://docs.rs/tokio/latest/tokio/sync/broadcast/struct.Sender." +"html#method.subscribe): for subscribing to a broadcast channel." +msgstr "" -#: src/smart-pointers/rc.md -#, fuzzy +#: src/concurrency/async-exercises/chat-app.md +msgid "Two binaries" +msgstr "Deux binaires" + +#: src/concurrency/async-exercises/chat-app.md msgid "" -"`Rc::clone` is cheap: it creates a pointer to the same allocation and " -"increases the reference count. Does not make a deep clone and can generally " -"be ignored when looking for performance issues in code." +"Normally in a Cargo project, you can have only one binary, and one `src/main.rs` file. In " +"this project, we need two binaries. One for the client, and one for the server. You could " +"potentially make them two separate Cargo projects, but we are going to put them in a " +"single Cargo project with two binaries. For this to work, the client and the server code " +"should go under `src/bin` (see the [documentation](https://doc.rust-lang.org/cargo/" +"reference/cargo-targets.html#binaries))." msgstr "" -"`clone` est bon marché : il crée un pointeur vers la même allocation et " -"augmente le nombre de références. Ne crée pas de clone profond et peut " -"généralement être ignoré lors de la recherche de problèmes de performances " -"dans le code." -#: src/smart-pointers/rc.md -#, fuzzy +#: src/concurrency/async-exercises/chat-app.md msgid "" -"`make_mut` actually clones the inner value if necessary (\"clone-on-write\") " -"and returns a mutable reference." +"Copy the following server and client code into `src/bin/server.rs` and `src/bin/client." +"rs`, respectively. Your task is to complete these files as described below." msgstr "" -"`make_mut` clone en fait la valeur interne si nécessaire (\"clone-on-" -"write\") et renvoie une référence mutable." -#: src/smart-pointers/rc.md +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md #, fuzzy -msgid "Use `Rc::strong_count` to check the reference count." -msgstr "Utilisez `Rc::strong_count` pour vérifier le nombre de références." +msgid "_src/bin/server.rs_:" +msgstr "`src/main.rs` :" -#: src/smart-pointers/rc.md -#, fuzzy -msgid "" -"`Rc::downgrade` gives you a _weakly reference-counted_ object to create " -"cycles that will be dropped properly (likely in combination with `RefCell`)." +#: src/concurrency/async-exercises/chat-app.md +msgid "// TODO: For a hint, see the description of the task below.\n" msgstr "" -"Vous pouvez `downgrader()` un `Rc` en un objet _faiblement compté en " -"référence_ pour créer des cycles qui seront supprimés correctement " -"(probablement en combinaison avec `RefCell`)." -#: src/smart-pointers/trait-objects.md -#, fuzzy -msgid "" -"Trait objects allow for values of different types, for instance in a " -"collection:" +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md +msgid "\"127.0.0.1:2000\"" msgstr "" -"Les objets de trait autorisent des valeurs de différents types, par exemple " -"dans une collection :" -#: src/smart-pointers/trait-objects.md -msgid "\"Miau!\"" +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md +msgid "\"listening on port 2000\"" msgstr "" -#: src/smart-pointers/trait-objects.md -msgid "\"Hello, who are you? {}\"" +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md +msgid "\"New connection from {addr:?}\"" msgstr "" -#: src/smart-pointers/trait-objects.md +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md +msgid "// Wrap the raw TCP stream into a websocket.\n" +msgstr "" + +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md #, fuzzy -msgid "Memory layout after allocating `pets`:" -msgstr "Disposition de la mémoire après l'allocation de `pets` :" +msgid "_src/bin/client.rs_:" +msgstr "`src/main.rs` :" -#: src/smart-pointers/trait-objects.md -msgid "" -"```bob\n" -" Stack Heap\n" -".- - - - - - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - " -"- -.\n" -": : : :\n" -": \"pets: Vec\" : : \"data: Cat\" +----+----+----" -"+----+ :\n" -": +-----------+-------+ : : +-------+-------+ | F | i | d | " -"o | :\n" -": | ptr | o---+---+--. : | lives | 9 | +----+----+----" -"+----+ :\n" -": | len | 2 | : | : +-------+-------+ " -"^ :\n" -": | capacity | 2 | : | : ^ " -"| :\n" -": +-----------+-------+ : | : | " -"'-------. :\n" -": : | : | data:" -"\"Dog\"| :\n" -": : | : | +-------+--|-------" -"+ :\n" -"`- - - - - - - - - - - - - -' | : +---|-+-----+ | name | o, 4, 4 " -"| :\n" -" `--+-->| o o | o o-|----->| age | 5 " -"| :\n" -" : +-|---+-|---+ +-------+----------" -"+ :\n" -" : | " -"| :\n" -" `- - -| - - |- - - - - - - - - - - - - - - " -"- -'\n" -" | |\n" -" | | " -"\"Program text\"\n" -" .- - -| - - |- - - - - - - - - - - - - - - " -"- -.\n" -" : | | " -"vtable :\n" -" : | | +----------------------" -"+ :\n" -" : | `----->| \"::" -"talk\" | :\n" -" : | +----------------------" -"+ :\n" -" : | " -"vtable :\n" -" : | +----------------------" -"+ :\n" -" : '----------->| \"::" -"talk\" | :\n" -" : +----------------------" -"+ :\n" -" : :\n" -" '- - - - - - - - - - - - - - - - - - - - - " -"- -'\n" -"```" +#: src/concurrency/async-exercises/chat-app.md src/concurrency/async-exercises/solutions.md +msgid "\"ws://127.0.0.1:2000\"" msgstr "" -#: src/smart-pointers/trait-objects.md -msgid "" -"Types that implement a given trait may be of different sizes. This makes it " -"impossible to have things like `Vec` in the example above." -msgstr "" +#: src/concurrency/async-exercises/chat-app.md +#, fuzzy +msgid "Running the binaries" +msgstr "Exécution du parcours" -#: src/smart-pointers/trait-objects.md -msgid "" -"`dyn Pet` is a way to tell the compiler about a dynamically sized type that " -"implements `Pet`." +#: src/concurrency/async-exercises/chat-app.md +#, fuzzy +msgid "Run the server with:" +msgstr "Exécutez l'exemple avec :" + +#: src/concurrency/async-exercises/chat-app.md +#, fuzzy +msgid "and the client with:" +msgstr "Exécutez l'exemple avec :" + +#: src/concurrency/async-exercises/chat-app.md +msgid "Implement the `handle_connection` function in `src/bin/server.rs`." msgstr "" -#: src/smart-pointers/trait-objects.md +#: src/concurrency/async-exercises/chat-app.md msgid "" -"In the example, `pets` is allocated on the stack and the vector data is on " -"the heap. The two vector elements are _fat pointers_:" +"Hint: Use `tokio::select!` for concurrently performing two tasks in a continuous loop. " +"One task receives messages from the client and broadcasts them. The other sends messages " +"received by the server to the client." msgstr "" -#: src/smart-pointers/trait-objects.md -msgid "" -"A fat pointer is a double-width pointer. It has two components: a pointer to " -"the actual object and a pointer to the [virtual method table](https://en." -"wikipedia.org/wiki/Virtual_method_table) (vtable) for the `Pet` " -"implementation of that particular object." +#: src/concurrency/async-exercises/chat-app.md +msgid "Complete the main function in `src/bin/client.rs`." msgstr "" -#: src/smart-pointers/trait-objects.md +#: src/concurrency/async-exercises/chat-app.md msgid "" -"The data for the `Dog` named Fido is the `name` and `age` fields. The `Cat` " -"has a `lives` field." +"Hint: As before, use `tokio::select!` in a continuous loop for concurrently performing " +"two tasks: (1) reading user messages from standard input and sending them to the server, " +"and (2) receiving messages from the server, and displaying them for the user." msgstr "" -#: src/smart-pointers/trait-objects.md -msgid "Compare these outputs in the above example:" +#: src/concurrency/async-exercises/chat-app.md +msgid "" +"Optional: Once you are done, change the code to broadcast messages to all clients, but " +"the sender of the message." msgstr "" -#: src/smart-pointers/exercise.md +#: src/concurrency/async-exercises/solutions.md msgid "" -"A binary tree is a tree-type data structure where every node has two " -"children (left and right). We will create a tree where each node stores a " -"value. For a given node N, all nodes in a N's left subtree contain smaller " -"values, and all nodes in N's right subtree will contain larger values." +"// Keep trying until we have both chopsticks\n" +" // Pick up chopsticks...\n" msgstr "" -#: src/smart-pointers/exercise.md -msgid "Implement the following types, so that the given tests pass." +#: src/concurrency/async-exercises/solutions.md +msgid "// The locks are dropped here\n" msgstr "" -#: src/smart-pointers/exercise.md -msgid "" -"Extra Credit: implement an iterator over a binary tree that returns the " -"values in order." +#: src/concurrency/async-exercises/solutions.md +msgid "// tx is dropped here, so we don't need to explicitly drop it later\n" msgstr "" -#: src/smart-pointers/exercise.md src/smart-pointers/solution.md -msgid "/// A node in the binary tree.\n" +#: src/concurrency/async-exercises/solutions.md +msgid "\"Here is a thought: {thought}\"" msgstr "" -#: src/smart-pointers/exercise.md src/smart-pointers/solution.md -msgid "/// A possibly-empty subtree.\n" +#: src/concurrency/async-exercises/solutions.md +msgid "\"Welcome to chat! Type a message\"" msgstr "" -#: src/smart-pointers/exercise.md src/smart-pointers/solution.md +#: src/concurrency/async-exercises/solutions.md msgid "" -"/// A container storing a set of values, using a binary tree.\n" -"///\n" -"/// If the same value is added multiple times, it is only stored once.\n" +"// A continuous loop for concurrently performing two tasks: (1) receiving\n" +" // messages from `ws_stream` and broadcasting them, and (2) receiving\n" +" // messages on `bcast_rx` and sending them to the client.\n" msgstr "" -#: src/smart-pointers/exercise.md -msgid "// Implement `new`, `insert`, `len`, and `has`.\n" +#: src/concurrency/async-exercises/solutions.md +msgid "\"From client {addr:?} {text:?}\"" msgstr "" -#: src/smart-pointers/exercise.md src/smart-pointers/solution.md -msgid "// not a unique item\n" +#: src/concurrency/async-exercises/solutions.md +msgid "// Continuous loop for concurrently sending and receiving messages.\n" msgstr "" -#: src/smart-pointers/solution.md src/android/testing/googletest.md -msgid "\"bar\"" +#: src/concurrency/async-exercises/solutions.md +msgid "\"From server: {}\"" msgstr "" -#: src/borrowing/shared.md +#: src/idiomatic/welcome.md #, fuzzy +msgid "Welcome to Idiomatic Rust" +msgstr "Bienvenue dans Bare Metal Rust" + +#: src/idiomatic/welcome.md msgid "" -"As we saw before, instead of transferring ownership when calling a function, " -"you can let a function _borrow_ the value:" +"[Rust Fundamentals](../welcome-day-1.md) introduced Rust syntax and core concepts. We now " +"want to go one step further: how do you use Rust _effectively_ in your projects? What " +"does _idiomatic_ Rust look like?" msgstr "" -"Au lieu de transférer la propriété lors de l'appel d'une fonction, vous " -"pouvez laisser une la fonction _emprunte_ la valeur :" -#: src/borrowing/shared.md -#, fuzzy -msgid "The `add` function _borrows_ two points and returns a new point." -msgstr "La fonction `add` _emprunte_ deux points et renvoie un nouveau point." +#: src/idiomatic/welcome.md +msgid "" +"This course is opinionated: we will nudge you towards some patterns, and away from " +"others. Nonetheless, we do recognize that some projects may have different needs. We " +"always provide the necessary information to help you make informed decisions within the " +"context and constraints of your own projects." +msgstr "" -#: src/borrowing/shared.md -#, fuzzy -msgid "The caller retains ownership of the inputs." -msgstr "L'appelant conserve la propriété des entrées." +#: src/idiomatic/welcome.md +msgid "⚠️ This course is under **active development**." +msgstr "" -#: src/borrowing/shared.md +#: src/idiomatic/welcome.md msgid "" -"This slide is a review of the material on references from day 1, expanding " -"slightly to include function arguments and return values." +"The material may change frequently and there might be errors that have not yet been " +"spotted. Nonetheless, we encourage you to browse through and provide early feedback!" msgstr "" -#: src/borrowing/shared.md -#, fuzzy -msgid "Notes on stack returns:" -msgstr "Remarques sur les retours de pile :" +#: src/idiomatic/welcome.md +msgid "" +"Including 10 minute breaks, this session should take about 14 hours and 25 minutes. It " +"contains:" +msgstr "" -#: src/borrowing/shared.md +#: src/idiomatic/welcome.md 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/?" -"version=stable&mode=release&edition=2021&gist=0cb13be1c05d7e3446686ad9947c4671) " -"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:" +"The course will cover the topics listed below. Each topic may be covered in one or more " +"slides, depending on its complexity and relevance." msgstr "" -#: src/borrowing/shared.md -msgid "The Rust compiler can do return value optimization (RVO)." +#: src/idiomatic/welcome.md +msgid "Target Audience" msgstr "" -#: src/borrowing/shared.md +#: src/idiomatic/welcome.md 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 perform a simple and efficient `memcpy` " -"copy." +"Engineers with at least 2-3 years of coding experience in C, C++11 or newer, Java 7 or " +"newer, Python 2 or 3, Go or any other similar imperative programming language. We have no " +"expectation of experience with more modern or feature-rich languages like Swift, Kotlin, " +"C#, or TypeScript." msgstr "" -#: src/borrowing/borrowck.md -#, fuzzy -msgid "" -"Rust's _borrow checker_ puts constraints on the ways you can borrow values. " -"For a given value, at any time:" +#: src/idiomatic/welcome.md +msgid "Foundations of API design" msgstr "" -"Rust impose des contraintes sur la manière dont vous pouvez emprunter des " -"valeurs :" -#: src/borrowing/borrowck.md -#, fuzzy -msgid "You can have one or more shared references to the value, _or_" -msgstr "Vous pouvez avoir une ou plusieurs valeurs `&T` à tout moment, _ou_" +#: src/idiomatic/welcome.md +msgid "" +"Golden rule: prioritize clarity and readability at the callsite. People will spend much " +"more time reading the call sites than declarations of the functions being called." +msgstr "" -#: src/borrowing/borrowck.md -#, fuzzy -msgid "You can have exactly one exclusive reference to the value." -msgstr "Vous pouvez avoir exactement une valeur `&mut T`." +#: src/idiomatic/welcome.md +msgid "Make your API predictable" +msgstr "" -#: src/borrowing/borrowck.md +#: src/idiomatic/welcome.md msgid "" -"Note that the requirement is that conflicting references not _exist_ at the " -"same point. It does not matter where the reference is dereferenced." +"Follow naming conventions (case conventions, prefer vocabulary precedented in the " +"standard library - e.g., methods should be called \"push\" not \"push_back\", " +"\"is_empty\" not \"empty\" etc.)" msgstr "" -#: src/borrowing/borrowck.md -#, fuzzy +#: src/idiomatic/welcome.md msgid "" -"The above code does not compile because `a` is borrowed as mutable (through " -"`c`) and as immutable (through `b`) at the same time." +"Know the vocabulary types and traits in the standard library, and use them in your APIs. " +"If something feels like a basic type/algorithm, check in the standard library first." msgstr "" -"Le code ci-dessus ne se compile pas car 'a' est emprunté comme mutable (via " -"'c') et comme immuable (via 'b') en même temps." -#: src/borrowing/borrowck.md -#, fuzzy +#: src/idiomatic/welcome.md msgid "" -"Move the `println!` statement for `b` before the scope that introduces `c` " -"to make the code compile." +"Use well-established API design patterns that we will discuss later in this class (e.g., " +"newtype, owned/view type pairs, error handling)" msgstr "" -"Déplacez l'instruction `println!` pour `b` avant la portée qui introduit `c` " -"pour que le code soit compilé." -#: src/borrowing/borrowck.md -#, fuzzy +#: src/idiomatic/welcome.md msgid "" -"After that change, the compiler realizes that `b` is only ever used before " -"the new mutable borrow of `a` through `c`. This is a feature of the borrow " -"checker called \"non-lexical lifetimes\"." +"Write meaningful and effective doc comments (e.g., don't merely repeat the method name " +"with spaces instead of underscores, don't repeat the same information just to fill out " +"every markdown tag, provide usage examples)" msgstr "" -"Après ce changement, le compilateur se rend compte que 'b' n'est utilisé " -"qu'avant le nouvel emprunt mutable de 'a' à 'c'. Il s'agit d'une " -"fonctionnalité du vérificateur d'emprunt appelée \"durées de vie non " -"lexicales\"." -#: src/borrowing/borrowck.md -msgid "" -"The exclusive reference constraint is quite strong. Rust uses it to ensure " -"that data races do not occur. Rust also _relies_ on this constraint to " -"optimize code. For example, a value behind a shared reference can be safely " -"cached in a register for the lifetime of that reference." +#: src/idiomatic/welcome.md +msgid "Leveraging the type system" msgstr "" -#: src/borrowing/borrowck.md -msgid "" -"The borrow checker is designed to accommodate many common patterns, such as " -"taking exclusive references to different fields in a struct at the same " -"time. But, there are some situations where it doesn't quite \"get it\" and " -"this often results in \"fighting with the borrow checker.\"" +#: src/idiomatic/welcome.md +msgid "Short recap on enums, structs and type aliases" msgstr "" -#: src/borrowing/interior-mutability.md -msgid "" -"In some situations, it's necessary to modify data behind a shared (read-" -"only) reference. For example, a shared data structure might have an internal " -"cache, and wish to update that cache from read-only methods." +#: src/idiomatic/welcome.md +msgid "Newtype pattern and encapsulation: parse, don't validate" msgstr "" -#: src/borrowing/interior-mutability.md +#: src/idiomatic/welcome.md msgid "" -"The \"interior mutability\" pattern allows exclusive (mutable) access behind " -"a shared reference. The standard library provides several ways to do this, " -"all while still ensuring safety, typically by performing a runtime check." +"Extension traits: avoid the newtype pattern when you want to provide additional behaviour" msgstr "" -#: src/borrowing/interior-mutability.md -#, fuzzy -msgid "`RefCell`" -msgstr "`RefCell`" - -#: src/borrowing/interior-mutability.md -msgid "\"graph: {root:#?}\"" +#: src/idiomatic/welcome.md +msgid "" +"RAII, scope guards and drop bombs: using `Drop` to clean up resources, trigger actions or " +"enforce invariants" msgstr "" -#: src/borrowing/interior-mutability.md -msgid "\"graph sum: {}\"" +#: src/idiomatic/welcome.md +msgid "\"Token\" types: force users to prove they've performed a specific action" msgstr "" -#: src/borrowing/interior-mutability.md -#, fuzzy -msgid "`Cell`" -msgstr "`Cellule`" +#: src/idiomatic/welcome.md +msgid "The typestate pattern: enforce correct state transitions at compile-time" +msgstr "" -#: src/borrowing/interior-mutability.md +#: src/idiomatic/welcome.md msgid "" -"`Cell` wraps a value and allows getting or setting the value, even with a " -"shared reference to the `Cell`. However, it does not allow any references to " -"the value. Since there are no references, borrowing rules cannot be broken." +"Using the borrow checker to enforce invariants that have nothing to do with memory " +"ownership" msgstr "" -#: src/borrowing/interior-mutability.md -msgid "" -"The main thing to take away from this slide is that Rust provides _safe_ " -"ways to modify data behind a shared reference. There are a variety of ways " -"to ensure that safety, and `RefCell` and `Cell` are two of them." +#: src/idiomatic/welcome.md +msgid "OwnedFd/BorrowedFd in the standard library" msgstr "" -#: src/borrowing/interior-mutability.md -msgid "" -"`RefCell` enforces Rust's usual borrowing rules (either multiple shared " -"references or a single exclusive reference) with a runtime check. In this " -"case, all borrows are very short and never overlap, so the checks always " -"succeed." +#: src/idiomatic/welcome.md +msgid "[Branded types](https://plv.mpi-sws.org/rustbelt/ghostcell/paper.pdf)" msgstr "" -#: src/borrowing/interior-mutability.md -msgid "" -"`Rc` only allows shared (read-only) access to its contents, since its " -"purpose is to allow (and count) many references. But we want to modify the " -"value, so we need interior mutability." +#: src/idiomatic/welcome.md +msgid "Don't fight the borrow checker" msgstr "" -#: src/borrowing/interior-mutability.md -msgid "" -"`Cell` is a simpler means to ensure safety: it has a `set` method that takes " -"`&self`. This needs no runtime check, but requires moving values, which can " -"have its own cost." +#: src/idiomatic/welcome.md +msgid "\"Owned\" types and \"view\" types: `&str` and `String`, `Path` and `PathBuf`, etc." msgstr "" -#: src/borrowing/interior-mutability.md -msgid "" -"Demonstrate that reference loops can be created by adding `root` to `subtree." -"children`." +#: src/idiomatic/welcome.md +msgid "Don't hide ownership requirements: avoid hidden `.clone()`, learn to love `Cow`" msgstr "" -#: src/borrowing/interior-mutability.md -msgid "" -"To demonstrate a runtime panic, add a `fn inc(&mut self)` that increments " -"`self.value` and calls the same method on its children. This will panic in " -"the presence of the reference loop, with `thread 'main' panicked at 'already " -"borrowed: BorrowMutError'`." +#: src/idiomatic/welcome.md +msgid "Split types along ownership boundaries" msgstr "" -#: src/borrowing/exercise.md -#, fuzzy -msgid "" -"You're working on implementing a health-monitoring system. As part of that, " -"you need to keep track of users' health statistics." +#: src/idiomatic/welcome.md +msgid "Structure your ownership hierarchy like a tree" msgstr "" -"Vous travaillez à la mise en place d'un système de surveillance de la santé. " -"Dans le cadre de cela, vous besoin de suivre les statistiques de santé des " -"utilisateurs." -#: src/borrowing/exercise.md -#, fuzzy +#: src/idiomatic/welcome.md msgid "" -"You'll start with a stubbed function in an `impl` block as well as a `User` " -"struct definition. Your goal is to implement the stubbed out method on the " -"`User` `struct` defined in the `impl` block." +"Strategies to manage circular dependencies: reference counting, using indexes instead of " +"references" msgstr "" -"Vous commencerez avec quelques fonctions stub dans un bloc `impl` ainsi " -"qu'un `User` définition de structure. Votre objectif est d'implémenter les " -"méthodes tronquées sur le `User` `struct` défini dans le bloc `impl`." -#: src/borrowing/exercise.md +#: src/idiomatic/welcome.md #, fuzzy -msgid "" -"Copy the code below to and fill in the missing " -"method:" +msgid "Interior mutability (Cell, RefCell)" +msgstr "Interopérabilité" + +#: src/idiomatic/welcome.md +msgid "Working with lifetime parameters on user-defined data types" msgstr "" -"Copiez le code ci-dessous sur et remplissez " -"les champs manquants méthodes :" -#: src/borrowing/exercise.md -msgid "" -"\"Update a user's statistics based on measurements from a visit to the " -"doctor\"" +#: src/idiomatic/welcome.md +msgid "Polymorphism in Rust" msgstr "" -#: src/borrowing/exercise.md src/borrowing/solution.md -#: src/android/build-rules/library.md -#: src/android/aidl/example-service/client.md -msgid "\"Bob\"" +#: src/idiomatic/welcome.md +msgid "A quick refresher on traits and generic functions" msgstr "" -#: src/borrowing/exercise.md src/borrowing/solution.md -msgid "\"I'm {} and my age is {}\"" +#: src/idiomatic/welcome.md +msgid "Rust has no inheritance: what are the implications?" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "" -"A reference has a _lifetime_, which must not \"outlive\" the value it refers " -"to. This is verified by the borrow checker." +#: src/idiomatic/welcome.md +msgid "Using enums for polymorphism" +msgstr "" + +#: src/idiomatic/welcome.md +msgid "Using traits for polymorphism" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "" -"The lifetime can be implicit - this is what we have seen so far. Lifetimes " -"can also be explicit: `&'a Point`, `&'document str`. Lifetimes start with " -"`'` and `'a` is a typical default name. Read `&'a Point` as \"a borrowed " -"`Point` which is valid for at least the lifetime `a`\"." +#: src/idiomatic/welcome.md +#, fuzzy +msgid "Using composition" +msgstr "En l'utilisant" + +#: src/idiomatic/welcome.md +msgid "How do I pick the most appropriate pattern?" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "" -"Lifetimes are always inferred by the compiler: you cannot assign a lifetime " -"yourself. Explicit lifetime annotations create constraints where there is " -"ambiguity; the compiler verifies that there is a valid solution." +#: src/idiomatic/welcome.md +msgid "Working with generics" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "" -"Lifetimes become more complicated when considering passing values to and " -"returning values from functions." +#: src/idiomatic/welcome.md +msgid "Generic type parameter in a function or trait object as an argument?" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "// What is the lifetime of p3?\n" +#: src/idiomatic/welcome.md +msgid "Trait bounds don't have to refer to the generic parameter" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "\"p3: {p3:?}\"" +#: src/idiomatic/welcome.md +msgid "Type parameters in traits: should it be a generic parameter or an associated type?" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "" -"In this example, the compiler does not know what lifetime to infer for `p3`. " -"Looking inside the function body shows that it can only safely assume that " -"`p3`'s lifetime is the shorter of `p1` and `p2`. But just like types, Rust " -"requires explicit annotations of lifetimes on function arguments and return " -"values." +#: src/idiomatic/welcome.md +msgid "Macros: a valuable tool to DRY up code when traits are not enough (or too complex)" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "Add `'a` appropriately to `left_most`:" +#: src/idiomatic/welcome.md +msgid "What is the purpose of errors? Recovery vs. reporting." msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "" -"This says, \"given p1 and p2 which both outlive `'a`, the return value lives " -"for at least `'a`." +#: src/idiomatic/welcome.md +msgid "Result vs. Option" msgstr "" -#: src/lifetimes/lifetime-annotations.md -msgid "" -"In common cases, lifetimes can be elided, as described on the next slide." +#: src/idiomatic/welcome.md +msgid "Designing good errors:" msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "Lifetimes in Function Calls" -msgstr "Durées de vie dans les appels de fonction" +#: src/idiomatic/welcome.md +msgid "Determine the error scope." +msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "" -"Lifetimes for function arguments and return values must be fully specified, " -"but Rust allows lifetimes to be elided in most cases with [a few simple " -"rules](https://doc.rust-lang.org/nomicon/lifetime-elision.html). This is not " -"inference -- it is just a syntactic shorthand." +#: src/idiomatic/welcome.md +msgid "Capture additional context as the error flows upwards, crossing scope boundaries." msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "Each argument which does not have a lifetime annotation is given one." +#: src/idiomatic/welcome.md +msgid "Leverage the `Error` trait to keep track of the full error chain." msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "" -"If there is only one argument lifetime, it is given to all un-annotated " -"return values." +#: src/idiomatic/welcome.md +msgid "Leverage `thiserror` to reduce boilerplate when defining error types." msgstr "" -#: src/lifetimes/lifetime-elision.md +#: src/idiomatic/welcome.md msgid "" -"If there are multiple argument lifetimes, but the first one is for `self`, " -"that lifetime is given to all un-annotated return values." +"Distinguish fatal errors from recoverable errors using `Result, FatalError>`." msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "In this example, `cab_distance` is trivially elided." +#: src/idiomatic/foundations-api-design.md +msgid "This segment should take about 3 hours and 30 minutes. It contains:" msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "" -"The `nearest` function provides another example of a function with multiple " -"references in its arguments that requires explicit annotation." +#: src/idiomatic/foundations-api-design.md +msgid "1 hour and 25 minutes" msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "Try adjusting the signature to \"lie\" about the lifetimes returned:" +#: src/idiomatic/foundations-api-design.md +msgid "2 hours and 5 minutes" msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "" -"This won't compile, demonstrating that the annotations are checked for " -"validity by the compiler. Note that this is not the case for raw pointers " -"(unsafe), and this is a common source of errors with unsafe Rust." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments.md +msgid "/// API for the client // ❌ Lacks detail\n" msgstr "" -#: src/lifetimes/lifetime-elision.md -msgid "" -"Students may ask when to use lifetimes. Rust borrows _always_ have " -"lifetimes. Most of the time, elision and type inference mean these don't " -"need to be written out. In more complicated cases, lifetime annotations can " -"help resolve ambiguity. Often, especially when prototyping, it's easier to " -"just work with owned data by cloning values where necessary." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments.md +msgid "/// Function from A to B // ❌ Redundant\n" msgstr "" -#: src/lifetimes/struct-lifetimes.md -msgid "Lifetimes in Data Structures" -msgstr "Durées de vie dans les structures de données" - -#: src/lifetimes/struct-lifetimes.md -#, fuzzy -msgid "" -"If a data type stores borrowed data, it must be annotated with a lifetime:" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments.md +msgid "/// Connects to the database. // ❌ Lacks detail\n" msgstr "" -"Si un type de données stocke des données empruntées, il doit être annoté " -"avec une durée de vie :" -#: src/lifetimes/struct-lifetimes.md -msgid "\"Bye {text}!\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments.md +msgid "Doc comments are the most common form of documentation developers engage with." msgstr "" -#: src/lifetimes/struct-lifetimes.md -msgid "\"The quick brown fox jumps over the lazy dog.\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments.md +msgid "" +"Good doc comments provide information that the code, names, and types cannot, without " +"restating the obvious information." msgstr "" -#: src/lifetimes/struct-lifetimes.md -msgid "// erase(text);\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md +msgid "Who are you writing for?" msgstr "" -#: src/lifetimes/struct-lifetimes.md -msgid "\"{fox:?}\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md +msgid "Colleagues, collaborators, largely-silent API users, or just yourself?" msgstr "" -#: src/lifetimes/struct-lifetimes.md -msgid "\"{dog:?}\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md +msgid "" +"// expert writes for experts\n" +"/// Canonicalizes the MIR for the borrow checker. \n" +"/// \n" +"/// This pass ensures that all borrows conform to the NLL-Polonius constraints \n" +"/// before we proceed to MIR-to-LLVM-IR translation. \n" msgstr "" -#: src/lifetimes/struct-lifetimes.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"In the above example, the annotation on `Highlight` enforces that the data " -"underlying the contained `&str` lives at least as long as any instance of " -"`Highlight` that uses that data." +"// expert writes for newcomers\n" +"/// Prepares the Mid-level IR (MIR) for borrow checking. \n" +"/// \n" +"/// The borrow checker operates on a simplified, \"canonical\" form of the MIR. \n" +"/// This function performs that transformation. It is a prerequisite for the \n" +"/// final stages of code generation. \n" +"/// \n" +"/// For more about Rust's intermediate representations, see the \n" +"/// [rustc-dev-guide](https://rustc-dev-guide.rust-lang.org/mir/index.html). \n" msgstr "" -"Dans l'exemple ci-dessus, l'annotation sur `Highlight` impose que les " -"données sous-jacentes au `&str` contenu vivent au moins aussi longtemps que " -"toute instance de `Highlight` qui utilise ces données." -#: src/lifetimes/struct-lifetimes.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"If `text` is consumed before the end of the lifetime of `fox` (or `dog`), " -"the borrow checker throws an error." +"Background: The [curse of knowledge](https://en.wikipedia.org/wiki/Curse_of_knowledge) is " +"a cognitive bias where experts assume that others have the same level of expertise and " +"perspective." msgstr "" -"Si `text` est consommé avant la fin de la durée de vie de `fox` (ou `dog`), " -"le vérificateur d'emprunt génère une erreur." -#: src/lifetimes/struct-lifetimes.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"Types with borrowed data force users to hold on to the original data. This " -"can be useful for creating lightweight views, but it generally makes them " -"somewhat harder to use." +"Motivation: Your reader does not have the same level of expertise and the same " +"perspective as you. Don't write for people like yourself, write for others." msgstr "" -"Les types avec des données empruntées obligent les utilisateurs à conserver " -"les données d'origine. Cela peut être utile pour créer des vues légères, " -"mais cela les rend généralement un peu plus difficiles à utiliser." -#: src/lifetimes/struct-lifetimes.md -#, fuzzy -msgid "When possible, make data structures own their data directly." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md +msgid "" +"Unintentionally writing for yourself can lead to people not understanding a point you're " +"trying to make or the concept you're trying to articulate." msgstr "" -"Dans la mesure du possible, faites en sorte que les structures de données " -"soient directement propriétaires de leurs données." -#: src/lifetimes/struct-lifetimes.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"Some structs with multiple references inside can have more than one lifetime " -"annotation. This can be necessary if there is a need to describe lifetime " -"relationships between the references themselves, in addition to the lifetime " -"of the struct itself. Those are very advanced use cases." +"Imagine a version of you, or others you've known, struggling to find practical " +"information while going through documentation." msgstr "" -"Certaines structures contenant plusieurs références peuvent avoir plusieurs " -"annotations de durée de vie. Cela peut être nécessaire s'il est nécessaire " -"de décrire les relations de durée de vie entre les références elles-mêmes, " -"en plus de la durée de vie de la structure elle-même. Ce sont des cas " -"d'utilisation très avancés." -#: src/lifetimes/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"In this exercise, you will build a parser for the [protobuf binary encoding]" -"(https://protobuf.dev/programming-guides/encoding/). Don't worry, it's " -"simpler than it seems! This illustrates a common parsing pattern, passing " -"slices of data. The underlying data itself is never copied." +"Keep this idea of a person in mind when thinking about what areas of a codebase need " +"attention for doc comments." msgstr "" -#: src/lifetimes/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"Fully parsing a protobuf message requires knowing the types of the fields, " -"indexed by their field numbers. That is typically provided in a `proto` " -"file. In this exercise, we'll encode that information into `match` " -"statements in functions that get called for each field." +"Also imagine a version of you, or others you've known, who is struggling to find the " +"important details in winding, extensive doc comments. Don't give too much information." msgstr "" -#: src/lifetimes/exercise.md -#, fuzzy -msgid "We'll use the following proto:" -msgstr "Vous pouvez utiliser le fichier `Cargo.toml` suivant :" - -#: src/lifetimes/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"A proto message is encoded as a series of fields, one after the next. Each " -"is implemented as a \"tag\" followed by the value. The tag contains a field " -"number (e.g., `2` for the `id` field of a `Person` message) and a wire type " -"defining how the payload should be determined from the byte stream." +"Always ask: Is this documentation making it difficult for the API user? Are they able to " +"quickly grasp what they need or find out where they could need it?" msgstr "" -#: src/lifetimes/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/who-are-you-writing-for.md msgid "" -"Integers, including the tag, are represented with a variable-length encoding " -"called VARINT. Luckily, `parse_varint` is defined for you below. The given " -"code also defines callbacks to handle `Person` and `PhoneNumber` fields, and " -"to parse a message into a series of calls to those callbacks." +"Always consider: Experts also read API level documentation. Doc comments might not be the " +"right place to educate your audience about the basics of your domain. In that case, " +"signpost and name-drop. Divert people to long-form documentation." msgstr "" -#: src/lifetimes/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "Library vs application docs" +msgstr "" + +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md msgid "" -"What remains for you is to implement the `parse_field` function and the " -"`ProtoMessage` trait for `Person` and `PhoneNumber`." +"You might see elaborate documentation for fundamental APIs that repeats the names and " +"type signatures. Stable and highly reusable code can afford this with a positive RoI." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "\"Invalid varint\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +#, fuzzy +msgid "Library code:" +msgstr "Bibliothèque" + +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "has a high number of users," msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "\"Invalid wire-type\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "solves a whole range of related problems," msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "\"Unexpected EOF\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "often has stable APIs." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "\"Invalid length\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +#, fuzzy +msgid "Application code is the opposite:" +msgstr "Processeurs d'applications" + +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "few users," msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "\"Unexpected wire-type)\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "solves a specific problem," msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "\"Invalid string (not UTF-8)\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "changes often." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "/// A wire type as seen on the wire.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "" +"You might have seen elaborate documentation that repeats code, looks at the same API " +"multiple times with many examples and case studies. Context is key: who wrote it, for " +"whom, and what material it is covering, and what resources did they have." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "/// The Varint WireType indicates the value is a single VARINT.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md +msgid "" +"Fundamental library code often has Elaborate documentation, for example, the standard " +"library, highly reusable frameworks like serde and tokio. Teams responsible for this code " +"often have appropriate resources to write and maintain elaborate documentation." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md msgid "" -"//I64, -- not needed for this exercise\n" -" /// The Len WireType indicates that the value is a length represented as " -"a\n" -" /// VARINT followed by exactly that number of bytes.\n" +"Library code is often stable, so the community is going to extract a significant benefit " +"from elaborate documentation before it needs to be reworked." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/library-vs-application-docs.md msgid "" -"/// The I32 WireType indicates that the value is precisely 4 bytes in\n" -" /// little-endian order containing a 32-bit signed integer.\n" +"Application code has the opposite traits: it has few users, solves a specific problem, " +"and changes often. For application code elaborate documentation quickly becomes outdated " +"and misleading. It is also difficult to extract a positive RoI from boilerplate docs even " +"while they are up to date, because there are only a few users." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "/// A field's value, typed based on the wire type.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "The Anatomy of a Doc Comment" msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "//I64(i64), -- not needed for this exercise\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "A brief, one-sentence summary." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "/// A field, containing the field number and its value.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "A more detailed explanation." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "//1 => WireType::I64, -- not needed for this exercise\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "Special sections: code examples, panics, errors, safety preconditions." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md msgid "" -"/// Parse a VARINT, returning the parsed value and the remaining bytes.\n" +"/// Parses a key-value pair from a string.\n" +"///\n" +"/// The input string must be in the format `key=value`. Everything before the\n" +"/// first '=' is treated as the key, and everything after is the value.\n" +"///\n" +"/// # Examples\n" +"///\n" +"/// ```\n" +"/// use my_crate::parse_key_value;\n" +"/// let (key, value) = parse_key_value(\"lang=rust\").unwrap();\n" +"/// assert_eq!(key, \"lang\");\n" +"/// assert_eq!(value, \"rust\");\n" +"/// ```\n" +"///\n" +"/// # Panics\n" +"///\n" +"/// Panics if the input is empty.\n" +"///\n" +"/// # Errors\n" +"///\n" +"/// Returns a `ParseError::Malformed` if the string does not contain `=`.\n" +"///\n" +"/// # Safety\n" +"///\n" +"/// Triggers undefined behavior if...\n" msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md msgid "" -"// This is the last byte of the VARINT, so convert it to\n" -" // a u64 and return it.\n" +"Idiomatic Rust doc comments follow a conventional structure that makes them easier for " +"developers to read." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "// More than 7 bytes is invalid.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "" +"The first line of a doc comment is a single-sentence summary of the function. Keep it " +"concise. `rustdoc` and other tools have a strong expectation about that: it is used as a " +"short summary in module-level documentation and search results." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "/// Convert a tag into a field number and a WireType.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "" +"Next, you can provide a long, multi-paragraph description of the \"why\" and \"what\" of " +"the function. Use Markdown." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md -msgid "/// Parse a field, returning the remaining bytes\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "" +"Finally, you can use top-level section headers to organize your content. Doc comments " +"commonly use `# Examples`, `# Panics`, `# Errors`, and `# Safety` as section titles. The " +"Rust community expects to see relevant aspects of your API documented in these sections." msgstr "" -#: src/lifetimes/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md msgid "" -"\"Based on the wire type, build a Field, consuming as many bytes as " -"necessary.\"" +"Rust heavily focuses on safety and correctness. Documenting behavior of your code in case " +"of errors is critical for writing reliable software." msgstr "" -#: src/lifetimes/exercise.md -msgid "\"Return the field, and any un-consumed bytes.\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "" +"`# Panics`: If your function may panic, you must document the specific conditions when " +"that might happen. Callers need to know what to avoid." msgstr "" -#: src/lifetimes/exercise.md src/lifetimes/solution.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md msgid "" -"/// Parse a message in the given data, calling `T::add_field` for each field " -"in\n" -"/// the message.\n" -"///\n" -"/// The entire input is consumed.\n" +"`# Errors`: For functions returning a `Result`, this section explains what kind of errors " +"can occur and under what circumstances. Callers need this information to write robust " +"error handling logic." msgstr "" -#: src/lifetimes/exercise.md -msgid "// TODO: Implement ProtoMessage for Person and PhoneNumber.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "" +"**Question:** Ask the class why documenting panics is so important in a language that " +"prefers returning `Result`." msgstr "" -#: src/lifetimes/solution.md -msgid "// Unwrap error because `value` is definitely 4 bytes long.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "" +"**Answer:** Panics are for unrecoverable, programming errors. A library should not panic " +"unless a contract is violated by the caller. Documenting these contracts is essential." msgstr "" -#: src/lifetimes/solution.md -msgid "// skip everything else\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/anatomy-of-a-doc-comment.md +msgid "" +"`# Safety` comments document safety preconditions on unsafe functions that must be " +"satisfied, or else undefined behavior might result. They are discussed in detail in the " +"Unsafe Rust deep dive." msgstr "" -#: src/lifetimes/solution.md -msgid "b\"hello\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "Name-dropping keywords and signposting topics" msgstr "" -#: src/welcome-day-4.md -#, fuzzy -msgid "Welcome to Day 4" -msgstr "Bienvenue au jour 1" - -#: src/welcome-day-4.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"Today we will cover topics relating to building large-scale software in Rust:" -msgstr "Aujourd'hui, nous aborderons quelques sujets plus avancés de Rust :" - -#: src/welcome-day-4.md -msgid "Iterators: a deep dive on the `Iterator` trait." +"/// A parsed representation of a MARC 21 record\n" +"/// [leader](//www.loc.gov/marc/bibliographic/bdleader.html). \n" +"/// A MARC leader contains metadata that dictates how to interpret the rest \n" +"/// of the record.\n" msgstr "" -#: src/welcome-day-4.md -msgid "Modules and visibility." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "" +"/// Determines the schema and the set of valid subsequent data fields. \n" +" ///\n" +" /// Encoded in byte 6 of the leader. \n" msgstr "" -#: src/welcome-day-4.md -#, fuzzy -msgid "Testing." -msgstr "Tester" - -#: src/welcome-day-4.md -#, fuzzy -msgid "Error handling: panics, `Result`, and the try operator `?`." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "" +"/// Indicates whether to parse relationship fields, such as a \"773 Host \n" +" /// Item Entry\" for an article within a larger work. \n" +" /// \n" +" /// Encoded in byte 7 of the leader. \n" msgstr "" -"Gestion des erreurs : paniques, « Résultat » et l'opérateur d'essai « ? »." -#: src/welcome-day-4.md -msgid "" -"Unsafe Rust: the escape hatch when you can't express yourself in safe Rust." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "// ... other fields\n" msgstr "" -#: src/iterators/iterator.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"The [`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) " -"trait supports iterating over values in a collection. It requires a `next` " -"method and provides lots of methods. Many standard library types implement " -"`Iterator`, and you can implement it yourself, too:" +"/// Parses the [leader of a MARC 21 record](https://www.loc.gov/marc/bibliographic/" +"bdleader.html). \n" +"/// \n" +"/// The leader is encoded as a fixed-length 24-byte field, containing metadata \n" +"/// that determines the semantic interpretation of the rest of the record. \n" msgstr "" -#: src/iterators/iterator.md -msgid "\"fib({i}): {n}\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "" +"Motivation: Readers of documentation will not be closely reading most of your doc " +"comments like they would dialogue in a novel they love." msgstr "" -#: src/iterators/iterator.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"The `Iterator` trait implements many common functional programming " -"operations over collections (e.g. `map`, `filter`, `reduce`, etc). This is " -"the trait where you can find all the documentation about them. In Rust these " -"functions should produce the code as efficient as equivalent imperative " -"implementations." +"Users will most likely be skimming and scan-reading to find the part of the documentation " +"that is relevant to whatever problem they're trying to solve in the moment." msgstr "" -"Le trait `Iterator` implémente de nombreuses opérations de programmation " -"fonctionnelles courantes sur les collections (par exemple, `map`, `filter`, " -"`reduce`, etc.). C'est le trait où vous pouvez trouver toute la " -"documentation à propos d'eux. Dans Rust, ces fonctions devraient produire le " -"code aussi efficace que l'impératif équivalent implémentations." -#: src/iterators/iterator.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"`IntoIterator` is the trait that makes for loops work. It is implemented by " -"collection types such as `Vec` and references to them such as `&Vec` " -"and `&[T]`. Ranges also implement it. This is why you can iterate over a " -"vector with `for i in some_vec { .. }` but `some_vec.next()` doesn't exist." +"Once a user has found a keyword or potential signpost that's relevant to them they will " +"begin to search for context surrounding what is being documented." msgstr "" -"`IntoIterator` est le trait qui fait fonctionner les boucles. Il est " -"implémenté par des types de collection tels que `Vec` et leurs références " -"telles que `&Vec` et `&[T]`. Les gammes l'implémentent également. C'est " -"pourquoi vous pouvez itérer sur un vecteur avec `for i in some_vec { .. }` " -"mais `some_vec.next()` n'existe pas." -#: src/iterators/intoiterator.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"The `Iterator` trait tells you how to _iterate_ once you have created an " -"iterator. The related trait [`IntoIterator`](https://doc.rust-lang.org/std/" -"iter/trait.IntoIterator.html) defines how to create an iterator for a type. " -"It is used automatically by the `for` loop." +"Ask the class: What do you look for in documentation? Focus on the moment-to-moment " +"searching for information here, not general values in documentation." msgstr "" -"Le trait `Iterator` vous indique comment _itérer_ une fois que vous avez " -"créé un itérateur. Le trait connexe \"IntoIterator\" vous indique comment " -"créer l'itérateur :" -#: src/iterators/intoiterator.md -msgid "\"point = {x}, {y}\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "Name-drop keywords close to the beginning of a paragraph." msgstr "" -#: src/iterators/intoiterator.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"Click through to the docs for `IntoIterator`. Every implementation of " -"`IntoIterator` must declare two types:" +"This aids skimming and scanning, as the first few words of a paragraph stand out the most." msgstr "" -"La syntaxe ici signifie que chaque implémentation de `IntoIterator` doit " -"déclarer deux types :" - -#: src/iterators/intoiterator.md -#, fuzzy -msgid "`Item`: the type to iterate over, such as `i8`," -msgstr "`Item` : le type sur lequel nous itérons, tel que `i8`," - -#: src/iterators/intoiterator.md -#, fuzzy -msgid "`IntoIter`: the `Iterator` type returned by the `into_iter` method." -msgstr "`IntoIter` : le type `Iterator` renvoyé par la méthode `into_iter`." -#: src/iterators/intoiterator.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"Note that `IntoIter` and `Item` are linked: the iterator must have the same " -"`Item` type, which means that it returns `Option`" +"Skimming and scanning lets users quickly navigate a text, keeping keywords as close to " +"the beginning of a paragraph as possible lets a user determine if they've found relevant " +"information faster." msgstr "" -"Notez que `IntoIter` et `Item` sont liés : l'itérateur doit avoir le même " -"Type `Item`, ce qui signifie qu'il renvoie `Option`" -#: src/iterators/intoiterator.md -msgid "The example iterates over all combinations of x and y coordinates." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "Signpost, but don't over-explain." msgstr "" -#: src/iterators/intoiterator.md -msgid "" -"Try iterating over the grid twice in `main`. Why does this fail? Note that " -"`IntoIterator::into_iter` takes ownership of `self`." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "Users will not necessarily have the same domain expertise as an API designer." msgstr "" -#: src/iterators/intoiterator.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"Fix this issue by implementing `IntoIterator` for `&Grid` and storing a " -"reference to the `Grid` in `GridIter`." +"If a tangential, specialist term or acronym is mentioned try to bring in enough context " +"such that a novice could quickly do more research." msgstr "" -#: src/iterators/intoiterator.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"The same problem can occur for standard library types: `for e in " -"some_vector` will take ownership of `some_vector` and iterate over owned " -"elements from that vector. Use `for e in &some_vector` instead, to iterate " -"over references to elements of `some_vector`." +"Signposting often happens organically, consider a networking library that mentions " +"various protocols. But when it doesn't happen organically, it can be difficult to choose " +"what to mention." msgstr "" -#: src/iterators/fromiterator.md -msgid "FromIterator" -msgstr "FromIterator" - -#: src/iterators/fromiterator.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md msgid "" -"[`FromIterator`](https://doc.rust-lang.org/std/iter/trait.FromIterator.html) " -"lets you build a collection from an [`Iterator`](https://doc.rust-lang.org/" -"std/iter/trait.Iterator.html)." +"Rule of thumb: API developers should be asking themselves \"if a novice ran into what " +"they are documenting, what sources would they look up and are there any red herrings they " +"might end up following\"?" msgstr "" -"[`FromIterator`](https://doc.rust-lang.org/std/iter/trait.FromIterator.html) " -"vous permet de créer une collection à partir d'un [`Iterator`](https://doc." -"rust-lang.org/std/iter/trait.Iterator.html)." -#: src/iterators/fromiterator.md -msgid "\"prime_squares: {prime_squares:?}\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "Users should be given enough information to look up subjects on their own." msgstr "" -#: src/iterators/fromiterator.md -#, fuzzy -msgid "`Iterator` implements" -msgstr "`Itérateur`" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/name-drop-signpost.md +msgid "" +"What we've already covered, predictability of an API including the naming conventions, is " +"a form of signposting." +msgstr "" -#: src/iterators/fromiterator.md -msgid "There are two ways to specify `B` for this method:" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "Avoiding Redundancy" msgstr "" -#: src/iterators/fromiterator.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"With the \"turbofish\": `some_iterator.collect::()`, as " -"shown. The `_` shorthand used here lets Rust infer the type of the `Vec` " -"elements." +"Names and type signatures communicate a lot of information, don't repeat it in comments!" msgstr "" -#: src/iterators/fromiterator.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"With type inference: `let prime_squares: Vec<_> = some_iterator.collect()`. " -"Rewrite the example to use this form." +"// Repeats name/type information. Can omit!\n" +"/// Parses an ipv4 from a str. Returns an option for failure modes.\n" msgstr "" -#: src/iterators/fromiterator.md -#, fuzzy -msgid "" -"There are basic implementations of `FromIterator` for `Vec`, `HashMap`, etc. " -"There are also more specialized implementations which let you do cool things " -"like convert an `Iterator>` into a `Result, E>`." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "// Repeats information obvious from the field name. Can omit!\n" msgstr "" -"Il existe également des implémentations qui vous permettent de faire des " -"choses sympas comme convertir un `Iterator>` en un " -"`Result, E>`." -#: src/iterators/exercise.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "/// The customer id.\n" +msgstr "" + +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"In this exercise, you will need to find and use some of the provided methods " -"in the [`Iterator`](https://doc.rust-lang.org/std/iter/trait.Iterator.html) " -"trait to implement a complex calculation." +"// Mentions the type name first thing, don't do this!\n" +"/// `ServerSynchronizer` is an orchestrator that sends local edits [...]\n" msgstr "" -"Vous pouvez implémenter le trait [`Iterator`](https://doc.rust-lang.org/std/" -"iter/trait.Iterator.html) sur vos propres types :" -#: src/iterators/exercise.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"Copy the following code to and make the tests " -"pass. Use an iterator expression and `collect` the result to construct the " -"return value." +"// Better! Focuses on purpose.\n" +"/// Sends local edits [...]\n" msgstr "" -"Copiez le code suivant sur et faites les tests " -"passer. Essayez d'éviter d'attribuer un \"Vec\" à vos résultats " -"intermédiaires :" -#: src/iterators/exercise.md src/iterators/solution.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"/// Calculate the differences between elements of `values` offset by " -"`offset`,\n" -"/// wrapping around from the end of `values` to the beginning.\n" -"///\n" -"/// Element `n` of the result is `values[(n+offset)%len] - values[n]`.\n" +"// Mentions the function name first thing, don't do this!\n" +"/// `sync_to_server` sends local edits [...]\n" msgstr "" -#: src/modules/modules.md -#, fuzzy -msgid "We have seen how `impl` blocks let us namespace functions to a type." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"// Better! Focuses on function.\n" +"/// Sends local edits [...]\n" msgstr "" -"Nous avons vu comment les blocs `impl` nous permettent de faire fonctionner " -"l'espace de noms sur un type." -#: src/modules/modules.md -#, fuzzy -msgid "Similarly, `mod` lets us namespace types and functions:" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"Motivation: Documentation that merely repeats name/signature information provides nothing " +"new to the API user." msgstr "" -"De même, `mod` nous permet d'utiliser des types et des fonctions d'espace de " -"noms :" -#: src/modules/modules.md -msgid "\"In the foo module\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"Additionally, signature information may change over time without the documentation being " +"updated accordingly!" msgstr "" -#: src/modules/modules.md -msgid "\"In the bar module\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "This is an understandable pattern to fall into!" msgstr "" -#: src/modules/modules.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"Packages provide functionality and include a `Cargo.toml` file that " -"describes how to build a bundle of 1+ crates." +"Naive approach to \"always document your code,\" follows this advice literally but does " +"not follow the intent." msgstr "" -"Les packages fournissent des fonctionnalités et incluent un fichier `Cargo." -"toml` qui décrit comment créer un ensemble de 1+ caisses." -#: src/modules/modules.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"Crates are a tree of modules, where a binary crate creates an executable and " -"a library crate compiles to a library." +"Some tools might enforce documentation coverage, this kind of documentation is an easy " +"fix." msgstr "" -"Les caisses sont un arbre de modules, où une caisse binaire crée un " -"exécutable et une caisse de bibliothèque se compile en une bibliothèque." -#: src/modules/modules.md -#, fuzzy -msgid "Modules define organization, scope, and are the focus of this section." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "Be aware of the purpose of different modes of documentation:" msgstr "" -"Les modules définissent l'organisation, la portée et sont au centre de cette " -"section." -#: src/modules/filesystem.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"Omitting the module content will tell Rust to look for it in another file:" +"Library code will need to be documented in ways that understand the scope of what it is " +"used for and the breadth of people who are trying to use it." msgstr "" -#: src/modules/filesystem.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"This tells rust that the `garden` module content is found at `src/garden." -"rs`. Similarly, a `garden::vegetables` module can be found at `src/garden/" -"vegetables.rs`." +"Application code has a more narrow purpose, it can afford to be more simple and direct." msgstr "" -#: src/modules/filesystem.md -#, fuzzy -msgid "The `crate` root is in:" -msgstr "La racine `crate` se trouve dans :" - -#: src/modules/filesystem.md -#, fuzzy -msgid "`src/lib.rs` (for a library crate)" -msgstr "`src/lib.rs` (pour une caisse de bibliothèque)" - -#: src/modules/filesystem.md -#, fuzzy -msgid "`src/main.rs` (for a binary crate)" -msgstr "`src/main.rs` (pour un crate binaire)" - -#: src/modules/filesystem.md -#, fuzzy -msgid "" -"Modules defined in files can be documented, too, using \"inner doc " -"comments\". These document the item that contains them -- in this case, a " -"module." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "The name of an item is part of the documentation of that item." msgstr "" -"Les modules définis dans les fichiers peuvent également être documentés à " -"l'aide de \"commentaires de documentation internes\". Ceux-ci documentent " -"l'élément qui les contient -- dans ce cas, un module." -#: src/modules/filesystem.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"//! This module implements the garden, including a highly performant " -"germination\n" -"//! implementation.\n" +"Similarly, the signature of a function is part of the documentation of that function." msgstr "" -#: src/modules/filesystem.md -msgid "// Re-export types from this module.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"Therefore: Some aspects of the item are already covered when you start writing doc " +"comments!" msgstr "" -#: src/modules/filesystem.md -msgid "/// Sow the given seed packets.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "Do not repeat information for the sake of an itemized list." msgstr "" -#: src/modules/filesystem.md -msgid "/// Harvest the produce in the garden that is ready.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"Many areas of the standard library have minimal documentation because the name and types " +"do give enough information." msgstr "" -#: src/modules/filesystem.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"Before Rust 2018, modules needed to be located at `module/mod.rs` instead of " -"`module.rs`, and this is still a working alternative for editions after 2018." +"Rule of Thumb: What information is missing from a user's perspective? Other than name, " +"signature, and irrelevant details of the implementation." msgstr "" -#: src/modules/filesystem.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"The main reason to introduce `filename.rs` as alternative to `filename/mod." -"rs` was because many files named `mod.rs` can be hard to distinguish in IDEs." +"Don't explain the basics of Rust or the standard library. Assume the reader of doc " +"comments has an intermediate understanding of the language itself. Focus on documenting " +"your API." msgstr "" -#: src/modules/filesystem.md -msgid "Deeper nesting can use folders, even if the main module is a file:" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"For example, if your function returns `Result`, you don't need to explain how `Result` or " +"the question mark operators work." msgstr "" -#: src/modules/filesystem.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"The place rust will look for modules can be changed with a compiler " -"directive:" +"If there is a complex topic involved with the functions and types you're documenting, " +"signpost to a \"source of truth\" if one exists such as an internal document, a paper, a " +"blog post etc." msgstr "" -#: src/modules/filesystem.md -msgid "\"some/path.rs\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"Collaborate with Students: Go through the methods in the slide and discuss what might be " +"relevant to an API user." msgstr "" -#: src/modules/filesystem.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md msgid "" -"This is useful, for example, if you would like to place tests for a module " -"in a file named `some_module_test.rs`, similar to the convention in Go." +"The `#![warn(missing_docs)]` lint can be helpful for enforcing the existence of doc " +"comments, but puts a large burden on developers that could lead to leaning onto these " +"patterns of writing low-quality comments." msgstr "" -#: src/modules/visibility.md -#, fuzzy -msgid "Modules are a privacy boundary:" -msgstr "Les modules sont une limite de confidentialité :" - -#: src/modules/visibility.md -#, fuzzy -msgid "Module items are private by default (hides implementation details)." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/avoid-redundancy.md +msgid "" +"This kind of lint should only be enabled if the people maintaining a project can afford " +"to keep up with its demands, and usually only for library-style crates rather than " +"application code." msgstr "" -"Les éléments du module sont privés par défaut (cache les détails " -"d'implémentation)." -#: src/modules/visibility.md -#, fuzzy -msgid "Parent and sibling items are always visible." -msgstr "Les éléments parents et frères sont toujours visibles." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "Names and Signatures are not full documentation" +msgstr "" -#: src/modules/visibility.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md msgid "" -"In other words, if an item is visible in module `foo`, it's visible in all " -"the descendants of `foo`." +"// bad\n" +"/// Returns a future that resolves when operation completes. \n" msgstr "" -"En d'autres termes, si un élément est visible dans le module `foo`, il est " -"visible dans tous les descendants de `foo`." -#: src/modules/visibility.md -msgid "\"outer::private\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"// good\n" +"/// Sends local edits to the server, overwriting concurrent edits \n" +"/// if any happened. \n" msgstr "" -#: src/modules/visibility.md -msgid "\"outer::public\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"// bad\n" +"/// Returns an error if sending the email fails. \n" msgstr "" -#: src/modules/visibility.md -msgid "\"outer::inner::private\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"// good\n" +"/// Queues the email for background delivery and returns immediately. \n" +"/// Returns an error immediately if the email is malformed. \n" msgstr "" -#: src/modules/visibility.md -msgid "\"outer::inner::public\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"Motivation: API designers can over-commit to the idea that a function name and signature " +"is enough documentation." msgstr "" -#: src/modules/visibility.md -#, fuzzy -msgid "Use the `pub` keyword to make modules public." -msgstr "Utilisez le mot-clé `pub` pour rendre les modules publics." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "It's better than nothing, but it's worse than good documentation." +msgstr "" -#: src/modules/visibility.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md msgid "" -"Additionally, there are advanced `pub(...)` specifiers to restrict the scope " -"of public visibility." +"Again, names and types are _part_ of the documentation. They are not always the full " +"story!" msgstr "" -"De plus, il existe des spécificateurs avancés `pub(...)` pour restreindre la " -"portée de la visibilité publique." -#: src/modules/visibility.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md msgid "" -"See the [Rust Reference](https://doc.rust-lang.org/reference/visibility-and-" -"privacy.html#pubin-path-pubcrate-pubsuper-and-pubself)." +"Consider the behavior of functions that are not covered by the name, parameter names, or " +"signature of that function." msgstr "" -"Voir la [Rust Reference](https://doc.rust-lang.org/reference/visibility-and-" -"privacy.html#pubin-path-pubcrate-pubsuper-and-pubself)." -#: src/modules/visibility.md -#, fuzzy -msgid "Configuring `pub(crate)` visibility is a common pattern." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"In the example on the slide it is not obvious that `sync_to_server()` could overwrite " +"something (leading to a data loss), so document that." msgstr "" -"La configuration de la visibilité de `pub(crate)` est un modèle courant." -#: src/modules/visibility.md -#, fuzzy -msgid "Less commonly, you can give visibility to a specific path." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"In the email example, it is not obvious that the function can return success and still " +"fail to deliver the email." msgstr "" -"Plus rarement, vous pouvez donner de la visibilité à un chemin spécifique." -#: src/modules/visibility.md -#, fuzzy +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md msgid "" -"In any case, visibility must be granted to an ancestor module (and all of " -"its descendants)." +"Use comments to disambiguate. Nuanced behaviors, behaviors that users of an API could " +"trip up on, should be documented." msgstr "" -"Dans tous les cas, la visibilité doit être accordée à un module ancêtre (et " -"à tous ses descendants)." -#: src/modules/paths.md -msgid "use, super, self" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"For example, consider a remove() method on a business entity: There are many ways to " +"remove an entity!" msgstr "" -#: src/modules/paths.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md msgid "" -"A module can bring symbols from another module into scope with `use`. You " -"will typically see something like this at the top of each module:" +"Is it removing the entity from the database? From the parent collection in memory (unlink " +"vs erase)?" msgstr "" -#: src/modules/paths.md -msgid "Paths" -msgstr "Chemins" - -#: src/modules/paths.md -#, fuzzy -msgid "Paths are resolved as follows:" -msgstr "Les chemins sont résolus comme suit :" - -#: src/modules/paths.md -#, fuzzy -msgid "As a relative path:" -msgstr "En tant que chemin relatif :" - -#: src/modules/paths.md -#, fuzzy -msgid "`foo` or `self::foo` refers to `foo` in the current module," -msgstr "`foo` ou `self::foo` fait référence à `foo` dans le module actuel," +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-isnt-docs.md +msgid "" +"If it is removing the data in the database, is the data actually being deleted, or merely " +"marked as deleted, but still recoverable (soft vs hard delete)?" +msgstr "" -#: src/modules/paths.md -#, fuzzy -msgid "`super::foo` refers to `foo` in the parent module." -msgstr "`super::foo` fait référence à `foo` dans le module parent." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +msgid "Why and What, not How and Where" +msgstr "" -#: src/modules/paths.md -#, fuzzy -msgid "As an absolute path:" -msgstr "En tant que chemin absolu :" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +msgid "Avoid documenting irrelevant details that may frequently change." +msgstr "" -#: src/modules/paths.md -#, fuzzy -msgid "`crate::foo` refers to `foo` in the root of the current crate," -msgstr "`crate::foo` fait référence à `foo` à la racine du crate actuel," +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/exercise.md +msgid "/// Sorts a slice. Implemented using recursive quicksort.\n" +msgstr "" -#: src/modules/paths.md -#, fuzzy -msgid "`bar::foo` refers to `foo` in the `bar` crate." -msgstr "`bar::foo` fait référence à `foo` dans le crate `bar`." +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "/* ... */" +msgstr "" -#: src/modules/paths.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"It is common to \"re-export\" symbols at a shorter path. For example, the " -"top-level `lib.rs` in a crate might have" +"// bad\n" +"/// Saves a `User` record to the Postgres database. \n" +"/// \n" +"/// This function opens a new connection and begins a transaction. It checks \n" +"/// if a user with the given ID exists with a `SELECT` query. If a user is \n" +"/// not found, performs an `INSERT`. \n" +"/// \n" +"/// # Errors \n" +"/// \n" +"/// Returns an error if any database operation fails. \n" msgstr "" -#: src/modules/paths.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"making `DiskStorage` and `NetworkStorage` available to other crates with a " -"convenient, short path." +"// good\n" +"/// Atomically saves a user record. \n" +"/// \n" +"/// # Errors \n" +"/// \n" +"/// Returns a `db::Error::DuplicateUsername` error if the user (keyed by \n" +"/// `user.username` field) already exists. \n" msgstr "" -#: src/modules/paths.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"For the most part, only items that appear in a module need to be `use`'d. " -"However, a trait must be in scope to call any methods on that trait, even if " -"a type implementing that trait is already in scope. For example, to use the " -"`read_to_string` method on a type implementing the `Read` trait, you need to " -"`use std::io::Read`." +"Motivation: Users want to know the contract of the API (what is guaranteed about this " +"function), rather than implementation details." msgstr "" -#: src/modules/paths.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"The `use` statement can have a wildcard: `use std::io::*`. This is " -"discouraged because it is not clear which items are imported, and those " -"might change over time." +"Motivation: Doc comments that explain implementation details become outdated faster than " +"comments that explain the contract." msgstr "" -#: src/modules/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"In this exercise, you will reorganize a small GUI Library implementation. " -"This library defines a `Widget` trait and a few implementations of that " -"trait, as well as a `main` function." +"Internal information is likely irrelevant to a user. Imagine explaining in a doc comment " +"for a function that you're using for loops to solve a problem, what is the point of this " +"information?" msgstr "" -#: src/modules/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"It is typical to put each type or set of closely-related types into its own " -"module, so each widget type should get its own module." +"Consider the `sort_quickly` function above. Its documentation calls out that it uses " +"quicksort, but is this necessary?" msgstr "" -#: src/modules/exercise.md -#, fuzzy -msgid "Cargo Setup" -msgstr "Installation" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +msgid "" +"It could be that another sorting function is used in the future, if that were the case " +"then this comment would need to be updated too. This is a point of failure in " +"documentation." +msgstr "" -#: src/modules/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"The Rust playground only supports one file, so you will need to make a Cargo " -"project on your local filesystem:" +"It could be that the implementation is necessary to explain, but this is likely due to " +"whatever effects or invariants the user of that API needs to be aware of instead." msgstr "" -#: src/modules/exercise.md +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md msgid "" -"Edit the resulting `src/main.rs` to add `mod` statements, and add additional " -"files in the `src` directory." +"Focus on those effects and invariants instead of instead of the implementation details " +"themselves." msgstr "" -#: src/modules/exercise.md -msgid "Source" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +msgid "" +"Reiterate: Implementation details can and will change, so do not explain these details." msgstr "" -#: src/modules/exercise.md -msgid "Here's the single-module implementation of the GUI library:" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +msgid "Don't talk about where something is used for the sake of it." msgstr "" -#: src/modules/exercise.md src/modules/solution.md -msgid "/// Natural width of `self`.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +msgid "This is another instance where this information can become stale quickly." msgstr "" -#: src/modules/exercise.md src/modules/solution.md -msgid "/// Draw the widget into a buffer.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/what-why-not-how-where.md +msgid "" +"Focus on what the function does (not how it is implemented) for a user trying to reach " +"this practical information as quickly as possible." msgstr "" -#: src/modules/exercise.md src/modules/solution.md -msgid "/// Draw the widget on standard output.\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/exercise.md +#, fuzzy +msgid "Exercise: Dialog on Details" +msgstr "Statistiques de santé" + +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/exercise.md +msgid "" +"Unnecessary details can sometimes be indicative of something that does need documentation." msgstr "" -#: src/modules/exercise.md src/modules/solution.md -msgid "\"{buffer}\"" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/exercise.md +msgid "" +"Consider the example here, we discussed in [what and why, not how and where](what-why-not-" +"how-where.md) that internal details are unlikely relevant to someone reading " +"documentation." msgstr "" -#: src/modules/exercise.md -msgid "// Add 4 paddings for borders\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/exercise.md +msgid "Here we're discussing a counterexample." msgstr "" -#: src/modules/exercise.md -msgid "" -"// TODO: Change draw_into to return Result<(), std::fmt::Error>. Then use " -"the\n" -" // ?-operator here instead of .unwrap().\n" +#: src/idiomatic/foundations-api-design/meaningful-doc-comments/exercise.md +msgid "Ask the class: Is this comment necessary for this function?" msgstr "" -#: src/modules/exercise.md src/modules/solution.md -msgid "\"+-{:-. Then use\n" -" // the ?-operator here instead of .unwrap().\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/get.md +msgid "Getting an element from a collection or container." msgstr "" -#: src/modules/solution.md -msgid "// ---- src/main.rs ----\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/get.md +msgid "Immutable by default, for the most part." msgstr "" -#: src/testing/unit-tests.md -msgid "Unit Tests" -msgstr "Tests unitaires" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/get.md +msgid "Should not panic. May return an option or result, depending on the framework." +msgstr "" -#: src/testing/unit-tests.md -#, fuzzy -msgid "Rust and Cargo come with a simple unit test framework:" -msgstr "Rust et Cargo sont livrés avec un cadre de test unitaire simple :" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/get.md +msgid "Not for fields!" +msgstr "" -#: src/testing/unit-tests.md -#, fuzzy -msgid "Unit tests are supported throughout your code." -msgstr "Les tests unitaires sont pris en charge dans tout votre code." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/get.md +msgid "" +"For private fields you don't want users to have direct, assign a method with a more " +"descriptive name (or the same name as the field) is preferred." +msgstr "" -#: src/testing/unit-tests.md -#, fuzzy -msgid "Integration tests are supported via the `tests/` directory." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/push.md +msgid "`push`" msgstr "" -"Les tests d'intégration sont pris en charge via le répertoire `tests/`." -#: src/testing/unit-tests.md -msgid "" -"Tests are marked with `#[test]`. Unit tests are often put in a nested " -"`tests` module, using `#[cfg(test)]` to conditionally compile them only when " -"building tests." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/push.md +msgid "Common on array-like structures." msgstr "" -#: src/testing/unit-tests.md -#, fuzzy -msgid "\"Hello World\"" -msgstr "Bonjour le monde!" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/push.md +msgid "Takes `self` by mutable reference." +msgstr "" -#: src/testing/unit-tests.md -#, fuzzy -msgid "This lets you unit test private helpers." -msgstr "Cela vous permet de tester unitairement les helpers privés." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/is.md +msgid "`is_[condition]`: Boolean Check" +msgstr "" -#: src/testing/unit-tests.md -#, fuzzy -msgid "The `#[cfg(test)]` attribute is only active when you run `cargo test`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/is.md +msgid "Check a condition about a datatype." msgstr "" -"L'attribut `#[cfg(test)]` n'est actif que lorsque vous lancez `cargo test`." -#: src/testing/unit-tests.md -msgid "Run the tests in the playground in order to show their results." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/is.md +msgid "`is` prefix is preferred over methods with `not` in the name." msgstr "" -#: src/testing/other.md -msgid "Integration Tests" -msgstr "Tests d'intégration" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/is.md +msgid "" +"There are no instances of `is_not_` in standard library methods, just use `!value." +"is_[condition]`." +msgstr "" -#: src/testing/other.md -#, fuzzy -msgid "If you want to test your library as a client, use an integration test." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/mut.md +msgid "`[method]_mut`: Mutable reference access" msgstr "" -"Si vous souhaitez tester votre bibliothèque en tant que client, utilisez un " -"test d'intégration." -#: src/testing/other.md -#, fuzzy -msgid "Create a `.rs` file under `tests/`:" -msgstr "Créez un fichier `.rs` sous `tests/` :" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/mut.md +msgid "Suffix for access-style methods." +msgstr "" -#: src/testing/other.md -msgid "// tests/my_library.rs\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/mut.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "// Simplified\n" msgstr "" -#: src/testing/other.md -#, fuzzy -msgid "These tests only have access to the public API of your crate." -msgstr "Ces tests n'ont accès qu'à l'API publique de votre crate." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/mut.md +msgid "Suffix that signifies the method gives access to a mutable reference." +msgstr "" -#: src/testing/other.md -msgid "Documentation Tests" -msgstr "Tests de documentation" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/mut.md +msgid "Requires mutable access to the value you're calling this method on." +msgstr "" -#: src/testing/other.md -#, fuzzy -msgid "Rust has built-in support for documentation tests:" -msgstr "Rust a un support intégré pour les tests de documentation :" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md +msgid "`with` as constructor" +msgstr "" -#: src/testing/other.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md msgid "" -"/// Shortens a string to the given length.\n" -"///\n" -"/// ```\n" -"/// # use playground::shorten_string;\n" -"/// assert_eq!(shorten_string(\"Hello World\", 5), \"Hello\");\n" -"/// assert_eq!(shorten_string(\"Hello World\", 20), \"Hello World\");\n" -"/// ```\n" +"`with` as a constructor sets one value among a type while using default values for the " +"rest." msgstr "" -#: src/testing/other.md -#, fuzzy -msgid "Code blocks in `///` comments are automatically seen as Rust code." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md +msgid "`with` as in \"`` with specific setting.\"" msgstr "" -"Les blocs de code dans les commentaires `///` sont automatiquement " -"considérés comme du code Rust." -#: src/testing/other.md -#, fuzzy -msgid "The code will be compiled and executed as part of `cargo test`." -msgstr "Le code sera compilé et exécuté dans le cadre du `cargo test`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md +msgid "// Initializes memory for at least N elements, len is still 0.\n" +msgstr "" -#: src/testing/other.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md msgid "" -"Adding `#` in the code will hide it from the docs, but will still compile/" -"run it." +"`with` can appear as a constructor prefix, most commonly when initializing heap memory " +"for container types." msgstr "" -#: src/testing/other.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md msgid "" -"Test the above code on the [Rust Playground](https://play.rust-lang.org/?" -"version=stable&mode=debug&edition=2021&gist=3ce2ad13ea1302f6572cb15cd96becf0)." +"In this case, it's distinct from `new` constructors because it specifies the value for " +"something that is not usually cared about by API users." msgstr "" -"Testez le code ci-dessus sur [Rust Playground](https://play.rust-lang.org/?" -"version=stable&mode=debug&edition=2021&gist=3ce2ad13ea1302f6572cb15cd96becf0)." -#: src/testing/lints.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md +msgid "Ask the class: Why not `from_capacity`?" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-constructor.md msgid "" -"The Rust compiler produces fantastic error messages, as well as helpful " -"built-in lints. [Clippy](https://doc.rust-lang.org/clippy/) provides even " -"more lints, organized into groups that can be enabled per-project." +"Answer: `Vec::with_capacity` as a method call scans well as creating a \"Vec with " +"capacity\". Consider how `Vec::new_capacity` or `Vec::from_capacity` scan when written " +"down, they do not communicate what's going on well." msgstr "" -#: src/testing/lints.md -msgid "\"X probably fits in a u16, right? {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-copy-setter.md +msgid "`with` as copy-and-set" msgstr "" -#: src/testing/lints.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-copy-setter.md +msgid "`with` appears when a value is being copied, but also changed in a specific way." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-copy-setter.md +msgid "`with` as in \"like ``, but with something different.\"" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-copy-setter.md msgid "" -"Run the code sample and examine the error message. There are also lints " -"visible here, but those will not be shown once the code compiles. Switch to " -"the Playground site to show those lints." +"// Simplified. \"/home/me/mortgage.pdf\".with_extension(\"mov\") =>\n" +" // \"/home/me/mortgage.mov\"\n" msgstr "" -#: src/testing/lints.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-copy-setter.md msgid "" -"After resolving the lints, run `clippy` on the playground site to show " -"clippy warnings. Clippy has extensive documentation of its lints, and adds " -"new lints (including default-deny lints) all the time." +"`with` can be used for methods that copy a value, but then change a specific part of that " +"value." msgstr "" -#: src/testing/lints.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-copy-setter.md msgid "" -"Note that errors or warnings with `help: ...` can be fixed with `cargo fix` " -"or via your editor." +"In the example here, `with_extension` copies the data of a `&Path` into a new `PathBuf`, " +"but changes the extension to something else." msgstr "" -#: src/testing/exercise.md -msgid "Luhn Algorithm" -msgstr "Algorithme de Luhn" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-copy-setter.md +msgid "The original `Path` is unchanged." +msgstr "" -#: src/testing/exercise.md -#, fuzzy -msgid "" -"The [Luhn algorithm](https://en.wikipedia.org/wiki/Luhn_algorithm) is used " -"to validate credit card numbers. The algorithm takes a string as input and " -"does the following to validate the credit card number:" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-closure.md +msgid "`with`: Working with Closures" msgstr "" -"L'[algorithme de Luhn](https://en.wikipedia.org/wiki/Luhn_algorithm) est " -"utilisé pour valider les numéros de carte de crédit. L'algorithme prend une " -"chaîne en entrée et fait le suivant pour valider le numéro de carte " -"bancaire :" -#: src/testing/exercise.md -#, fuzzy -msgid "Ignore all spaces. Reject number with fewer than two digits." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-closure.md +msgid "`with` as in \"do X, but with this specific way of computing things.\"" msgstr "" -"Ignorer tous les espaces. Numéro de rejet comportant moins de deux chiffres." -#: src/testing/exercise.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-closure.md msgid "" -"Moving from **right to left**, double every second digit: for the number " -"`1234`, we double `3` and `1`. For the number `98765`, we double `6` and `8`." +"// Simplified. If the resize is larger than the current vec size, use the\n" +" // closure to populate elements.\n" msgstr "" -"En se déplaçant de droite à gauche, doubler tous les deux chiffres : pour le " -"nombre `1234`, on double '3' et '1'." -#: src/testing/exercise.md -#, fuzzy -msgid "" -"After doubling a digit, sum the digits if the result is greater than 9. So " -"doubling `7` becomes `14` which becomes `1 + 4 = 5`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-closure.md +msgid "// Create an infinite, lazy iterator using a closure.\n" msgstr "" -"Après avoir doublé un chiffre, additionnez les chiffres. Donc doubler '7' " -"devient '14' ce qui devient '5'." -#: src/testing/exercise.md -#, fuzzy -msgid "Sum all the undoubled and doubled digits." -msgstr "Additionnez tous les chiffres non doublés et doublés." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-closure.md +msgid "" +"`with` can appear as a suffix to communicate there is a specific function or closure that " +"can be used instead of a \"sensible default\" for a computation." +msgstr "" -#: src/testing/exercise.md -#, fuzzy -msgid "The credit card number is valid if the sum ends with `0`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-closure.md +msgid "Similar to [`by`](./by.md)." msgstr "" -"Le numéro de carte de crédit est valide si la somme se termine par '0'." -#: src/testing/exercise.md -msgid "" -"The provided code provides a buggy implementation of the luhn algorithm, " -"along with two basic unit tests that confirm that most the algorithm is " -"implemented correctly." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "`with` in normal use" msgstr "" -#: src/testing/exercise.md -#, fuzzy -msgid "" -"Copy the code below to and write additional " -"tests to uncover bugs in the provided implementation, fixing any bugs you " -"find." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "Sometimes a `with` is just a `with`." msgstr "" -"Copiez le code ci-dessous sur et remplissez " -"les champs manquants fonctions et méthodes :" -#: src/testing/exercise.md src/testing/solution.md -msgid "\"4263 9826 4026 9299\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "`with` when used in common English contexts." msgstr "" -#: src/testing/exercise.md src/testing/solution.md -msgid "\"4539 3195 0343 6467\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "// impl block for slices\n" msgstr "" -#: src/testing/exercise.md src/testing/solution.md -msgid "\"7992 7398 713\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "// A condition, but doesn't start with `is`, and uses `with` as a normal word.\n" msgstr "" -#: src/testing/exercise.md src/testing/solution.md -msgid "\"4223 9826 4026 9299\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "" +"Name fragments are not hard rules, they are guidance. Sometimes a method's name will " +"include words that break its pattern." msgstr "" -#: src/testing/exercise.md src/testing/solution.md -msgid "\"4539 3195 0343 6476\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "" +"In this example with have `starts_with`, which is a boolean condition that does not start " +"with \"is\" and is suffixed by \"with\"." msgstr "" -#: src/testing/exercise.md src/testing/solution.md -msgid "\"8273 1232 7352 0569\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "If naming conventions were to be treated as hard rules, this would fail as a case." msgstr "" -#: src/testing/solution.md -msgid "// This is the buggy version that appears in the problem.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "" +"This is a good name for understanding what is going on at the callsite. We end up writing " +"`.starts_with()` which scans well for authors and readers of code." msgstr "" -#: src/testing/solution.md -msgid "// This is the solution and passes all of the tests below.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/with-word.md +msgid "" +"Remember: the point of naming conventions is predictability, and how predictability is in " +"service of callsite clarity and readability." msgstr "" -#: src/testing/solution.md -msgid "\"1234 5678 1234 5670\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/try.md +msgid "`try_[method]`: Fallible methods with Specific Errors" msgstr "" -#: src/testing/solution.md -msgid "\"Is {cc_number} a valid credit card number? {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/try.md +msgid "Prefix for fallible methods that return a `Result`." msgstr "" -#: src/testing/solution.md -msgid "\"yes\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/try.md +msgid "" +"`TryFrom` is a `From`\\-like trait for types whose single-value constructors might fail " +"in some way." msgstr "" -#: src/testing/solution.md -msgid "\"no\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/try.md +msgid "Ask: Why aren't `Vec::get` and other similar methods called `try_get`?" msgstr "" -#: src/testing/solution.md -msgid "\"foo 0 0\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/try.md +msgid "" +"Methods are named `get` if they return a reference to an existing value and return an " +"`Option` instead of `Result` because there is only one failure mode. For example, only " +"\"index out of bounds\" for `Vec::get`, and \"key does not exist\" for `HashMap::get`." msgstr "" -#: src/testing/solution.md -msgid "\" \"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "`from`" msgstr "" -#: src/testing/solution.md -msgid "\" \"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "A constructor function, strongly implying \"type conversion\"." msgstr "" -#: src/testing/solution.md -msgid "\" \"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "" +"These functions can take multiple arguments, but usually imply the user is doing more of " +"the work than a usual constructor would." msgstr "" -#: src/testing/solution.md -msgid "\"0\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "" +"`new` is still preferred for most constructor-style functions, the implication for `from` " +"is transformation of one data type to another." msgstr "" -#: src/testing/solution.md -msgid "\" 0 0 \"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "" +"Ask: Without looking at the standard library documentation, what would the argument type " +"of `u32::from_be` be?" msgstr "" -#: src/error-handling/panics.md -msgid "Rust handles fatal errors with a \"panic\"." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "" +"Answer guidance: we already see `u32::from_le_bytes` on the slide, it takes a slice of " +"bytes. So from_le must be simpler, taking not bytes. Think about the contrast between " +"`u32` and `be`. The argument must be a big-endian `u32`!" msgstr "" -#: src/error-handling/panics.md -#, fuzzy -msgid "Rust will trigger a panic if a fatal error happens at runtime:" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "Follow-up question: How about `str::from_utf8`?" msgstr "" -"Rust déclenchera une panique si une erreur fatale se produit lors de " -"l'exécution :" -#: src/error-handling/panics.md -msgid "\"v[100]: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "" +"Answer guidance: `str` vs `utf8`. The argument can't be a `str` because every `str` is " +"valid UTF-8. So what is the simplest way to provide UTF-8 data? A slice of bytes." msgstr "" -#: src/error-handling/panics.md -#, fuzzy -msgid "Panics are for unrecoverable and unexpected errors." -msgstr "Les paniques concernent les erreurs irrécupérables et inattendues." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "Follow-up: Why not `str::from_utf8_bytes`?" +msgstr "" -#: src/error-handling/panics.md -#, fuzzy -msgid "Panics are symptoms of bugs in the program." -msgstr "Les paniques sont des symptômes de bogues dans le programme." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/from.md +msgid "" +"Answer: It could be in theory. However, the \"omit needless words\" principle applies, " +"the word \"bytes\" would merely repeat the obvious - could a UTF-8 sequence ever be non-" +"bytes?" +msgstr "" -#: src/error-handling/panics.md -msgid "Runtime failures like failed bounds checks can panic" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into.md +msgid "`into`" msgstr "" -#: src/error-handling/panics.md -msgid "Assertions (such as `assert!`) panic on failure" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into.md +msgid "Prefix for methods that convert `self` into another type." msgstr "" -#: src/error-handling/panics.md -msgid "Purpose-specific panics can use the `panic!` macro." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into.md +msgid "Consumes `self`, returns an owned value." msgstr "" -#: src/error-handling/panics.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into.md msgid "" -"A panic will \"unwind\" the stack, dropping values just as if the functions " -"had returned." +"Not reinterpret cast! The data can be rearranged, reallocated, changed in any way, " +"including losing information." msgstr "" -#: src/error-handling/panics.md -#, fuzzy -msgid "" -"Use non-panicking APIs (such as `Vec::get`) if crashing is not acceptable." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into.md +msgid "corollary to `From`" msgstr "" -"Utilisez des API qui ne paniquent pas (telles que `Vec::get`) si le plantage " -"n'est pas acceptable." -#: src/error-handling/panics.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into.md msgid "" -"By default, a panic will cause the stack to unwind. The unwinding can be " -"caught:" +"`into_iter` consumes a collection (like a vec, or a btreeset, or a hashmap) and produces " +"an iterator over owned values, unlike `iter` and `iter_mut` which produce iterators over " +"reference values." msgstr "" -"Par défaut, une panique entraînera le déroulement de la pile. Le déroulement " -"peut être rattrapé :" -#: src/error-handling/panics.md -msgid "\"No problem here!\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into.md +msgid "Ask the class: what will `Vec::into_raw_parts` do?" msgstr "" -#: src/error-handling/panics.md -msgid "\"{result:?}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into_inner.md +msgid "Aside: `into_inner`" msgstr "" -#: src/error-handling/panics.md -msgid "\"oh no!\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into_inner.md +msgid "" +"Special case of `into`: for exclusive pointer types or newtypes, extract the internal " +"value." msgstr "" -#: src/error-handling/panics.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into_inner.md msgid "" -"Catching is unusual; do not attempt to implement exceptions with " -"`catch_unwind`!" +"`into_inner` is a method usually found on newtypes: types whose main purpose is to wrap " +"around an existing type and be semantically distinct from other uses of that inner type." msgstr "" -#: src/error-handling/panics.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into_inner.md msgid "" -"This can be useful in servers which should keep running even if a single " -"request crashes." +"This kind of method is also found on types like `Cell`, which exclusively own the " +"internal data." msgstr "" -"Cela peut être utile dans les serveurs qui doivent continuer à fonctionner " -"même si un seul la demande se bloque." -#: src/error-handling/panics.md -#, fuzzy -msgid "This does not work if `panic = 'abort'` is set in your `Cargo.toml`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into_inner.md +msgid "" +"The purpose of this kind of method is to consume the \"wrapper\" type and return the " +"\"contained\" value." msgstr "" -"Cela ne fonctionne pas si `panic = 'abort'` est défini dans votre `Cargo." -"toml`." -#: src/error-handling/try.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into_inner.md msgid "" -"Runtime errors like connection-refused or file-not-found are handled with " -"the `Result` type, but matching this type on every call can be cumbersome. " -"The try-operator `?` is used to return errors to the caller. It lets you " -"turn the common" +"When defining a type with exactly one field, consider if it makes sense to implement an " +"`into_inner` method that consumes `self` and returns the field as an owned value." msgstr "" -#: src/error-handling/try.md -#, fuzzy -msgid "into the much simpler" -msgstr "dans le plus simple" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/into_inner.md +msgid "Don't write a method like this if more fields will be added in the future." +msgstr "" -#: src/error-handling/try.md -#, fuzzy -msgid "We can use this to simplify our error handling code:" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "`by`: custom comparator or projection" msgstr "" -"Nous pouvons l'utiliser pour simplifier notre code de gestion des erreurs :" -#: src/error-handling/try.md -msgid "//fs::write(\"config.dat\", \"alice\").unwrap();\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "Component for methods that take a custom projection or comparison function." msgstr "" -#: src/error-handling/try.md src/error-handling/try-conversions.md -#: src/error-handling/thiserror-and-anyhow.md -msgid "\"config.dat\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "// Uses a predicate to determine what items end up in non-overlapping chunks.\n" msgstr "" -#: src/error-handling/try.md src/error-handling/try-conversions.md -msgid "\"username or error: {username:?}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "// Provided method of Iterator. Simplified.\n" msgstr "" -#: src/error-handling/try.md -msgid "Simplify the `read_username` function to use `?`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "" +"A projection function here being a function that, given a reference to a value that " +"exists in the data structure, will compute a value to perform the principle computation " +"with." msgstr "" -#: src/error-handling/try.md -#, fuzzy -msgid "The `username` variable can be either `Ok(string)` or `Err(error)`." -msgstr "La variable `username` peut être soit `Ok(string)` soit `Err(error)`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "" +"Methods like `sort_by_key` allow us to sort by _the hash function I've passed to the " +"method_ or sort by _this specific field of the data in the slice_." +msgstr "" -#: src/error-handling/try.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md msgid "" -"Use the `fs::write` call to test out the different scenarios: no file, empty " -"file, file with username." +"For example, if you have a slice of values of some data structure you might want to sort " +"them by a field of that data structure, or even a hash value of that data." msgstr "" -"Utilisez l'appel `fs::write` pour tester les différents scénarios : pas de " -"fichier, fichier vide, fichier avec nom d'utilisateur." -#: src/error-handling/try.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "`sort_by` takes a comparator function directly." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md msgid "" -"Note that `main` can return a `Result<(), E>` as long as it implements `std::" -"process::Termination`. In practice, this means that `E` implements `Debug`. " -"The executable will print the `Err` variant and return a nonzero exit status " -"on error." +"Most often seen in methods that sort or otherwise manipulate a slice with a custom sort " +"or comparison function rather than by the `Ord` implementation of the type itself." msgstr "" -#: src/error-handling/try-conversions.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md +msgid "Sometimes the \"by\" preposition is simply a preposition." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md msgid "" -"The effective expansion of `?` is a little more complicated than previously " -"indicated:" +"\"by\", like some other name components, may end up in a method name for normal " +"linguistic reasons rather than holding specific naming convention semantic weight." msgstr "" -"L'expansion effective de `?` est un peu plus compliquée qu'indiqué " -"précédemment :" -#: src/error-handling/try-conversions.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md #, fuzzy -msgid "works the same as" -msgstr "fonctionne de la même manière que" +msgid "[`Read::by_ref()`](https://doc.rust-lang.org/std/io/trait.Read.html#method.by_ref)" +msgstr "" +"De même, [`Write`](https://doc.rust-lang.org/std/io/trait.Write.html) vous permet " +"d'abstraire les puits `u8` :" -#: src/error-handling/try-conversions.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/by.md msgid "" -"The `From::from` call here means we attempt to convert the error type to the " -"type returned by the function. This makes it easy to encapsulate errors into " -"higher-level errors." +"[`Iterator::advance_by()`](https://doc.rust-lang.org/std/iter/trait.Iterator.html#method." +"advance_by) iterator method (nightly feature)" msgstr "" -"L'appel `From::from` ici signifie que nous essayons de convertir le type " -"d'erreur en type renvoyé par la fonction :" -#: src/error-handling/try-conversions.md -msgid "\"IO error: {e}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "`unchecked`: Unsafe" msgstr "" -#: src/error-handling/try-conversions.md -msgid "\"Found no username in {path}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "`unchecked` distinguishes the unsafe function in a safe/unsafe pair." msgstr "" -#: src/error-handling/try-conversions.md -#: src/error-handling/thiserror-and-anyhow.md -msgid "//fs::write(\"config.dat\", \"\").unwrap();\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "Don't add \"unchecked\" to the name of every unsafe function." msgstr "" -#: src/error-handling/try-conversions.md -msgid "" -"The `?` operator must return a value compatible with the return type of the " -"function. For `Result`, it means that the error types have to be compatible. " -"A function that returns `Result` can only use `?` on a value " -"of type `Result` if `ErrorOuter` and `ErrorInner` are the " -"same type or if `ErrorOuter` implements `From`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "// A checked version of the constructor, `None` on null.\n" msgstr "" -#: src/error-handling/try-conversions.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "// Unchecked constructor, you can violate the non-null invariant!\n" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "// Panics on OOB, old API design.\n" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "// Newer method, returns `None` if mid > len\n" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "// Unchecked split function, splitting out of bounds is undefined behavior!\n" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md msgid "" -"A common alternative to a `From` implementation is `Result::map_err`, " -"especially when the conversion only happens in one place." +"Please take the Unsafe Rust deep dive if you want to learn more about unsafe code. " +"Briefly, unsafe functions transfer the responsibility for memory safety from the compiler " +"to the programmer. If misused, they can trigger undefined behavior." msgstr "" -#: src/error-handling/try-conversions.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md msgid "" -"There is no compatibility requirement for `Option`. A function returning " -"`Option` can use the `?` operator on `Option` for arbitrary `T` and " -"`U` types." +"Rust does not overload functions on safety, so we use different names for the functions " +"in the pair. To make the names predictable for users, we use a naming convention." msgstr "" -#: src/error-handling/try-conversions.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md msgid "" -"A function that returns `Result` cannot use `?` on `Option` and vice versa. " -"However, `Option::ok_or` converts `Option` to `Result` whereas `Result::ok` " -"turns `Result` into `Option`." +"The safe function gets the short name. We add \"unchecked\" to the name of the unsafe " +"function." msgstr "" -#: src/error-handling/error.md -msgid "Dynamic Error Types" -msgstr "Types d'erreurs dynamiques" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "We don't add \"unchecked\" to the name of every unsafe function." +msgstr "" -#: src/error-handling/error.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md msgid "" -"Sometimes we want to allow any type of error to be returned without writing " -"our own enum covering all the different possibilities. The `std::error::" -"Error` trait makes it easy to create a trait object that can contain any " -"error." +"In Rust we don't need a naming convention to highlight the danger of unsafe code at the " +"callsite: Rust already requires the caller to write an `unsafe {}` block. This is " +"different from other languages that don't have unsafe blocks, for example, Swift naming " +"convention is to add the word \"unsafe\" to the type and function names." msgstr "" -"Parfois, nous voulons permettre à tout type d'erreur d'être renvoyé sans " -"écrire notre propre énumération couvrant toutes les différentes " -"possibilités. `std::error::Error` rend cela facile." -#: src/error-handling/error.md -msgid "\"count.dat\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/unchecked.md +msgid "" +"We only use this naming convention when we want to provide a function pair, and therefore " +"must use different names." msgstr "" -#: src/error-handling/error.md -msgid "\"1i3\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "`to`: Non-consuming Conversion" msgstr "" -#: src/error-handling/error.md -msgid "\"Count: {count}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "Prefix to a function that takes a borrowed value and creates an owned value" msgstr "" -#: src/error-handling/error.md -msgid "\"Error: {err}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "// &str is not consumed.\n" msgstr "" -#: src/error-handling/error.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "// take an owned self because `u32` implements `Copy`\n" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md msgid "" -"The `read_count` function can return `std::io::Error` (from file operations) " -"or `std::num::ParseIntError` (from `String::parse`)." +"This is not a borrow checker escape hatch, or an instance of unsafe code. A new value is " +"created, the original data is left alone." msgstr "" -#: src/error-handling/error.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md msgid "" -"Boxing errors saves on code, but gives up the ability to cleanly handle " -"different error cases differently in the program. As such it's generally not " -"a good idea to use `Box` in the public API of a library, but it " -"can be a good option in a program where you just want to display the error " -"message somewhere." +"Methods that start with \"to\" return a different type, and strongly imply a non-trivial " +"type conversion, or even a data transformation. For example, `str::to_uppercase`." msgstr "" -"Cela permet d'économiser du code, mais abandonne la possibilité de gérer " -"proprement différents cas d'erreur différemment dans le programme. En tant " -"que tel, ce n'est généralement pas une bonne idée d'utiliser `Box` dans l'API publique d'un bibliothèque, mais cela peut être une bonne " -"option dans un programme où vous voulez juste afficher le message d'erreur " -"quelque part." -#: src/error-handling/error.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md msgid "" -"Make sure to implement the `std::error::Error` trait when defining a custom " -"error type so it can be boxed. But if you need to support the `no_std` " -"attribute, keep in mind that the `std::error::Error` trait is currently " -"compatible with `no_std` in [nightly](https://github.com/rust-lang/rust/" -"issues/103765) only." +"\"to\" methods most commonly take `&self`. However they can take `self` by value if the " +"type implements `Copy`: this also ensures that the conversion method call does not " +"consume `self`." msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md msgid "" -"The [`thiserror`](https://docs.rs/thiserror/) and [`anyhow`](https://docs.rs/" -"anyhow/) crates are widely used to simplify error handling." +"If you simply want to define a method that takes `&self` and returns an owned value of " +"the same type, implement the `Clone` trait." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "Example: to_uppercase creates a version of a string with all uppercase letters." msgstr "" -"La caisse [thiserror](https://docs.rs/thiserror/) est un moyen populaire de " -"créer un error enum comme nous l'avons fait sur la page précédente :" -#: src/error-handling/thiserror-and-anyhow.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md msgid "" -"`thiserror` is often used in libraries to create custom error types that " -"implement `From`." +"If you want to define a method that consumes the source value, use the \"into\" naming " +"pattern." msgstr "" -#: src/error-handling/thiserror-and-anyhow.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md msgid "" -"`anyhow` is often used by applications to help with error handling in " -"functions, including adding contextual information to your errors." +"Also seen in functions that convert the endianness of primitives, or copy and expose the " +"value of a newtype." msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "\"Found no username in {0}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "Ask the class: What's the difference between `to_owned` and `into_owned`?" msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "\"Failed to open {path}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "" +"Answer: `to_owned` appears on reference values like `&str`, whereas `into_owned` appears " +"on owned values that hold reference types, like `Cow` (copy-on-write)." msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "\"Failed to read\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/to.md +msgid "" +"Types like `Cow` can be owned while containing references that are borrowed, so the owned " +"value of `Cow` is consumed to create an owned value of the reference type it was holding " +"onto." msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "\"Username: {username}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "`as_` and `_ref`: reference conversions" msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "\"Error: {err:?}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "" +"`as` is a prefix for methods that convert references. `ref` is a suffix (but prefer `as`.)" msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -#, fuzzy -msgid "`thiserror`" -msgstr "\"Erreur\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "`as` methods borrow out the primary piece of data contained in `&self`." +msgstr "" -#: src/error-handling/thiserror-and-anyhow.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md msgid "" -"The `Error` derive macro is provided by `thiserror`, and has lots of useful " -"attributes to help define error types in a compact way." +"Most commonly return references, but can also return a custom borrowing type or an unsafe " +"pointer." msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "The `std::error::Error` trait is derived automatically." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "// Very common on container types, see how it's also on Option.\n" msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "The message from `#[error]` is used to derive the `Display` trait." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "// Slices can be empty! So this is 0 or 1 elements.\n" msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -msgid "`anyhow`" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "// Covered later.\n" msgstr "" -#: src/error-handling/thiserror-and-anyhow.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "Method that returns a borrow of the primary piece of contained data." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md msgid "" -"`anyhow::Error` is essentially a wrapper around `Box`. As such " -"it's again generally not a good choice for the public API of a library, but " -"is widely used in applications." +"The borrowing relationship is most often straightforward: the return value is a reference " +"that borrows `self`." msgstr "" -"`anyhow::Error` est essentiellement un wrapper autour de `Box`. " -"En tant que tel, ce n'est généralement pas un bon choix pour l'API publique " -"d'une bibliothèque, mais il est largement utilisé dans les applications." -#: src/error-handling/thiserror-and-anyhow.md -#, fuzzy -msgid "`anyhow::Result` is a type alias for `Result`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "Borrowing can also be subtle, and merely implied." msgstr "" -"`anyhow::Result` est un alias de type pour `Result`." -#: src/error-handling/thiserror-and-anyhow.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md msgid "" -"Actual error type inside of it can be extracted for examination if necessary." +"The returned value could be a custom borrowing type, fore example, `BorrowedFd` borrows " +"`OwnedFd` through an explicit lifetime." msgstr "" -"Le type d'erreur réel à l'intérieur peut être extrait pour examen si " -"nécessaire." -#: src/error-handling/thiserror-and-anyhow.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "" +"We cover custom borrowing types later in this deep dive, [PhantomData: OwnedFd & " +"BorrowedFd](../../../leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-" +"borrowedfd.md)." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "" +"The returned value could borrow `self` only logically, for example, `as_ptr()` methods " +"return an unsafe pointer. The borrow checker does not track borrowing for pointers." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md msgid "" -"Functionality provided by `anyhow::Result` may be familiar to Go " -"developers, as it provides similar usage patterns and ergonomics to `(T, " -"error)` from Go." +"The type implementing an \"as\" method should contain one primary piece of data that is " +"being borrowed out." msgstr "" -"La fonctionnalité fournie par `anyhow::Result` peut être familière aux " -"développeurs Go, car elle fournit modèles d'utilisation et ergonomie " -"similaires à `(T, erreur)` de Go." -#: src/error-handling/thiserror-and-anyhow.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md msgid "" -"`anyhow::Context` is a trait implemented for the standard `Result` and " -"`Option` types. `use anyhow::Context` is necessary to enable `.context()` " -"and `.with_context()` on those types." +"The \"as\" naming convention does not work if the data type is an aggregate of many " +"fields without an obvious primary one. Think about the call site:" msgstr "" -#: src/error-handling/exercise.md -msgid "Exercise: Rewriting with Result" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "// OK\n" msgstr "" -#: src/error-handling/exercise.md -msgid "" -"The following implements a very simple parser for an expression language. " -"However, it handles errors by panicking. Rewrite it to instead use idiomatic " -"error handling and propagate errors to a return from `main`. Feel free to " -"use `thiserror` and `anyhow`." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md +msgid "// does not read right, don't use \"as_\"\n" msgstr "" -#: src/error-handling/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/as-and-ref.md msgid "" -"HINT: start by fixing error handling in the `parse` function. Once that is " -"working correctly, update `Tokenizer` to implement " -"`Iterator>` and handle that in the parser." +"If you want to have two getters that you need to distinguish, one that returns first name " +"by value, and another one that returns it by reference, use `_ref` suffix:" msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "/// An arithmetic operator.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/raw_parts.md +msgid "`raw_parts`" msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "/// A token in the expression language.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/raw_parts.md +msgid "Peeling back safe abstractions on heap data." msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "/// An expression in the expression language.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/raw_parts.md +msgid "// Note how this is an unsafe function\n" msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "/// A reference to a variable.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/raw_parts.md +msgid "" +"`raw_parts` denotes methods that construct items from or decompose items into underlying " +"pointer data and its relevant layout information (capacity, etc.)." msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "/// A literal number.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/raw_parts.md +#, fuzzy +msgid "" +"These kinds of methods can be marked as `unsafe` if constructing new values as trust is " +"placed on the user to avoid conditions that might lead to undefined behavior." msgstr "" +"Une fonction ou une méthode peut être marquée \"unsafe\" si elle a des conditions " +"préalables supplémentaires que vous doit respecter pour éviter un comportement indéfini :" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "/// A binary operation.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/raw_parts.md +msgid "" +"Such a case might be passing a pointer of `sizeof T * 10` to `Vec::from_raw_parts` but " +"also passing `20` as the capacity argument, which would lead to writing or accessing " +"values 10 through 19 in the vector being undefined behavior." msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "'_'" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "What do these names imply they do?" msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "'+'" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "What should we name these signatures?" msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "'-'" -msgstr "" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +#, fuzzy +msgid "// What are the types of these methods?\n" +msgstr "Quel est le type de \"mot\" dans chaque boucle ?" -#: src/error-handling/exercise.md -msgid "\"Unexpected character {c}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "// ?\n" msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "\"Unexpected end of input\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "// What should we name methods with these types?\n" msgstr "" -#: src/error-handling/exercise.md -msgid "\"Invalid 32-bit integer'\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "// details for InnerType do not matter.\n" msgstr "" -#: src/error-handling/exercise.md -msgid "\"Unexpected token {tok:?}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "" +"Go through the methods in the example with the class and discuss what the types of the " +"functions should be." msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "// Look ahead to parse a binary operation if present.\n" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "Go through the unnamed methods and brainstorm what names those methods should have." msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "\"10+foo+20-30\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "Answers for missing types:" msgstr "" -#: src/error-handling/exercise.md src/error-handling/solution.md -msgid "\"{expr:?}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`Option::is_some(&self) -> bool`" msgstr "" -#: src/error-handling/solution.md -msgid "\"Unexpected character '{0}' in input\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`slice::get(&self /* &[T] */, usize) -> Option<&T>`" msgstr "" -#: src/error-handling/solution.md -msgid "\"Tokenizer error: {0}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`slice::get_unchecked_mut(&self /* &[T] */, usize) -> &T` (unsafe and simplified)" msgstr "" -#: src/error-handling/solution.md -msgid "\"Unexpected token {0:?}\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`Option::as_ref(&self /* &Option */) -> Option<&T>`" msgstr "" -#: src/error-handling/solution.md -msgid "\"Invalid number\"" +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`str::from_utf8_unchecked_mut(v: &mut [u8]) -> &mut str` (unsafe)" msgstr "" -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "The Rust language has two parts:" -msgstr "Le langage Rust comporte deux parties :" - -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "**Safe Rust:** memory safe, no undefined behavior possible." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`Rc::get_mut(&mut self /* &mut Rc */) -> Option<&mut T>` (simplified)" msgstr "" -"**Safe Rust :** mémoire sécurisée, aucun comportement indéfini possible." -#: src/unsafe-rust/unsafe.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md msgid "" -"**Unsafe Rust:** can trigger undefined behavior if preconditions are " -"violated." +"`Vec::dedup_by_key(&mut self /* &mut Vec */, key: impl FnMut(&mut T) -> " +"K)` (simplified)" msgstr "" -"**Unsafe Rust :** peut déclencher un comportement indéfini si les conditions " -"préalables ne sont pas respectées." -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "" -"We saw mostly safe Rust in this course, but it's important to know what " -"Unsafe Rust is." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "Answers for missing names:" msgstr "" -"Nous verrons principalement Rust sûr dans ce cours, mais il est important de " -"savoir ce qu'est Rust non securisé (_unsafe_)." -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "" -"Unsafe code is usually small and isolated, and its correctness should be " -"carefully documented. It is usually wrapped in a safe abstraction layer." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`fn from_string(String) -> Self`" msgstr "" -"Le code dangereux est généralement petit et isolé, et son exactitude doit " -"être soigneusement documenté. Il est généralement enveloppé dans une couche " -"d'abstraction sûre." - -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "Unsafe Rust gives you access to five new capabilities:" -msgstr "Unsafe Rust vous donne accès à cinq nouvelles fonctionnalités :" - -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "Dereference raw pointers." -msgstr "Déréférencer les pointeurs bruts." - -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "Access or modify mutable static variables." -msgstr "Accéder ou modifier des variables statiques mutables." - -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "Access `union` fields." -msgstr "Accéder aux champs \"union\"." -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "Call `unsafe` functions, including `extern` functions." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`fn inner(&self) -> Option<&InnerType>` or `as_ref`, depending on context" msgstr "" -"Appelez les fonctions `unsafe`, y compris les fonctions `extern`. \\* Mettre " -"en œuvre les traits \" non sécurisés \"." -#: src/unsafe-rust/unsafe.md -msgid "Implement `unsafe` traits." +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md +msgid "`fn with_string(self, String) -> Self`" msgstr "" -#: src/unsafe-rust/unsafe.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/naming-conventions/exercise.md msgid "" -"We will briefly cover unsafe capabilities next. For full details, please see " -"[Chapter 19.1 in the Rust Book](https://doc.rust-lang.org/book/ch19-01-" -"unsafe-rust.html) and the [Rustonomicon](https://doc.rust-lang.org/nomicon/)." +"`fn inner_mut(&mut self) -> Option<&mut InnerType>` or `as_ref_mut`, depending on context" msgstr "" -"Nous aborderons ensuite brièvement les capacités dangereuses. Pour plus de " -"détails, veuillez consulter [Chapitre 19.1 du Rust Book](https://doc.rust-" -"lang.org/book/ch19-01-unsafe-rust.html) et le [Rustonomicon](https://doc." -"rust-lang.org/nomicon/)." -#: src/unsafe-rust/unsafe.md -#, fuzzy -msgid "" -"Unsafe Rust does not mean the code is incorrect. It means that developers " -"have turned off some compiler safety features and have to write correct code " -"by themselves. It means the compiler no longer enforces Rust's memory-safety " -"rules." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits.md +msgid "Common Traits to Implement" msgstr "" -"Unsafe Rust ne signifie pas que le code est incorrect. Cela signifie que les " -"développeurs ont désactivé les fonctionnalités de sécurité du compilateur et " -"doit écrire le code correct en eux-mêmes. Cela signifie que le compilateur " -"n'applique plus les règles de sécurité de la mémoire de Rust." -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "Creating pointers is safe, but dereferencing them requires `unsafe`:" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits.md +msgid "Traits should be liberally implemented on types you author, but there are caveats!" msgstr "" -"La création de pointeurs est sûre, mais leur déréférencement nécessite " -"`unsafe` :" -#: src/unsafe-rust/dereferencing.md -msgid "\"careful!\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits.md +msgid "" +"Remember, many traits have the ability to be _derived_: to have a compiler plugin (macro) " +"write the implementation for you!" msgstr "" -#: src/unsafe-rust/dereferencing.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits.md msgid "" -"// Safe because r1 and r2 were obtained from references and so are\n" -" // guaranteed to be non-null and properly aligned, the objects " -"underlying\n" -" // the references from which they were obtained are live throughout the\n" -" // whole unsafe block, and they are not accessed either through the\n" -" // references or concurrently through any other pointers.\n" +"Authors of ecosystem traits (like De/Serialize) have made derive implementations for " +"traits available to users, leading to very little commitment needed on the developer side " +"for implementing these kinds of traits!" msgstr "" -#: src/unsafe-rust/dereferencing.md -msgid "\"r1 is: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "\"Write to string\" trait, for debug purposes." msgstr "" -#: src/unsafe-rust/dereferencing.md -msgid "\"uhoh\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/hash.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/serde.md +msgid "Derivable: ✅" msgstr "" -#: src/unsafe-rust/dereferencing.md -msgid "\"r2 is: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "When to implement: Almost always" msgstr "" -#: src/unsafe-rust/dereferencing.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md msgid "" -"// NOT SAFE. DO NOT DO THIS.\n" -" /*\n" -" let r3: &String = unsafe { &*r1 };\n" -" drop(s);\n" -" println!(\"r3 is: {}\", *r3);\n" -" */" +"// pub trait Debug {\n" +"// fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>;\n" +"// }\n" msgstr "" -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "" -"It is good practice (and required by the Android Rust style guide) to write " -"a comment for each `unsafe` block explaining how the code inside it " -"satisfies the safety requirements of the unsafe operations it is doing." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "\"PlainTextPassword\"" msgstr "" -"Il est recommandé (et requis par le guide de style Android Rust) d'écrire un " -"commentaire pour chaque Bloc `unsafe` expliquant comment le code à " -"l'intérieur satisfait aux exigences de sécurité de l'unsafe opérations qu'il " -"effectue." -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "" -"In the case of pointer dereferences, this means that the pointers must be " -"[_valid_](https://doc.rust-lang.org/std/ptr/index.html#safety), i.e.:" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "\"hint\"" msgstr "" -"Dans le cas des déréférencements de pointeurs, cela signifie que les " -"pointeurs doivent être [_valid_](https://doc.rust-lang.org/std/ptr/index." -"html#safety), c'est-à-dire :" - -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "The pointer must be non-null." -msgstr "Le pointeur doit être non nul." -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "" -"The pointer must be _dereferenceable_ (within the bounds of a single " -"allocated object)." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +msgid "\"password\"" msgstr "" -"Le pointeur doit être _dereferenceable_ (dans les limites d'un seul objet " -"alloué)." - -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "The object must not have been deallocated." -msgstr "L'objet ne doit pas avoir été désalloué." - -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "There must not be concurrent accesses to the same location." -msgstr "Il ne doit pas y avoir d'accès simultanés au même endroit." -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "" -"If the pointer was obtained by casting a reference, the underlying object " -"must be live and no reference may be used to access the memory." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "\"[omitted]\"" msgstr "" -"Si le pointeur a été obtenu en transtypant une référence, l'objet sous-" -"jacent doit être actif et non référence peut être utilisée pour accéder à la " -"mémoire." -#: src/unsafe-rust/dereferencing.md -#, fuzzy -msgid "In most cases the pointer must also be properly aligned." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "\"{user:?}\"" msgstr "" -"Dans la plupart des cas, le pointeur doit également être correctement aligné." -#: src/unsafe-rust/dereferencing.md -msgid "" -"The \"NOT SAFE\" section gives an example of a common kind of UB bug: `*r1` " -"has the `'static` lifetime, so `r3` has type `&'static String`, and thus " -"outlives `s`. Creating a reference from a pointer requires _great care_." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md +msgid "\"Password123\"" msgstr "" -#: src/unsafe-rust/mutable-static.md -#, fuzzy -msgid "It is safe to read an immutable static variable:" -msgstr "Il est sûr de lire une variable statique immuable :" - -#: src/unsafe-rust/mutable-static.md -#, fuzzy -msgid "\"Hello, world!\"" -msgstr "Bonjour le monde!" - -#: src/unsafe-rust/mutable-static.md -msgid "\"HELLO_WORLD: {HELLO_WORLD}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "\"Used it for years\"" msgstr "" -#: src/unsafe-rust/mutable-static.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md msgid "" -"However, since data races can occur, it is unsafe to read and write mutable " -"static variables:" +"Formatting for _debug information_ for programmers during , not appearance or " +"serialization." msgstr "" -"Cependant, étant donné que des courses de données peuvent se produire, il " -"n'est pas sûr de lire et d'écrire mutable variables statiques :" -#: src/unsafe-rust/mutable-static.md -msgid "\"COUNTER: {COUNTER}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md +msgid "Allows for use of `{:?}` and `{#?}` interpolation in string formatting macros." msgstr "" -#: src/unsafe-rust/mutable-static.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md msgid "" -"The program here is safe because it is single-threaded. However, the Rust " -"compiler is conservative and will assume the worst. Try removing the " -"`unsafe` and see how the compiler explains that it is undefined behavior to " -"mutate a static from multiple threads." +"When to not derive/implement: If a struct holds sensitive data, investigate if you should " +"implement Debug for it." msgstr "" -#: src/unsafe-rust/mutable-static.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/debug.md msgid "" -"Using a mutable static is generally a bad idea, but there are some cases " -"where it might make sense in low-level `no_std` code, such as implementing a " -"heap allocator or working with some C APIs." +"If Debug is needed, consider manually implementing Debug rather than deriving it. Omit " +"the sensitive data from the implementation." msgstr "" -"L'utilisation d'une statique mutable est généralement une mauvaise idée, " -"mais il y a des cas où cela peut avoir du sens dans le code `no_std` de bas " -"niveau, comme l'implémentation d'un allocation de tas ou l'utilisation de " -"certaines API C." -#: src/unsafe-rust/unions.md -#, fuzzy -msgid "Unions are like enums, but you need to track the active field yourself:" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "Partial equality & Total equality." msgstr "" -"Les unions sont comme des énumérations, mais vous devez suivre vous-même le " -"champ actif :" -#: src/unsafe-rust/unions.md -msgid "\"int: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/hash.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/serde.md +msgid "When to implement: Almost always." msgstr "" -#: src/unsafe-rust/unions.md -msgid "\"bool: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "" +"// pub trait PartialEq\n" +"//{\n" +"// // Required method\n" +"// fn eq(&self, other: &Rhs) -> bool;\n" +"// \n" +"// // Provided method\n" +"// fn ne(&self, other: &Rhs) -> bool { ... }\n" +"// }\n" +"//\n" +"// pub trait Eq: PartialEq { }\n" msgstr "" -#: src/unsafe-rust/unions.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md #, fuzzy -msgid "// Undefined behavior!\n" -msgstr "Aucun comportement indéfini à l'exécution :" +msgid "\"alice\"" +msgstr "Tranches" -#: src/unsafe-rust/unions.md -#, fuzzy -msgid "" -"Unions are very rarely needed in Rust as you can usually use an enum. They " -"are occasionally needed for interacting with C library APIs." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "\"bob\"" msgstr "" -"Les unions sont très rarement nécessaires dans Rust car vous pouvez " -"généralement utiliser une énumération. Ils sont parfois nécessaires pour " -"interagir avec les API de la bibliothèque C." -#: src/unsafe-rust/unions.md -#, fuzzy -msgid "" -"If you just want to reinterpret bytes as a different type, you probably want " -"[`std::mem::transmute`](https://doc.rust-lang.org/stable/std/mem/fn." -"transmute.html) or a safe wrapper such as the [`zerocopy`](https://crates.io/" -"crates/zerocopy) crate." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "A type can't implement `Eq` without implementing `PartialEq`." msgstr "" -"Si vous voulez simplement réinterpréter les octets comme un type différent, " -"vous voudrez probablement [`std::mem::transmute`](https://doc.rust-lang.org/" -"stable/std/mem/fn.transmute.html) ou un coffre-fort wrapper tel que la " -"caisse [`zerocopy`](https://crates.io/crates/zerocopy)." -#: src/unsafe-rust/unsafe-functions.md -msgid "Calling Unsafe Functions" -msgstr "Appel de fonctions non sécurisées" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "Reminder: Partial means \"there are invalid members of this set for this function.\"" +msgstr "" -#: src/unsafe-rust/unsafe-functions.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md msgid "" -"A function or method can be marked `unsafe` if it has extra preconditions " -"you must uphold to avoid undefined behaviour:" +"This doesn't mean that equality will panic, or that it returns a result, just that there " +"may be values that may not behave as you expect equality to behave." msgstr "" -"Une fonction ou une méthode peut être marquée \"unsafe\" si elle a des " -"conditions préalables supplémentaires que vous doit respecter pour éviter un " -"comportement indéfini :" -#: src/unsafe-rust/unsafe-functions.md src/unsafe-rust/exercise.md -#: src/unsafe-rust/solution.md src/android/interoperability/with-c.md -#: src/android/interoperability/with-c/rust.md -#: src/android/interoperability/cpp/cpp-bridge.md -#: src/exercises/chromium/build-rules.md src/bare-metal/aps/inline-assembly.md -#: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"C\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "" +"For example, with floating point values `NaN` is an outlier: `NaN == NaN` is false, " +"despite bitwise equality." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -msgid "\"🗻∈🌏\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md +msgid "`PartialEq` exists to separate types like f32/f64 from types with Total Equality." msgstr "" -#: src/unsafe-rust/unsafe-functions.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialeq-eq.md msgid "" -"// Safe because the indices are in the correct order, within the bounds of\n" -" // the string slice, and lie on UTF-8 sequence boundaries.\n" +"You can implement `PartialEq` between different types, but this is mostly useful for " +"reference/smart pointer types." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -msgid "\"emoji: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +msgid "Partial ordering & Total ordering." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -msgid "\"char count: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +msgid "" +"// pub trait PartialOrd: PartialEq\n" +"// {\n" +"// // Required method\n" +"// fn partial_cmp(&self, other: &Rhs) -> Option;\n" +"//\n" +"// /* Provided methods omitted */\n" +"// }\n" +"// pub trait Ord: Eq + PartialOrd {\n" +"// // Required method\n" +"// fn cmp(&self, other: &Self) -> Ordering;\n" +"//\n" +"// /* Provided methods omitted */\n" +"// }\n" msgstr "" -#: src/unsafe-rust/unsafe-functions.md -#, fuzzy -msgid "// Undefined behavior if abs misbehaves.\n" -msgstr "Aucun comportement indéfini à l'exécution :" - -#: src/unsafe-rust/unsafe-functions.md -msgid "\"Absolute value of -3 according to C: {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +msgid "`Ord` gives access to `min`, `max`, and `clamp` methods." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -msgid "" -"// Not upholding the UTF-8 encoding requirement breaks memory safety!\n" -" // println!(\"emoji: {}\", unsafe { emojis.get_unchecked(0..3) });\n" -" // println!(\"char count: {}\", count_chars(unsafe {\n" -" // emojis.get_unchecked(0..3) }));\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +msgid "When derived, compares things in the order they are defined." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -msgid "Writing Unsafe Functions" -msgstr "Ecrire des fonctions non sécurisées" - -#: src/unsafe-rust/unsafe-functions.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md msgid "" -"You can mark your own functions as `unsafe` if they require particular " -"conditions to avoid undefined behaviour." +"For enums this means each variant is considered \"greater than\" the last as they are " +"written." msgstr "" -"Vous pouvez marquer vos propres fonctions comme \"non sécurisées\" si elles " -"nécessitent des conditions particulières pour éviter undefined comportement." -#: src/unsafe-rust/unsafe-functions.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md msgid "" -"/// Swaps the values pointed to by the given pointers.\n" -"///\n" -"/// # Safety\n" -"///\n" -"/// The pointers must be valid and properly aligned.\n" +"For structs this means fields are compared as they are written, so `id` fields are " +"compared before `name` fields in `Totally`." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -msgid "// Safe because ...\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +msgid "Prerequisites: `PartialEq` for `PartialOrd`, `Eq` for `Ord`." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -msgid "\"a = {}, b = {}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md +msgid "To implement `Ord`, a type must also implement `PartialEq`, `Eq`, and `PartialOrd`." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md msgid "" -"`get_unchecked`, like most `_unchecked` functions, is unsafe, because it can " -"create UB if the range is incorrect. `abs` is incorrect for a different " -"reason: it is an external function (FFI). Calling external functions is " -"usually only a problem when those functions do things with pointers which " -"might violate Rust's memory model, but in general any C function might have " -"undefined behaviour under any arbitrary circumstances." +"Like with `PartialEq` and `Eq`, a type cannot implement `Ord` without implementing " +"`PartialOrd`." msgstr "" -"Ce n'est généralement un problème que pour les fonctions externes qui font " -"des choses avec des pointeurs qui pourraient violer le modèle de mémoire de " -"Rust, mais en général, toute fonction C peut avoir un comportement indéfini " -"sous n'importe quel circonstances arbitraires." -#: src/unsafe-rust/unsafe-functions.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md msgid "" -"The `\"C\"` in this example is the ABI; [other ABIs are available too]" -"(https://doc.rust-lang.org/reference/items/external-blocks.html)." +"Like those equality traits, `PartialOrd` exists to separate types with non-total ordering " +"(particularly floating-point numbers) from types with total ordering." msgstr "" -#: src/unsafe-rust/unsafe-functions.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/partialord-ord.md msgid "" -"We wouldn't actually use pointers for a `swap` function - it can be done " -"safely with references." +"Used for sorting/searching algorithms and maintaining the ordering of `BTreeMap`/" +"`BTreeSet` style data types." msgstr "" -"Nous n'utiliserions pas de pointeurs pour cela car cela peut être fait en " -"toute sécurité avec des références." -#: src/unsafe-rust/unsafe-functions.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/hash.md +msgid "Performing a hash on a type." +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/hash.md msgid "" -"Note that unsafe code is allowed within an unsafe function without an " -"`unsafe` block. We can prohibit this with `#[deny(unsafe_op_in_unsafe_fn)]`. " -"Try adding it and see what happens. This will likely change in a future Rust " -"edition." +"// pub trait Hash {\n" +"// // Required method\n" +"// fn hash(&self, state: &mut H)\n" +"// where H: Hasher;\n" +"//\n" +"// // Provided method\n" +"// fn hash_slice(data: &[Self], state: &mut H)\n" +"// where H: Hasher,\n" +"// Self: Sized { ... }\n" +"// }\n" msgstr "" -"Notez que le code non sécurisé est autorisé dans une fonction non sécurisée " -"sans bloc « non sécurisé ». Nous pouvons interdisez cela avec " -"`#[deny(unsafe_op_in_unsafe_fn)]`. Essayez de l'ajouter et voyez ce qui se " -"passe." -#: src/unsafe-rust/unsafe-traits.md -msgid "Implementing Unsafe Traits" -msgstr "Implémentation de traits non sécurisés" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/hash.md +msgid "Most commonly used with data structures like `HashMap`." +msgstr "" -#: src/unsafe-rust/unsafe-traits.md -#, fuzzy -msgid "" -"Like with functions, you can mark a trait as `unsafe` if the implementation " -"must guarantee particular conditions to avoid undefined behaviour." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md +msgid "Deep-copy a type or duplicate a smart, shareable pointer." msgstr "" -"Comme avec les fonctions, vous pouvez marquer un trait comme \"non " -"sécurisé\" si l'implémentation doit garantir conditions particulières pour " -"éviter un comportement indéfini." -#: src/unsafe-rust/unsafe-traits.md -#, fuzzy -msgid "" -"For example, the `zerocopy` crate has an unsafe trait that looks [something " -"like this](https://docs.rs/zerocopy/latest/zerocopy/trait.AsBytes.html):" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md +msgid "When to implement: If duplicating doesn't break invariants." msgstr "" -"Par exemple, la caisse \"zérocopie\" a un trait dangereux qui semble " -"[quelque chose comme ça](https://docs.rs/zerocopy/latest/zerocopy/trait." -"AsBytes.html):" -#: src/unsafe-rust/unsafe-traits.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md msgid "" -"/// ...\n" -"/// # Safety\n" -"/// The type must have a defined representation and no padding.\n" +"// pub trait Clone: Sized {\n" +"// // Required method\n" +"// fn clone(&self) -> Self;\n" +"// \n" +"// // Provided methods omitted\n" +"// }\n" msgstr "" -#: src/unsafe-rust/unsafe-traits.md -msgid "// Safe because u32 has a defined representation and no padding.\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md +msgid "// Copies the reference-counted pointer, not the value.\n" msgstr "" -#: src/unsafe-rust/unsafe-traits.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md msgid "" -"There should be a `# Safety` section on the Rustdoc for the trait explaining " -"the requirements for the trait to be safely implemented." +"\"Deep copy\" a value, or in the case of reference counting pointers like `Rc`/`Arc` " +"create a new instance of that pointer." msgstr "" -"Il devrait y avoir une section `# Sécurité` sur le Rustdoc pour le trait " -"expliquant les exigences pour le trait à mettre en œuvre en toute sécurité." -#: src/unsafe-rust/unsafe-traits.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/clone.md msgid "" -"The actual safety section for `AsBytes` is rather longer and more " -"complicated." +"When to not implement/derive: For types that, to maintain an invariant, the value should " +"not be duplicated. We'll touch on this later in Idiomatic Rust." msgstr "" -"La section de sécurité actuelle pour `AsBytes` est plutôt plus longue et " -"plus compliquée." -#: src/unsafe-rust/unsafe-traits.md -#, fuzzy -msgid "The built-in `Send` and `Sync` traits are unsafe." -msgstr "Les traits intégrés \"Envoyer\" et \"Synchroniser\" ne sont pas sûrs." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "Like `Clone`, but indicates the type is can be bitwise copied." +msgstr "" -#: src/unsafe-rust/exercise.md -msgid "Safe FFI Wrapper" -msgstr "Enveloppe FFI sécurisée" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "When to implement: If possible, but with caveats." +msgstr "" -#: src/unsafe-rust/exercise.md -#, fuzzy +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md msgid "" -"Rust has great support for calling functions through a _foreign function " -"interface_ (FFI). We will use this to build a safe wrapper for the `libc` " -"functions you would use from C to read the names of files in a directory." +"// Copy is just a marker trait with Clone as a supertrait.\n" +"// pub trait Copy: Clone { }\n" msgstr "" -"Rust a un excellent support pour appeler des fonctions via une fonction " -"_foreign interface_ (FFI). Nous allons l'utiliser pour construire un wrapper " -"sûr pour la `libc` fonctions que vous utiliseriez à partir de C pour lire " -"les noms de fichiers d'un répertoire." - -#: src/unsafe-rust/exercise.md -#, fuzzy -msgid "You will want to consult the manual pages:" -msgstr "Vous voudrez consulter les pages de manuel :" - -#: src/unsafe-rust/exercise.md -#, fuzzy -msgid "[`opendir(3)`](https://man7.org/linux/man-pages/man3/opendir.3.html)" -msgstr "[`opendir(3)`](https://man7.org/linux/man-pages/man3/opendir.3.html)" - -#: src/unsafe-rust/exercise.md -#, fuzzy -msgid "[`readdir(3)`](https://man7.org/linux/man-pages/man3/readdir.3.html)" -msgstr "[`readdir(3)`](https://man7.org/linux/man-pages/man3/readdir.3.html)" -#: src/unsafe-rust/exercise.md -#, fuzzy -msgid "[`closedir(3)`](https://man7.org/linux/man-pages/man3/closedir.3.html)" -msgstr "[`closedir(3)`](https://man7.org/linux/man-pages/man3/closedir.3.html)" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "" +"When not to implement/derive: If you do not want to implicitly create copies when " +"dereferencing values of a type, do not implement this trait." +msgstr "" -#: src/unsafe-rust/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md msgid "" -"You will also want to browse the [`std::ffi`](https://doc.rust-lang.org/std/" -"ffi/) module. There you find a number of string types which you need for the " -"exercise:" +"Copy enables implicit duplication, so be careful about what types you're implementing " +"this on." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "Encoding" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "" +"Ask the class: Can a type with heap data (`Vec`, `BTreeMap`, `Rc`, etc.) be copy? Should " +"it be?" msgstr "" -#: src/unsafe-rust/exercise.md -msgid "Use" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "It both cannot and should not, this is a misuse of this trait." msgstr "" -#: src/unsafe-rust/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md msgid "" -"[`str`](https://doc.rust-lang.org/std/primitive.str.html) and [`String`]" -"(https://doc.rust-lang.org/std/string/struct.String.html)" +"Bitwise copying on these types would mean types with heap data would no longer have " +"exclusive ownership of a pointer, breaking the invariants usually upheld by Rust and its " +"ecosystem." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "UTF-8" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "" +"Multiple `Vec`s would point to the same data in memory. Adding and removing data would " +"only update individual `Vec`s length and capacity values. The same for `BTreeMap`." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "Text processing in Rust" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/copy.md +msgid "" +"Bitwise copying of `Rc`s would not update the reference counting value within the " +"pointers, meaning there could be two instances of a `Rc` value that believe themselves to " +"be the only `Rc` for that pointer. Once one of them is destroyed, the reference count " +"will become 0 on one of them and the inner value dropped despite there being another `Rc` " +"still alive." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "" -"[`CStr`](https://doc.rust-lang.org/std/ffi/struct.CStr.html) and [`CString`]" -"(https://doc.rust-lang.org/std/ffi/struct.CString.html)" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/serde.md +msgid "Serialize/Deserialize style traits" msgstr "" -#: src/unsafe-rust/exercise.md -msgid "NUL-terminated" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/serde.md +msgid "Crates like `serde` can implement serialization automatically." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "Communicating with C functions" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/serde.md +msgid "" +"When not to implement: If a type contains sensitive data that should not be erroneously " +"saved to disk or sent over a network, consider not implementing Serialize/Deserialize for " +"that type." msgstr "" -#: src/unsafe-rust/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/serde.md msgid "" -"[`OsStr`](https://doc.rust-lang.org/std/ffi/struct.OsStr.html) and " -"[`OsString`](https://doc.rust-lang.org/std/ffi/struct.OsString.html)" +"Shares security concerns with `Debug`, but given serialization is often used in " +"networking there can be higher stakes." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "OS-specific" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +#, fuzzy +msgid "From & Into" +msgstr "`De` et `Dans`" + +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +msgid "Conversion from one type to another." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "Communicating with the OS" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "Derivable: ❌, without crates like `derive_more`." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "You will convert between all these types:" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +msgid "When to implement: As-needed and convenient." msgstr "" -#: src/unsafe-rust/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +#, fuzzy +msgid "// From String\n" +msgstr "Fonctions" + +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +#, fuzzy +msgid "\"Hello, obvious!\"" +msgstr "Bonjour le monde!" + +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +msgid "// From &str\n" +msgstr "" + +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md msgid "" -"`&str` to `CString`: you need to allocate space for a trailing `\\0` " -"character," +"// A From implementation implies an Into implementation, &str.into() ->\n" +" // ObviousImplementation\n" msgstr "" -#: src/unsafe-rust/exercise.md -msgid "`CString` to `*const i8`: you need a pointer to call C functions," +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +#, fuzzy +msgid "\"Hello, implementation!\"" +msgstr "Mise en œuvre des services" + +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +msgid "The two traits exist to express different areas you'll find conversion in codebases." msgstr "" -#: src/unsafe-rust/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md msgid "" -"`*const i8` to `&CStr`: you need something which can find the trailing `\\0` " -"character," +"`From` provides a constructor-style function, whereas into provides a method on an " +"existing value." msgstr "" -#: src/unsafe-rust/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md msgid "" -"`&CStr` to `&[u8]`: a slice of bytes is the universal interface for \"some " -"unknown data\"," +"Prefer writing `From` implementations for a type you're authoring instead of `Into`." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "" -"`&[u8]` to `&OsStr`: `&OsStr` is a step towards `OsString`, use [`OsStrExt`]" -"(https://doc.rust-lang.org/std/os/unix/ffi/trait.OsStrExt.html) to create it," +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +msgid "The `Into` trait is implemented for any type that implements `From` automatically." msgstr "" -#: src/unsafe-rust/exercise.md +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md msgid "" -"`&OsStr` to `OsString`: you need to clone the data in `&OsStr` to be able to " -"return it and call `readdir` again." +"`Into` is preferred as a trait bound for arguments to functions for clarity of intent for " +"what the function can take." msgstr "" -#: src/unsafe-rust/exercise.md -msgid "" -"The [Nomicon](https://doc.rust-lang.org/nomicon/ffi.html) also has a very " -"useful chapter about FFI." +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/from-into.md +msgid "`T: Into` has clearer intent than `String: From`." msgstr "" -#: src/unsafe-rust/exercise.md -#, fuzzy -msgid "" -"Copy the code below to and fill in the missing " -"functions and methods:" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/try-from-into.md +msgid "TryFrom/TryInto" msgstr "" -"Copiez le code ci-dessous sur et remplissez " -"les champs manquants fonctions et méthodes :" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "\"macos\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/try-from-into.md +msgid "Fallible conversion from one type to another." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "// Opaque type. See https://doc.rust-lang.org/nomicon/ffi.html.\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/try-from-into.md +msgid "Derivable: ❌" msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "" -"// Layout according to the Linux man page for readdir(3), where ino_t and\n" -" // off_t are resolved according to the definitions in\n" -" // /usr/include/x86_64-linux-gnu/{sys/types.h, bits/typesizes.h}.\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/try-from-into.md +msgid "When to implement: As-needed." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "// Layout according to the macOS man page for dir(5).\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/try-from-into.md +msgid "Like `From`/`Into`, prefer implementing `TryFrom` for types rather than `TryInto`." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "\"x86_64\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/try-from-into.md +msgid "Implementations can specify what the error type of the `Result`." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "" -"// See https://github.com/rust-lang/libc/issues/414 and the section on\n" -" // _DARWIN_FEATURE_64_BIT_INODE in the macOS man page for stat(2).\n" -" //\n" -" // \"Platforms that existed before these updates were available\" " -"refers\n" -" // to macOS (as opposed to iOS / wearOS / etc.) on Intel and " -"PowerPC.\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "\"Write to string\" trait, prioritizing readability for an end user." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "\"readdir$INODE64\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "When to implement: As-needed, for errors and other types that an end-user will see." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "" -"// Call opendir and return a Ok value if that worked,\n" -" // otherwise return Err with a message.\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "\"HTTP Error code {code}\"" msgstr "" -#: src/unsafe-rust/exercise.md -msgid "// Keep calling readdir until we get a NULL pointer back.\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "\"Whale attack detected – call Ishmael\"" msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "// Call closedir as needed.\n" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "Prerequisite for the `Error` trait." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -#: src/android/interoperability/with-c/rust.md -msgid "\".\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "" +"If implementing for an error type, focus on providing a descriptive error for users and " +"programmers other than you." msgstr "" -#: src/unsafe-rust/exercise.md src/unsafe-rust/solution.md -msgid "\"files: {:#?}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "" +"Same security considerations as Debug, consider the ways that sensitive data could be " +"exposed in UI or logs." msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"Invalid path: {err}\"" +#: src/idiomatic/foundations-api-design/predictable-api/common-traits/display.md +msgid "Types that implement `Display` automatically have `ToString` implemented for them." msgstr "" -#: src/unsafe-rust/solution.md -msgid "// SAFETY: path.as_ptr() cannot be NULL.\n" +#: src/idiomatic/leveraging-the-type-system.md +msgid "" +"Rust's type system is _expressive_: you can use types and traits to build abstractions " +"that make your code harder to misuse." msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"Could not open {:?}\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "" +"In some cases, you can go as far as enforcing correctness at _compile-time_, with no " +"runtime overhead." msgstr "" -#: src/unsafe-rust/solution.md +#: src/idiomatic/leveraging-the-type-system.md msgid "" -"// Keep calling readdir until we get a NULL pointer back.\n" -" // SAFETY: self.dir is never NULL.\n" +"Types and traits can model concepts and constraints from your business domain. With " +"careful design, you can improve the clarity and maintainability of the entire codebase." msgstr "" -#: src/unsafe-rust/solution.md -msgid "// We have reached the end of the directory.\n" +#: src/idiomatic/leveraging-the-type-system.md +msgid "Additional items speaker may mention:" msgstr "" -#: src/unsafe-rust/solution.md +#: src/idiomatic/leveraging-the-type-system.md +msgid "Rust's type system borrows a lot of ideas from functional programming languages." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system.md msgid "" -"// SAFETY: dirent is not NULL and dirent.d_name is NUL\n" -" // terminated.\n" +"For example, Rust's enums are known as \"algebraic data types\" in languages like Haskell " +"and OCaml. You can take inspiration from learning material geared towards functional " +"languages when looking for guidance on how to design with types. [\"Domain Modeling Made " +"Functional\"](https://pragprog.com/titles/swdddf/domain-modeling-made-functional/) is a " +"great resource on the topic, with examples written in F#." msgstr "" -#: src/unsafe-rust/solution.md -msgid "// SAFETY: self.dir is not NULL.\n" +#: src/idiomatic/leveraging-the-type-system.md +msgid "" +"Despite Rust's functional roots, not all functional design patterns can be easily " +"translated to Rust." msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"Could not close {:?}\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "" +"For example, you must have a solid grasp on a broad selection of advanced topics to " +"design APIs that leverage higher-order functions and higher-kinded types in Rust." msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"no-such-directory\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "" +"Evaluate, on a case-by-case basis, whether a more imperative approach may be easier to " +"implement. Consider using in-place mutation, relying on Rust's borrow-checker and type " +"system to control what can be mutated, and where." msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"Non UTF-8 character in path\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "" +"The same caution should be applied to object-oriented design patterns. Rust doesn't " +"support inheritance, and object decomposition should take into account the constraints " +"introduced by the borrow checker." msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"..\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "" +"Mention that type-level programming can be often used to create \"zero-cost " +"abstractions\", although the label can be misleading: the impact on compile times and " +"code complexity may be significant." msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"foo.txt\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "This segment should take about 7 hours and 30 minutes. It contains:" msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"The Foo Diaries\\n\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "1 hour and 50 minutes" msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"bar.png\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "1 hour and 30 minutes" msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"\\n\"" +#: src/idiomatic/leveraging-the-type-system.md +msgid "1 hour and 35 minutes" msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"crab.rs\"" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md +msgid "A _newtype_ is a wrapper around an existing type, often a primitive:" msgstr "" -#: src/unsafe-rust/solution.md -msgid "\"//! Crab\\n\"" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md +msgid "/// A unique user identifier, implemented as a newtype around `u64`.\n" msgstr "" -#: src/android.md -#, fuzzy -msgid "Welcome to Rust in Android" -msgstr "Bienvenue au jour 1" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md +msgid "Unlike type aliases, newtypes aren't interchangeable with the wrapped type:" +msgstr "" -#: src/android.md -#, fuzzy -msgid "" -"Rust is supported for system software on Android. This means that you can " -"write new services, libraries, drivers or even firmware in Rust (or improve " -"existing code as needed)." +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "// 🛠️❌\n" msgstr "" -"Rust est pris en charge pour le développement de plates-formes natives sur " -"Android. Cela signifie que vous pouvez écrire de nouveaux services de " -"système d'exploitation dans Rust, ainsi que l'extension prestations " -"existantes." -#: src/android.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md msgid "" -"We will attempt to call Rust from one of your own projects today. So try to " -"find a little corner of your code base where we can move some lines of code " -"to Rust. The fewer dependencies and \"exotic\" types the better. Something " -"that parses some raw bytes would be ideal." +"The Rust compiler won't let you use methods or operators defined on the underlying type " +"either:" msgstr "" -"Nous allons essayer d'appeler Rust depuis l'un de vos propres projets " -"aujourd'hui. Alors essayez de trouver un petit coin de votre code où nous " -"pouvons déplacer quelques lignes de code vers Rust. Le moins il y a de " -"dépendances et de types \"exotiques\", le mieux c'est. Quelque chose qui " -"analyse quelques octets de donnée brute serait idéal." -#: src/android.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md msgid "" -"The speaker may mention any of the following given the increased use of Rust " -"in Android:" +"Students should have encountered the newtype pattern in the \"Fundamentals\" course, when " +"they learned about [tuple structs](../../user-defined-types/tuple-structs.md)." msgstr "" -#: src/android.md -msgid "" -"Service example: [DNS over HTTP](https://security.googleblog.com/2022/07/dns-" -"over-http3-in-android.html)" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md +msgid "Run the example to show students the error message from the compiler." msgstr "" -#: src/android.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md msgid "" -"Libraries: [Rutabaga Virtual Graphics Interface](https://crosvm.dev/book/" -"appendix/rutabaga_gfx.html)" +"Modify the example to use a typealias instead of a newtype, such as `type MessageId = " +"u64`. The modified example should compile, thus highlighting the differences between the " +"two approaches." msgstr "" -#: src/android.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern.md msgid "" -"Kernel Drivers: [Binder](https://lore.kernel.org/rust-for-linux/20231101-" -"rust-binder-v1-0-08ba9197f637@google.com/)" +"Stress that newtypes, out of the box, have no behaviour attached to them. You need to be " +"intentional about which methods and operators you are willing to forward from the " +"underlying type. In our `UserId` example, it is reasonable to allow comparisons between " +"`UserId`s, but it wouldn't make sense to allow arithmetic operations like addition or " +"subtraction." msgstr "" -#: src/android.md -msgid "" -"Firmware: [pKVM firmware](https://security.googleblog.com/2023/10/bare-metal-" -"rust-in-android.html)" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +msgid "When a function takes multiple arguments of the same type, call sites are unclear:" msgstr "" -#: src/android/setup.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +#: src/idiomatic/leveraging-the-type-system/raii.md +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/root.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "// [...]\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md #, fuzzy +msgid "\"username\"" +msgstr "Nom du registre" + +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md msgid "" -"We will be using a Cuttlefish Android Virtual Device to test our code. Make " -"sure you have access to one or create a new one with:" +"// In another part of the codebase, we swap arguments by mistake.\n" +"// Bug (best case), security vulnerability (worst case)\n" msgstr "" -"Nous utiliserons un appareil virtuel Android pour tester notre code. Assurez-" -"vous que vous avez accéder à un ou en créer un nouveau avec :" -#: src/android/setup.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +msgid "The newtype pattern can prevent this class of errors at compile time:" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md msgid "" -"Please see the [Android Developer Codelab](https://source.android.com/docs/" -"setup/start) for details." +"Run both examples to show students the successful compilation for the original example, " +"and the compiler error returned by the modified example." msgstr "" -"Veuillez consulter le \\[Développeur Android Codelab\\] (https://source." -"android.com/docs/setup/start) pour plus de détails." -#: src/android/setup.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md msgid "" -"Cuttlefish is a reference Android device designed to work on generic Linux " -"desktops. MacOS support is also planned." +"Stress the _semantic_ angle. The newtype pattern should be leveraged to use distinct " +"types for distinct concepts, thus ruling out this class of errors entirely." msgstr "" -#: src/android/setup.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md msgid "" -"The Cuttlefish system image maintains high fidelity to real devices, and is " -"the ideal emulator to run many Rust use cases." +"Nonetheless, note that there are legitimate scenarios where a function may take multiple " +"arguments of the same type. In those scenarios, if correctness is of paramount " +"importance, consider using a struct with named fields as input:" msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "The Android build system (Soong) supports Rust via a number of modules:" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +msgid "// No need to check the definition of the `login` function to spot the issue.\n" msgstr "" -"Le système de construction Android (Soong) prend en charge Rust via un " -"certain nombre de modules :" -#: src/android/build-rules.md -#, fuzzy -msgid "Module Type" -msgstr "Type de module" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/semantic-confusion.md +msgid "" +"Users are forced, at the callsite, to assign values to each field, thus increasing the " +"likelihood of spotting bugs." +msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "Description" -msgstr "Descriptif" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md +msgid "The newtype pattern can be leveraged to enforce _invariants_." +msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "`rust_binary`" -msgstr "`rust_binaire`" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md +msgid "// Other validation checks...\n" +msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "Produces a Rust binary." -msgstr "Produit un binaire Rust." +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md +msgid "" +"The newtype pattern, combined with Rust's module and visibility system, can be used to " +"_guarantee_ that instances of a given type satisfy a set of invariants." +msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "`rust_library`" -msgstr "`rust_library`" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md +msgid "" +"In the example above, the raw `String` stored inside the `Username` struct can't be " +"accessed directly from other modules or crates, since it's not marked as `pub` or " +"`pub(in ...)`. Consumers of the `Username` type are forced to use the `new` method to " +"create instances. In turn, `new` performs validation, thus ensuring that all instances of " +"`Username` satisfy those checks." +msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "Produces a Rust library, and provides both `rlib` and `dylib` variants." +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md +msgid "" +"The `as_str` method allows consumers to access the raw string representation (e.g., to " +"store it in a database). However, consumers can't modify the underlying value since " +"`&str`, the returned type, restricts them to read-only access." msgstr "" -"Produit une bibliothèque Rust et fournit les variantes `rlib` et `dylib`." -#: src/android/build-rules.md -#, fuzzy -msgid "`rust_ffi`" -msgstr "`rust_ffi`" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md +msgid "Type-level invariants have second-order benefits." +msgstr "" -#: src/android/build-rules.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/parse-don-t-validate.md msgid "" -"Produces a Rust C library usable by `cc` modules, and provides both static " -"and shared variants." +"The input is validated once, at the boundary, and the rest of the program can rely on the " +"invariants being upheld. We can avoid redundant validation and \"defensive programming\" " +"checks throughout the program, reducing noise and improving performance." msgstr "" -"Produit une bibliothèque Rust C utilisable par les modules `cc` et fournit " -"des variantes statiques et partagées." -#: src/android/build-rules.md -#, fuzzy -msgid "`rust_proc_macro`" -msgstr "`rust_proc_macro`" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md +msgid "Is It Truly Encapsulated?" +msgstr "" -#: src/android/build-rules.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md msgid "" -"Produces a `proc-macro` Rust library. These are analogous to compiler " -"plugins." +"You must evaluate _the entire API surface_ exposed by a newtype to determine if " +"invariants are indeed bullet-proof. It is crucial to consider all possible interactions, " +"including trait implementations, that may allow users to bypass validation checks." msgstr "" -"Produit une bibliothèque Rust `proc-macro`. Ceux-ci sont analogues aux " -"plugins du compilateur." - -#: src/android/build-rules.md -#, fuzzy -msgid "`rust_test`" -msgstr "`rust_test`" -#: src/android/build-rules.md -#, fuzzy -msgid "Produces a Rust test binary that uses the standard Rust test harness." +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md +msgid "// Validation checks...\n" msgstr "" -"Produit un binaire de test Rust qui utilise le harnais de test Rust standard." -#: src/android/build-rules.md -#, fuzzy -msgid "`rust_fuzz`" -msgstr "`rust_fuzz`" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md +msgid "// ‼️\n" +msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "Produces a Rust fuzz binary leveraging `libfuzzer`." -msgstr "Produit un exécutable Rust fuzz utilisant `libfuzzer`." +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md +msgid "`DerefMut` allows users to get a mutable reference to the wrapped value." +msgstr "" -#: src/android/build-rules.md -#, fuzzy -msgid "`rust_protobuf`" -msgstr "`rust_protobuf`" +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md +msgid "" +"The mutable reference can be used to modify the underlying data in ways that may violate " +"the invariants enforced by `Username::new`!" +msgstr "" -#: src/android/build-rules.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md msgid "" -"Generates source and produces a Rust library that provides an interface for " -"a particular protobuf." +"When auditing the API surface of a newtype, you can narrow down the review scope to " +"methods and traits that provide mutable access to the underlying data." msgstr "" -"Génère la source et produit une bibliothèque Rust qui fournit une interface " -"pour un protobuf particulier." -#: src/android/build-rules.md +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md #, fuzzy -msgid "`rust_bindgen`" -msgstr "`rust_bindgen`" +msgid "Remind students of privacy boundaries." +msgstr "Les modules sont une limite de confidentialité :" -#: src/android/build-rules.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/newtype-pattern/is-it-encapsulated.md msgid "" -"Generates source and produces a Rust library containing Rust bindings to C " -"libraries." +"In particular, functions and methods defined in the same module of the newtype can access " +"its underlying data directly. If possible, move the newtype definition to its own " +"separate module to reduce the scope of the audit." msgstr "" -"Génère la source et produit une bibliothèque Rust contenant des liaisons " -"Rust aux bibliothèques C." -#: src/android/build-rules.md +#: src/idiomatic/leveraging-the-type-system/raii.md #, fuzzy -msgid "We will look at `rust_binary` and `rust_library` next." -msgstr "Nous examinerons ensuite `rust_binary` et `rust_library`." +msgid "RAII: `Drop` trait" +msgstr "Le trait `Lâcher`" -#: src/android/build-rules.md -msgid "Additional items speaker may mention:" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "" +"RAII (**R**esource **A**cquisition **I**s **I**nitialization) ties the lifetime of a " +"resource to the lifetime of a value." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "" +"[Rust uses RAII to manage memory](https://doc.rust-lang.org/rust-by-example/scope/raii." +"html), and the `Drop` trait allows you to extend this to other resources, such as file " +"descriptors or locks." msgstr "" -#: src/android/build-rules.md -msgid "" -"Cargo is not optimized for multi-language repos, and also downloads packages " -"from the internet." +#: src/idiomatic/leveraging-the-type-system/raii.md +#, fuzzy +msgid "b\"example\"" +msgstr "Exemple" + +#: src/idiomatic/leveraging-the-type-system/raii.md +#, fuzzy +msgid "\"example.txt\"" +msgstr "Exemple" + +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "\"content: {:?}\"" msgstr "" -#: src/android/build-rules.md -msgid "" -"For compliance and performance, Android must have crates in-tree. It must " -"also interop with C/C++/Java code. Soong fills that gap." +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "Easy to miss: `file.close()` is never called. Ask the class if they noticed." msgstr "" -#: src/android/build-rules.md +#: src/idiomatic/leveraging-the-type-system/raii.md msgid "" -"Soong has many similarities to Bazel, which is the open-source variant of " -"Blaze (used in google3)." +"To release the file descriptor correctly, `file.close()` must be called after the last " +"use — and also in early-return paths in case of errors." msgstr "" -#: src/android/build-rules.md +#: src/idiomatic/leveraging-the-type-system/raii.md msgid "" -"There is a plan to transition [Android](https://source.android.com/docs/" -"setup/build/bazel/introduction), [ChromeOS](https://chromium.googlesource." -"com/chromiumos/bazel/), and [Fuchsia](https://source.android.com/docs/setup/" -"build/bazel/introduction) to Bazel." +"Instead of relying on the user to call `close()`, we can implement the `Drop` trait to " +"release the resource automatically. This ties cleanup to the lifetime of the `File` value." msgstr "" -#: src/android/build-rules.md -msgid "Learning Bazel-like build rules is useful for all Rust OS developers." +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "// libc::close(...);\n" msgstr "" -#: src/android/build-rules.md -msgid "Fun fact: Data from Star Trek is a Soong-type Android." +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "\"file descriptor was closed\"" msgstr "" -#: src/android/build-rules/binary.md -msgid "Rust Binaries" -msgstr "Binaires Rust" - -#: src/android/build-rules/binary.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/raii.md msgid "" -"Let us start with a simple application. At the root of an AOSP checkout, " -"create the following files:" +"Note that `Drop::drop()` cannot return a `Result`. Any failures must be handled " +"internally or ignored. In the standard library, errors during FD closure inside `Drop` " +"are silently discarded. See the implementation: " msgstr "" -"Commençons par une application simple. A la racine d'une caisse AOSP, créez " -"les fichiers suivants :" -#: src/android/build-rules/binary.md src/android/build-rules/library.md +#: src/idiomatic/leveraging-the-type-system/raii.md #, fuzzy -msgid "_hello_rust/Android.bp_:" -msgstr "_hello_rust/Android.bp_ :" +msgid "When is `Drop::drop` called?" +msgstr "Pourquoi `Drop::drop` ne prend-il pas `self` ?" -#: src/android/build-rules/binary.md -msgid "\"hello_rust\"" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "" +"Normally, when the `file` variable in `main()` goes out of scope (either on return or due " +"to a panic), `drop()` is called automatically." msgstr "" -#: src/android/build-rules/binary.md src/android/build-rules/library.md -#: src/android/logging.md -#, fuzzy -msgid "\"src/main.rs\"" -msgstr "`src/main.rs` :" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "" +"If the file is moved into another function (as is this case with `File::close()`), the " +"value is dropped when that function returns — not in `main`." +msgstr "" -#: src/android/build-rules/binary.md src/android/build-rules/library.md -#, fuzzy -msgid "_hello_rust/src/main.rs_:" -msgstr "_hello_rust/src/main.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "In contrast, C++ runs destructors in the original scope even for moved-from values." +msgstr "" -#: src/android/build-rules/binary.md src/android/build-rules/library.md -msgid "//! Rust demo.\n" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "" +"Demo: insert `panic!(\"oops\")` at the start of `read_to_end()` and run it. `drop()` " +"still runs during unwinding." msgstr "" -#: src/android/build-rules/binary.md src/android/build-rules/library.md -msgid "/// Prints a greeting to standard output.\n" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "The `Drop` trait has another important limitation: it is not `async`." msgstr "" -#: src/android/build-rules/binary.md src/exercises/chromium/build-rules.md -msgid "\"Hello from Rust!\"" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "" +"This means you cannot `await` inside a destructor, which is often needed when cleaning up " +"asynchronous resources like sockets, database connections, or tasks that must signal " +"completion to another system." msgstr "" -#: src/android/build-rules/binary.md -#, fuzzy -msgid "You can now build, push, and run the binary:" -msgstr "Vous pouvez maintenant compiler, envoyer et exécuter le binaire :" +#: src/idiomatic/leveraging-the-type-system/raii.md +msgid "" +"Learn more: " +msgstr "" -#: src/android/build-rules/binary.md +#: src/idiomatic/leveraging-the-type-system/raii.md msgid "" -"```shell\n" -"m hello_rust\n" -"adb push \"$ANDROID_PRODUCT_OUT/system/bin/hello_rust\" /data/local/tmp\n" -"adb shell /data/local/tmp/hello_rust\n" -"```" +"There is an experimental `AsyncDrop` trait available on nightly: " msgstr "" -#: src/android/build-rules/library.md -msgid "Rust Libraries" -msgstr "Bibliothèques Rust" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "Drop can be skipped" +msgstr "" -#: src/android/build-rules/library.md -#, fuzzy -msgid "You use `rust_library` to create a new Rust library for Android." +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "There are cases where destructors will not run." msgstr "" -"Vous utilisez `rust_library` pour créer une nouvelle bibliothèque Rust pour " -"Android." -#: src/android/build-rules/library.md -#, fuzzy -msgid "Here we declare a dependency on two libraries:" -msgstr "Ici, nous déclarons une dépendance sur deux bibliothèques :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "\"OwnedFd::drop() called with raw fd: {:?}\"" +msgstr "" -#: src/android/build-rules/library.md -#, fuzzy -msgid "`libgreeting`, which we define below," -msgstr "`libgreeting`, que nous définissons ci-dessous," +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "\"TmpFile::drop() called with owned fd: {:?}\"" +msgstr "" -#: src/android/build-rules/library.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md msgid "" -"`libtextwrap`, which is a crate already vendored in [`external/rust/crates/`]" -"(https://cs.android.com/android/platform/superproject/+/master:external/rust/" -"crates/)." +"// libc::unlink(\"/tmp/file\")\n" +" // panic!(\"TmpFile::drop() panics\");\n" msgstr "" -"`libtextwrap`, qui est une caisse déjà disponible dans \\[`external/rust/" -"crates/`\\]\\[crates\\]." -#: src/android/build-rules/library.md -msgid "\"hello_rust_with_dep\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "\"TmpFile::close(): not implemented yet\"" msgstr "" -#: src/android/build-rules/library.md -msgid "\"libgreetings\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "// std::mem::forget(file);\n" msgstr "" -#: src/android/build-rules/library.md -msgid "\"libtextwrap\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "// file.close();\n" msgstr "" -#: src/android/build-rules/library.md -msgid "// Need this to avoid dynamic link error.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"Drop is not guaranteed to always run. There is a number of cases when drop is skipped: " +"the program can crash or exit, the value with the drop implementation can be leaked etc." msgstr "" -#: src/android/build-rules/library.md -msgid "\"greetings\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"In the version that calls [`std::process::exit`](https://doc.rust-lang.org/std/process/fn." +"exit.html), `TmpFile::drop()` is never run because `exit()` terminates the process " +"immediately without any opportunity for a `drop()` method to be called." msgstr "" -#: src/android/build-rules/library.md -#: src/android/aidl/example-service/service.md src/android/testing.md -#: src/android/interoperability/java.md -#, fuzzy -msgid "\"src/lib.rs\"" -msgstr "`src/main.rs` :" - -#: src/android/build-rules/library.md -#, fuzzy -msgid "_hello_rust/src/lib.rs_:" -msgstr "_hello_rust/src/lib.rs_ :" - -#: src/android/build-rules/library.md -msgid "//! Greeting library.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"You can prevent accidental use of `exit` by denying the [`clippy::exit`](https://rust-" +"lang.github.io/rust-clippy/stable/index.html#exit) lint." msgstr "" -#: src/android/build-rules/library.md -msgid "/// Greet `name`.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"If you remove the `std::process::exit(0)` line, each `drop()` method in this simple case " +"will run in turn." msgstr "" -#: src/android/build-rules/library.md -msgid "\"Hello {name}, it is very nice to meet you!\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"Try uncommenting the [`std::mem::forget`](https://doc.rust-lang.org/std/mem/fn.forget." +"html) call. What do you think will happen?" msgstr "" -#: src/android/build-rules/library.md -#, fuzzy -msgid "You build, push, and run the binary like before:" -msgstr "Vous construisez, poussez et exécutez le binaire comme avant :" - -#: src/android/build-rules/library.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md msgid "" -"```shell\n" -"m hello_rust_with_dep\n" -"adb push \"$ANDROID_PRODUCT_OUT/system/bin/hello_rust_with_dep\" /data/local/" -"tmp\n" -"adb shell /data/local/tmp/hello_rust_with_dep\n" -"```" +"`mem::forget()` takes ownership and \"forgets\" about the value `file` without running " +"its **destructor** `Drop::drop()`. The destructor of `owned_fd` is still run." msgstr "" -#: src/android/aidl.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md msgid "" -"The [Android Interface Definition Language (AIDL)](https://developer.android." -"com/guide/components/aidl) is supported in Rust:" +"Remove the `mem::forget()` call, then uncomment the `file.close()` call below it. What do " +"you expect now?" msgstr "" -"Le [langage de définition d'interface Android (AIDL)](https://developer." -"android.com/guide/components/aidl) est pris en charge dans Rust :" -#: src/android/aidl.md -#, fuzzy -msgid "Rust code can call existing AIDL servers," -msgstr "Le code Rust peut appeler des serveurs AIDL existants," +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"With the default `panic = \"unwind\"` setting, the stack still unwinds and destructors " +"run, even when the panic starts in `main`." +msgstr "" -#: src/android/aidl.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md #, fuzzy -msgid "You can create new AIDL servers in Rust." -msgstr "Vous pouvez créer de nouveaux serveurs AIDL dans Rust." +msgid "" +"With [`panic = \"abort\"`](https://doc.rust-lang.org/cargo/reference/profiles.html#panic) " +"no destructors are run." +msgstr "[Espaces de travail](https://doc.rust-lang.org/cargo/reference/workspaces.html)" -#: src/android/aidl/birthday-service.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md msgid "" -"To illustrate how to use Rust with Binder, we're going to walk through the " -"process of creating a Binder interface. We're then going to both implement " -"the described service and write client code that talks to that service." +"As a last step, uncomment the `panic!` inside `TmpFile::drop()` and run it. Ask the " +"class: which destructors run before the abort?" msgstr "" -#: src/android/aidl/example-service/interface.md -#, fuzzy -msgid "AIDL Interfaces" -msgstr "Interfaces AIDL" - -#: src/android/aidl/example-service/interface.md -#, fuzzy -msgid "You declare the API of your service using an AIDL interface:" -msgstr "Vous déclarez l'API de votre service à l'aide d'une interface AIDL :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "After a double panic, Rust no longer guarantees that remaining destructors will run:" +msgstr "" -#: src/android/aidl/example-service/interface.md -#: src/android/aidl/example-service/service-bindings.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md msgid "" -"_birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl_:" +"Some cleanup that was already in progress may still complete (for example, field " +"destructors of the value currently being dropped)," msgstr "" -"_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService." -"aidl_ :" -#: src/android/aidl/example-service/interface.md -#: src/android/aidl/example-service/service-bindings.md -#: src/android/aidl/example-service/changing-definition.md -msgid "/** Birthday service interface. */" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "but anything scheduled later in the unwind path might be skipped entirely." msgstr "" -#: src/android/aidl/example-service/interface.md -#: src/android/aidl/example-service/service-bindings.md -#: src/android/aidl/example-service/changing-definition.md -msgid "/** Generate a Happy Birthday message. */" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"This is why we say you cannot rely solely on `drop()` for critical external cleanup, nor " +"assume that a double panic aborts without running any further destructors." msgstr "" -#: src/android/aidl/example-service/interface.md -#, fuzzy -msgid "_birthday_service/aidl/Android.bp_:" -msgstr "_service_anniversaire/aidl/Android.bp_ :" - -#: src/android/aidl/example-service/interface.md -msgid "\"com.example.birthdayservice\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"Some languages forbid or restrict exceptions in destructors. Rust allows panicking in " +"`Drop::drop`, but it is almost never a good idea, since it can disrupt unwinding and lead " +"to unpredictable cleanup. It is best avoided unless there is a very specific need, such " +"as in the case of a **drop bomb**." msgstr "" -#: src/android/aidl/example-service/interface.md -#, fuzzy -msgid "\"com/example/birthdayservice/*.aidl\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"Drop is suitable for cleaning up resources within the scope of a process, but it is not " +"the right tool for providing hard guarantees that something happens outside of the " +"process (e.g., on local disk, or in another service in a distributed system)." msgstr "" -"_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService." -"aidl_ :" -#: src/android/aidl/example-service/interface.md -msgid "// Rust is not enabled by default\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md +msgid "" +"For example, deleting a temporary file in `drop()` is fine in a toy example, but in a " +"real program you would still need an external cleanup mechanism such as a temp file " +"reaper." msgstr "" -#: src/android/aidl/example-service/interface.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_skipped.md msgid "" -"Note that the directory structure under the `aidl/` directory needs to match " -"the package name used in the AIDL file, i.e. the package is `com.example." -"birthdayservice` and the file is at `aidl/com/example/IBirthdayService.aidl`." +"In contrast, we can rely on `drop()` to unlock a mutex, since it is a process-local " +"resource. If `drop()` is skipped and the mutex is left locked, it has no lasting effects " +"outside the process." msgstr "" -#: src/android/aidl/example-service/service-bindings.md -msgid "Generated Service API" +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md +msgid "Mutex and MutexGuard" msgstr "" -#: src/android/aidl/example-service/service-bindings.md +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md msgid "" -"Binder generates a trait corresponding to the interface definition. trait to " -"talk to the service." +"In earlier examples, RAII was used to manage concrete resources like file descriptors. " +"With a `Mutex`, the \"resource\" is mutable access to a value. You access the value by " +"calling `lock`, which then returns a `MutexGuard` which will unlock the `Mutex` " +"automatically when dropped." msgstr "" -#: src/android/aidl/example-service/service-bindings.md -#, fuzzy -msgid "_Generated trait_:" -msgstr "Rust non sécurisé (_unsafe_)" +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md +msgid "\"{guard:?}\"" +msgstr "" -#: src/android/aidl/example-service/service-bindings.md +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md msgid "" -"Your service will need to implement this trait, and your client will use " -"this trait to talk to the service." +"A `Mutex` controls exclusive access to a value. Unlike earlier RAII examples, the " +"resource here is logical: temporary exclusive access to the data inside." msgstr "" -#: src/android/aidl/example-service/service-bindings.md +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md msgid "" -"The generated bindings can be found at `out/soong/.intermediates//`." +"This right is represented by a `MutexGuard`. Only one guard for this mutex can exist at a " +"time. While it lives, it provides `&mut T` access." msgstr "" -#: src/android/aidl/example-service/service-bindings.md +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md msgid "" -"Point out how the generated function signature, specifically the argument " -"and return types, correspond the interface definition." +"Although `lock()` takes `&self`, it returns a `MutexGuard` with mutable access. This " +"works through _interior mutability_, where a type manages its own borrowing rules " +"internally to allow mutation through `&self`." msgstr "" -#: src/android/aidl/example-service/service-bindings.md +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md msgid "" -"`String` for an argument results in a different Rust type than `String` as a " -"return type." +"`MutexGuard` implements `Deref` and `DerefMut`, making access ergonomic. You lock the " +"mutex and use the guard like a `&mut T`." msgstr "" -#: src/android/aidl/example-service/service.md -#, fuzzy -msgid "Service Implementation" -msgstr "Mise en œuvre des services" - -#: src/android/aidl/example-service/service.md -#, fuzzy -msgid "We can now implement the AIDL service:" -msgstr "Nous pouvons maintenant implémenter le service AIDL :" - -#: src/android/aidl/example-service/service.md -#: src/android/aidl/example-service/changing-implementation.md -#, fuzzy -msgid "_birthday_service/src/lib.rs_:" -msgstr "_service_anniversaire/src/lib.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii/mutex.md +msgid "" +"The mutex is released by `MutexGuard::drop()`. You never call an explicit unlock function." +msgstr "" -#: src/android/aidl/example-service/service.md -#, fuzzy -msgid "/// The `IBirthdayService` implementation.\n" -msgstr "Mise en œuvre des services" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "" +"A **drop guard** in Rust is a temporary object that performs some kind of cleanup when it " +"goes out of scope. In the case of `Mutex`, the `lock` method returns a `MutexGuard` that " +"automatically unlocks the mutex on `drop`:" +msgstr "" -#: src/android/aidl/example-service/service.md -#: src/android/aidl/example-service/changing-implementation.md -#: src/android/aidl/types/file-descriptor.md -msgid "\"Happy Birthday {name}, congratulations with the {years} years!\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "The example above shows a simplified `Mutex` and its associated guard." msgstr "" -#: src/android/aidl/example-service/service.md -#: src/android/aidl/example-service/server.md -#: src/android/aidl/example-service/client.md -#, fuzzy -msgid "_birthday_service/Android.bp_:" -msgstr "_service_anniversaire/Android.bp_ :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "" +"Even though it is not a production-ready implementation, it illustrates the core idea:" +msgstr "" -#: src/android/aidl/example-service/service.md -#: src/android/aidl/example-service/server.md -#, fuzzy -msgid "\"libbirthdayservice\"" -msgstr "_service_anniversaire/src/lib.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "the guard represents exclusive access," +msgstr "" -#: src/android/aidl/example-service/service.md -#: src/android/aidl/example-service/server.md -#: src/android/aidl/example-service/client.md -#, fuzzy -msgid "\"birthdayservice\"" -msgstr "_service_anniversaire/src/lib.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "and its `Drop` implementation releases the lock when it goes out of scope." +msgstr "" -#: src/android/aidl/example-service/service.md -#: src/android/aidl/example-service/server.md -#: src/android/aidl/example-service/client.md -msgid "\"com.example.birthdayservice-rust\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "" +"This example shows a C++ style mutex that does not contain the data it protects. While " +"this is non-idiomatic in Rust, the goal here is only to illustrate the core idea of a " +"drop guard, not to demonstrate a proper Rust mutex design." msgstr "" -#: src/android/aidl/example-service/service.md -#: src/android/aidl/example-service/server.md -#: src/android/aidl/example-service/client.md -msgid "\"libbinder_rs\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "For brevity, several features are omitted:" msgstr "" -#: src/android/aidl/example-service/service.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md msgid "" -"Point out the path to the generated `IBirthdayService` trait, and explain " -"why each of the segments is necessary." +"A real `Mutex` stores the protected value inside the mutex. \n" +"This toy example omits the value entirely to focus only on the drop guard mechanism." msgstr "" -#: src/android/aidl/example-service/service.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md msgid "" -"TODO: What does the `binder::Interface` trait do? Are there methods to " -"override? Where source?" +"Ergonomic access via `Deref` and `DerefMut` on `MutexGuard` (letting the guard behave " +"like a `&T` or `&mut T`)." msgstr "" -#: src/android/aidl/example-service/server.md -#, fuzzy -msgid "AIDL Server" -msgstr "Serveur AIDL" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "A fully blocking `.lock()` method and a non-blocking `try_lock` variant." +msgstr "" -#: src/android/aidl/example-service/server.md -#, fuzzy -msgid "Finally, we can create a server which exposes the service:" -msgstr "Enfin, nous pouvons créer un serveur qui expose le service :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_guards.md +msgid "" +"You can explore the [`Mutex` implementation in Rust’s std library](https://doc.rust-lang." +"org/std/sync/struct.Mutex.html) as an example of a production-ready mutex. The [`Mutex` " +"from the `parking_lot` crate](https://docs.rs/parking_lot/latest/parking_lot/type.Mutex." +"html) is another worthwhile reference." +msgstr "" -#: src/android/aidl/example-service/server.md -#, fuzzy -msgid "_birthday_service/src/server.rs_:" -msgstr "_service_anniversaire/src/server.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "Drop Bombs: Enforcing API Correctness" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "" +"Use `Drop` to enforce invariants and detect incorrect API usage. A \"drop bomb\" panics " +"if a value is dropped without being explicitly finalized." +msgstr "" -#: src/android/aidl/example-service/server.md -msgid "//! Birthday service.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "" +"This pattern is often used when the finalizing operation (like `commit()` or " +"`rollback()`) needs to return a `Result`, which cannot be done from `Drop`." msgstr "" -#: src/android/aidl/example-service/server.md -msgid "/// Entry point for birthday service.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "\"COMMIT\"" msgstr "" -#: src/android/aidl/example-service/server.md -msgid "\"Failed to register service\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "\"Transaction dropped without commit!\"" msgstr "" -#: src/android/aidl/example-service/server.md -#, fuzzy -msgid "\"birthday_server\"" -msgstr "_service_anniversaire/src/lib.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "" +"// Use `tx` to build the transaction, then commit it.\n" +" // Comment out the call to `commit` to see the panic.\n" +msgstr "" -#: src/android/aidl/example-service/server.md -#, fuzzy -msgid "\"src/server.rs\"" -msgstr "`src/main.rs` :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "In some systems, a value must be finalized by a specific API before it is dropped." +msgstr "" -#: src/android/aidl/example-service/server.md -#: src/android/aidl/example-service/client.md -msgid "// To avoid dynamic link error.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "For example, a `Transaction` might need to be committed or rolled back." msgstr "" -#: src/android/aidl/example-service/server.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md msgid "" -"The process for taking a user-defined service implementation (in this case " -"the `BirthdayService` type, which implements the `IBirthdayService`) and " -"starting it as a Binder service has multiple steps, and may appear more " -"complicated than students are used to if they've used Binder from C++ or " -"another language. Explain to students why each step is necessary." +"A drop bomb ensures that a value like `Transaction` cannot be silently dropped in an " +"unfinished state. The destructor panics if the transaction has not been explicitly " +"finalized (for example, with `commit()`)." msgstr "" -#: src/android/aidl/example-service/server.md -msgid "Create an instance of your service type (`BirthdayService`)." +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "" +"The finalizing operation (such as `commit()`) usually takes `self` by value. This ensures " +"that once the transaction is finalized, the original object can no longer be used." msgstr "" -#: src/android/aidl/example-service/server.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md msgid "" -"Wrap the service object in corresponding `Bn*` type (`BnBirthdayService` in " -"this case). This type is generated by Binder and provides the common Binder " -"functionality that would be provided by the `BnBinder` base class in C++. We " -"don't have inheritance in Rust, so instead we use composition, putting our " -"`BirthdayService` within the generated `BnBinderService`." +"A common reason to use this pattern is when cleanup cannot be done in `Drop`, either " +"because it is fallible or asynchronous." msgstr "" -#: src/android/aidl/example-service/server.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md msgid "" -"Call `add_service`, giving it a service identifier and your service object " -"(the `BnBirthdayService` object in the example)." +"This pattern is appropriate even in public APIs. It can help users catch bugs early when " +"they forget to explicitly finalize a transactional object." msgstr "" -#: src/android/aidl/example-service/server.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md msgid "" -"Call `join_thread_pool` to add the current thread to Binder's thread pool " -"and start listening for connections." +"If cleanup can safely happen in `Drop`, some APIs choose to panic only in debug builds. " +"Whether this is appropriate depends on the guarantees your API must enforce." msgstr "" -#: src/android/aidl/example-service/deploy.md -#, fuzzy -msgid "We can now build, push, and start the service:" -msgstr "Nous pouvons maintenant créer, pousser et démarrer le service :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "" +"Panicking in release builds is reasonable when silent misuse would cause major " +"correctness or security problems." +msgstr "" -#: src/android/aidl/example-service/deploy.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md msgid "" -"```shell\n" -"m birthday_server\n" -"adb push \"$ANDROID_PRODUCT_OUT/system/bin/birthday_server\" /data/local/" -"tmp\n" -"adb root\n" -"adb shell /data/local/tmp/birthday_server\n" -"```" +"Question: Why do we need an `active` flag inside `Transaction`? Why can't `drop()` panic " +"unconditionally?" msgstr "" -#: src/android/aidl/example-service/deploy.md -#, fuzzy -msgid "In another terminal, check that the service runs:" -msgstr "Dans un autre terminal, vérifiez que le service s'exécute :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "" +"Expected answer: `commit()` takes `self` by value and runs `drop()`, which would panic." +msgstr "" -#: src/android/aidl/example-service/deploy.md -#, fuzzy -msgid "You can also call the service with `service call`:" -msgstr "Vous pouvez également appeler le service avec `service call` :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "More to explore" +msgstr "" -#: src/android/aidl/example-service/client.md -#, fuzzy -msgid "AIDL Client" -msgstr "Client AIDL" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "Several related patterns help enforce correct teardown or prevent accidental drops." +msgstr "" -#: src/android/aidl/example-service/client.md -#, fuzzy -msgid "Finally, we can create a Rust client for our new service." -msgstr "Enfin, nous pouvons créer un client Rust pour notre nouveau service." +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb.md +msgid "" +"The [`drop_bomb` crate](https://docs.rs/drop_bomb/latest/drop_bomb/): A small utility " +"that panics if dropped unless explicitly defused with `.defuse()`. Comes with a " +"`DebugDropBomb` variant that only activates in debug builds." +msgstr "" -#: src/android/aidl/example-service/client.md -#: src/android/aidl/example-service/changing-implementation.md -#, fuzzy -msgid "_birthday_service/src/client.rs_:" -msgstr "_service_anniversaire/src/client.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "Drop Bombs: using `std::mem::forget`" +msgstr "" -#: src/android/aidl/example-service/client.md -msgid "/// Call the birthday service.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "// Defuse the drop bomb by preventing Drop from ever running.\n" msgstr "" -#: src/android/aidl/example-service/client.md src/android/aidl/types/objects.md -#: src/android/aidl/types/parcelables.md -#: src/android/aidl/types/file-descriptor.md -msgid "\"Failed to connect to BirthdayService\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "// This is the \"drop bomb\"\n" msgstr "" -#: src/android/aidl/example-service/client.md -msgid "// Call the service.\n" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "" +"This example removes the flag from the previous slide and makes the drop method panic " +"unconditionally. To avoid that panic on a successful commit, the commit method now takes " +"ownership of the transaction and calls [`std::mem::forget`](https://doc.rust-lang.org/std/" +"mem/fn.forget.html), which prevents the `Drop::drop()` method from running." msgstr "" -#: src/android/aidl/example-service/client.md -msgid "\"{msg}\"" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "" +"If the forgotten value owned heap allocated memory that would normally be freed in its " +"`drop()` implementation, one consequence is a memory leak. That is not the case for the " +"`Transaction` in the example above, since it does not own any heap memory." msgstr "" -#: src/android/aidl/example-service/client.md -#, fuzzy -msgid "\"birthday_client\"" -msgstr "_service_anniversaire/src/client.rs_ :" +#: src/idiomatic/leveraging-the-type-system/raii/drop_bomb_forget.md +msgid "" +"We can avoid needing a runtime flag by using `mem::forget()` in a tactical way. When the " +"transaction commits successfully, we can defuse the drop bomb by calling `std::mem::" +"forget` on the value, which prevents its `Drop` implementation from running." +msgstr "" -#: src/android/aidl/example-service/client.md +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md #, fuzzy -msgid "\"src/client.rs\"" -msgstr "`src/main.rs` :" +msgid "" +"Below are the signatures for the [`drop()`](https://doc.rust-lang.org/std/mem/fn.drop." +"html) and [`forget()`](https://doc.rust-lang.org/std/mem/fn.forget.html) functions:" +msgstr "" +"[`Read`](https://doc.rust-lang.org/std/io/trait.Read.html) et [`Write`](https://doc.rust-" +"lang.org/std/io/trait.Write.html) utilisés pour IO," -#: src/android/aidl/example-service/client.md -#, fuzzy -msgid "Notice that the client does not depend on `libbirthdayservice`." -msgstr "Notez que le client ne dépend pas de `libbirthdayservice`." +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md +msgid "// std::mem::forget\n" +msgstr "" -#: src/android/aidl/example-service/client.md -#, fuzzy -msgid "Build, push, and run the client on your device:" -msgstr "Créez, transférez et exécutez le client sur votre appareil :" +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md +msgid "// std::mem::drop\n" +msgstr "" -#: src/android/aidl/example-service/client.md -msgid "" -"```shell\n" -"m birthday_client\n" -"adb push \"$ANDROID_PRODUCT_OUT/system/bin/birthday_client\" /data/local/" -"tmp\n" -"adb shell /data/local/tmp/birthday_client Charlie 60\n" -"```" +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md +msgid "Both `mem::forget()` and `mem::drop()` take ownership of the value `t`." msgstr "" -#: src/android/aidl/example-service/client.md +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md +msgid "Despite having the same function signature, they have opposite effects:" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md msgid "" -"`Strong` is the trait object representing the service " -"that the client has connected to." +"`forget()` uses [`ManuallyDrop`](https://doc.rust-lang.org/std/mem/struct.ManuallyDrop." +"html) to prevent the destructor `Drop::drop()` from being invoked." msgstr "" -#: src/android/aidl/example-service/client.md +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md msgid "" -"`Strong` is a custom smart pointer type for Binder. It handles both an in-" -"process ref count for the service trait object, and the global Binder ref " -"count that tracks how many processes have a reference to the object." +"This is useful for scenarios such as implementing a drop bomb or otherwise opting out of " +"destructor behavior." msgstr "" -#: src/android/aidl/example-service/client.md +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md msgid "" -"Note that the trait object that the client uses to talk to the service uses " -"the exact same trait that the server implements. For a given Binder " -"interface, there is a single Rust trait generated that both client and " -"server use." +"Be careful though, since any resources the value exclusively owns such as heap allocated " +"memory or file handles will remain in an unreachable state." msgstr "" -#: src/android/aidl/example-service/client.md +#: src/idiomatic/leveraging-the-type-system/raii/forget_and_drop.md msgid "" -"Use the same service identifier used when registering the service. This " -"should ideally be defined in a common crate that both the client and server " -"can depend on." +"`drop()` is a convenience function for disposing of a value. Because `t` is moved into " +"the function, it is automatically dropped which triggers its `Drop::drop()` " +"implementation before the parent function returns." msgstr "" -#: src/android/aidl/example-service/changing-definition.md +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md #, fuzzy +msgid "Scope Guards" +msgstr "Threads délimités" + +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md msgid "" -"Let us extend the API with more functionality: we want to let clients " -"specify a list of lines for the birthday card:" +"A scope guard uses the `Drop` trait to run cleanup code automatically when a scope exits, " +"even during unwinding." msgstr "" -"Étendons l'API avec plus de fonctionnalités : nous voulons laisser les " -"clients spécifier un liste des lignes pour la carte d'anniversaire :" -#: src/android/aidl/example-service/changing-definition.md -msgid "This results in an updated trait definition for `IBirthdayService`:" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "\"download.tmp\"" msgstr "" -#: src/android/aidl/example-service/changing-definition.md -msgid "" -"Note how the `String[]` in the AIDL definition is translated as a " -"`&[String]` in Rust, i.e. that idiomatic Rust types are used in the " -"generated bindings wherever possible:" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "\"cannot create temporary file\"" msgstr "" -#: src/android/aidl/example-service/changing-definition.md -msgid "`in` array arguments are translated to slices." +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "// Set up cleanup immediately after file creation\n" msgstr "" -#: src/android/aidl/example-service/changing-definition.md -msgid "`out` and `inout` args are translated to `&mut Vec`." +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "\"download failed, deleting: {:?}\"" msgstr "" -#: src/android/aidl/example-service/changing-definition.md -msgid "Return values are translated to returning a `Vec`." +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "\"partial data...\"" msgstr "" -#: src/android/aidl/example-service/changing-implementation.md -msgid "Updating Client and Service" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "// Download succeeded, keep the file\n" msgstr "" -#: src/android/aidl/example-service/changing-implementation.md -msgid "Update the client and server code to account for the new API." +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "\"Download '{path}' complete!\"" msgstr "" -#: src/android/aidl/example-service/changing-implementation.md -msgid "'\\n'" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "// Otherwise, the guard runs and deletes the file\n" msgstr "" -#: src/android/aidl/example-service/changing-implementation.md -msgid "\"Habby birfday to yuuuuu\"" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "" +"This example models a download workflow. We create a temporary file first, then use a " +"scope guard to ensure that the file is deleted if the download fails." msgstr "" -#: src/android/aidl/example-service/changing-implementation.md -msgid "\"And also: many more\"" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "" +"The `scopeguard` crate allows you to conveniently define a single-use `Drop`\\-based " +"cleanup without defining a custom type with a custom `Drop` implementation." msgstr "" -#: src/android/aidl/example-service/changing-implementation.md +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md msgid "" -"TODO: Move code snippets into project files where they'll actually be built?" +"The guard is created directly after creating the file, so even if `writeln!()` fails, the " +"file will still be cleaned up. This ordering is essential for correctness." msgstr "" -#: src/android/aidl/types.md -msgid "Working With AIDL Types" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "" +"The `guard()` creates a `ScopeGuard` instance. It a user-defined value (in this case, " +"`path`) and the cleanup closure that later receives this value." msgstr "" -#: src/android/aidl/types.md -msgid "AIDL types translate into the appropriate idiomatic Rust type:" +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "" +"The guard's closure runs on scope exit unless it is _defused_ with `ScopeGuard::" +"into_inner` (removing the value so the guard does nothing on drop). In the success path, " +"we call `into_inner` so the guard will not delete the file." msgstr "" -#: src/android/aidl/types.md -msgid "Primitive types map (mostly) to idiomatic Rust types." +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "A scope guard is similar to the `defer` feature in Go." msgstr "" -#: src/android/aidl/types.md -msgid "Collection types like slices, `Vec`s and string types are supported." +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "" +"This pattern is ideal for \"cleanup on failure\" scenarios, where a cleanup should run by " +"default unless a success path is explicitly taken." msgstr "" -#: src/android/aidl/types.md +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md msgid "" -"References to AIDL objects and file handles can be sent between clients and " -"services." +"This pattern is also useful when you don't control the cleanup strategy of the resource " +"object. In this example, `File::drop()` closes the file but does not delete it, and we " +"can't change the standard library to delete the file instead (nor should we, it is not a " +"good idea anyway)." msgstr "" -#: src/android/aidl/types.md -msgid "File handles and parcelables are fully supported." +#: src/idiomatic/leveraging-the-type-system/raii/scope_guard.md +msgid "" +"The `scopeguard` crate also supports cleanup strategies via the [`Strategy`](https://docs." +"rs/scopeguard/latest/scopeguard/trait.Strategy.html) trait. You can choose to run the " +"guard on unwind only, or on success only, not just always." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "Primitive types map (mostly) idiomatically:" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +#, fuzzy +msgid "Drop: Option" +msgstr "Exceptions" + +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "\"write '{data}' to file '{}'\"" msgstr "" -#: src/android/aidl/types/primitives.md -#, fuzzy -msgid "AIDL Type" -msgstr "AIDL" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "\"automatically closing handle for file: {}\"" +msgstr "" -#: src/android/aidl/types/primitives.md src/android/aidl/types/arrays.md -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "Rust Type" -msgstr "Rust by Example" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "\"closed handle for file: {}\"" +msgstr "" -#: src/android/aidl/types/primitives.md -msgid "Note" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "\"manually closed file: {}\"" msgstr "" -#: src/android/aidl/types/primitives.md -#, fuzzy -msgid "`boolean`" -msgstr "`&[u8]`" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"In this example we want to let the user call `close()` manually so that errors from " +"closing the file can be reported explicitly." +msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`byte`" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"At the same time we still want RAII semantics: if the user forgets to call `close()`, the " +"handle must be cleaned up automatically in `Drop`." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`i8`" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"Wrapping the handle in an `Option` gives us both behaviors. `close()` extracts the handle " +"with `take()`, and `Drop` only runs cleanup if a handle is still present." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "Note that bytes are signed." +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"Demo: remove the `.close()` call and run the code — `Drop` now prints the automatic " +"cleanup." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`u16`" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"The main downside is ergonomics. `Option` forces us to handle both the `Some` and `None` " +"case even in places where, logically, `None` cannot occur. Rust’s type system cannot " +"express that relationship between `File` and its `Handle`, so we handle both cases " +"manually." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "Note the usage of `u16`, NOT `u32`." +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"Instead of `Option` we could use [`ManuallyDrop`](https://doc.rust-lang.org/std/mem/" +"struct.ManuallyDrop.html), which suppresses automatic destruction by preventing Rust from " +"calling `Drop` for the value; you must handle teardown yourself." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`int`" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"The [_scopeguard_ example](./scope_guard.md) on the previous slide shows how " +"`ManuallyDrop` can replace `Option` to avoid handling `None` in places where the value " +"should always exist." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`i32`" +#: src/idiomatic/leveraging-the-type-system/raii/drop_option.md +msgid "" +"In such designs we typically track the drop state with a separate flag next to the " +"`ManuallyDrop`, which lets us track whether the handle has already been manually " +"consumed." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`long`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"It may desirable to **extend** foreign types with new inherent methods. For example, " +"allow your code to check if a string is a palindrome using method-calling syntax: `s." +"is_palindrome()`." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`i64`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "It might feel natural to reach out for an `impl` block:" msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`float`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"The Rust compiler won't allow it, though. But you can use the **extension trait pattern** " +"to work around this limitation." msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`f32`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "A Rust item (be it a trait or a type) is referred to as:" msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`double`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "**foreign**, if it isn't defined in the current crate" msgstr "" -#: src/android/aidl/types/primitives.md -msgid "`f64`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "**local**, if it is defined in the current crate" msgstr "" -#: src/android/aidl/types/arrays.md +#: src/idiomatic/leveraging-the-type-system/extension-traits.md msgid "" -"The array types (`T[]`, `byte[]`, and `List`) get translated to the " -"appropriate Rust array type depending on how they are used in the function " -"signature:" +"The distinction has significant implications for [coherence and orphan rules](https://doc." +"rust-lang.org/stable/reference/items/implementations.html#r-items.impl.trait.orphan-" +"rule), as we'll get a chance to explore in this section of the course." msgstr "" -#: src/android/aidl/types/arrays.md -#, fuzzy -msgid "Position" -msgstr "Descriptif" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "Compile the example to show the compiler error that's emitted." +msgstr "" -#: src/android/aidl/types/arrays.md -msgid "`in` argument" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"Highlight how the compiler error message nudges you towards the extension trait pattern." msgstr "" -#: src/android/aidl/types/arrays.md -#, fuzzy -msgid "`&[T]`" -msgstr "Tranches" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "Explain how many type-system restrictions in Rust aim to prevent _ambiguity_." +msgstr "" -#: src/android/aidl/types/arrays.md -msgid "`out`/`inout` argument" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"What would happen if you were allowed to define new inherent methods on foreign types? " +"Different crates in your dependency tree might end up defining different methods on the " +"same foreign type with the same name." msgstr "" -#: src/android/aidl/types/arrays.md -#, fuzzy -msgid "`&mut Vec`" -msgstr "`Vec`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"As soon as there is room for ambiguity, there must be a way to disambiguate. If " +"disambiguation happens implicitly, it can lead to surprising or otherwise unexpected " +"behavior. If disambiguation happens explicitly, it can increase the cognitive load on " +"developers who are reading your code." +msgstr "" -#: src/android/aidl/types/arrays.md -msgid "Return" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"Furthermore, every time a crate defines a new inherent method on a foreign type, it may " +"cause compilation errors in _your_ code, as you may be forced to introduce explicit " +"disambiguation." msgstr "" -#: src/android/aidl/types/arrays.md -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`Vec`" -msgstr "`Vec`" +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"Rust has decided to avoid the issue altogether by forbidding the definition of new " +"inherent methods on foreign types." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/extension-traits.md +msgid "" +"Other languages (e.g, Kotlin, C#, Swift) allow adding methods to existing types, often " +"called \"extension methods.\" This leads to different trade-offs in terms of potential " +"ambiguities and the need for global reasoning." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "" +"An **extension trait** is a local trait definition whose primary purpose is to attach new " +"methods to foreign types." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "// Bring the extension trait into scope...\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "// ...then invoke its methods as if they were inherent methods\n" +msgstr "" -#: src/android/aidl/types/arrays.md -msgid "" -"In Android 13 or higher, fixed-size arrays are supported, i.e. `T[N]` " -"becomes `[T; N]`. Fixed-size arrays can have multiple dimensions (e.g. " -"int\\[3\\]\\[4\\]). In the Java backend, fixed-size arrays are represented " -"as array types." +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "\"dad\"" msgstr "" -#: src/android/aidl/types/arrays.md -msgid "Arrays in parcelable fields always get translated to `Vec`." +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "\"grandma\"" msgstr "" -#: src/android/aidl/types/objects.md -msgid "" -"AIDL objects can be sent either as a concrete AIDL type or as the type-" -"erased `IBinder` interface:" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "The `Ext` suffix is conventionally attached to the name of extension traits." msgstr "" -#: src/android/aidl/types/objects.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md msgid "" -"**birthday_service/aidl/com/example/birthdayservice/IBirthdayInfoProvider." -"aidl**:" +"It communicates that the trait is primarily used for extension purposes, and it is " +"therefore not intended to be implemented outside the crate that defines it." msgstr "" -"_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService." -"aidl_ :" -#: src/android/aidl/types/objects.md src/android/aidl/types/parcelables.md -#: src/android/aidl/types/file-descriptor.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md #, fuzzy msgid "" -"**birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl**:" +"Refer to the [\"Extension Trait\" RFC](https://rust-lang.github.io/rfcs/0445-extension-" +"trait-conventions.html) as the authoritative source for naming conventions." msgstr "" -"_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService." -"aidl_ :" +"Selon le \\[Rust RFC Book\\] [1](https://rust-lang.github.io/rfcs/0246-const-vs-static." +"html), ceux-ci sont intégrés lors de l'utilisation." -#: src/android/aidl/types/objects.md -msgid "/** The same thing, but using a binder object. */" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "" +"The extension trait implementation for a foreign type must be in the same crate as the " +"trait itself, otherwise you'll be blocked by Rust's [_orphan rule_](https://github.com/" +"rust-lang/rfcs/blob/master/text/2451-re-rebalancing-coherence.md#what-is-coherence-and-" +"why-do-we-care)." msgstr "" -#: src/android/aidl/types/objects.md -msgid "/** The same thing, but using `IBinder`. */" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "The extension trait must be in scope when its methods are invoked." msgstr "" -#: src/android/aidl/types/objects.md src/android/aidl/types/parcelables.md -#: src/android/aidl/types/file-descriptor.md -#, fuzzy -msgid "**birthday_service/src/client.rs**:" -msgstr "_service_anniversaire/src/client.rs_ :" - -#: src/android/aidl/types/objects.md -msgid "/// Rust struct implementing the `IBirthdayInfoProvider` interface.\n" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "" +"Comment out the `use` statement in the example to show the compiler error that's emitted " +"if you try to invoke an extension method without having the corresponding extension trait " +"in scope." msgstr "" -#: src/android/aidl/types/objects.md -msgid "// Create a binder object for the `IBirthdayInfoProvider` interface.\n" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "" +"The example above uses an [_underscore import_](https://doc.rust-lang.org/stable/" +"reference/items/use-declarations.html#r-items.use.as-underscore) (`use ext::StringExt as " +"_`) to minimize the likelihood of a naming conflict with other imported traits." msgstr "" -#: src/android/aidl/types/objects.md -msgid "// Send the binder object to the service.\n" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md +msgid "" +"With an underscore import, the trait is considered to be in scope and you're allowed to " +"invoke its methods on types that implement the trait. Its _symbol_, instead, is not " +"directly accessible. This prevents you, for example, from using that trait in a `where` " +"clause." msgstr "" -#: src/android/aidl/types/objects.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-foreign-types.md msgid "" -"// Perform the same operation but passing the provider as an `SpIBinder`.\n" +"Since extension traits aren't meant to be used in `where` clauses, they are " +"conventionally imported via an underscore import." msgstr "" -#: src/android/aidl/types/objects.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md msgid "" -"Note the usage of `BnBirthdayInfoProvider`. This serves the same purpose as " -"`BnBirthdayService` that we saw previously." +"What happens when you have a name conflict between an inherent method and an extension " +"method?" msgstr "" -#: src/android/aidl/types/parcelables.md -msgid "Binder for Rust supports sending parcelables directly:" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "" +"// Which `count_ones` method is invoked?\n" +" // The one from `CountOnesExt`? Or the inherent one from `i32`?\n" msgstr "" -#: src/android/aidl/types/parcelables.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md msgid "" -"**birthday_service/aidl/com/example/birthdayservice/BirthdayInfo.aidl**:" +"A foreign type may, in a newer version, add a new inherent method with the same name as " +"our extension method." msgstr "" -"_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService." -"aidl_ :" -#: src/android/aidl/types/parcelables.md -msgid "/** The same thing, but with a parcelable. */" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "" +"Ask: What will happen in the example above? Will there be a compiler error? Will one of " +"the two methods be given higher priority? Which one?" msgstr "" -#: src/android/aidl/types/file-descriptor.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md msgid "" -"Files can be sent between Binder clients/servers using the " -"`ParcelFileDescriptor` type:" +"Add a `panic!(\"Extension trait\");` in the body of `CountOnesExt::count_ones` to clarify " +"which method is being invoked." msgstr "" -#: src/android/aidl/types/file-descriptor.md -msgid "/** The same thing, but loads info from a file. */" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "" +"To prevent users of the Rust language from having to manually specify which method to use " +"in all cases, there is a priority ordering system for how methods get \"picked\" first:" msgstr "" -#: src/android/aidl/types/file-descriptor.md -msgid "// Open a file and put the birthday info in it.\n" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "Immutable (`&self`) first" msgstr "" -#: src/android/aidl/types/file-descriptor.md -msgid "\"/data/local/tmp/birthday.info\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "" +"Inherent (method defined in the type's `impl` block) before Trait (method added by a " +"trait impl)." msgstr "" -#: src/android/aidl/types/file-descriptor.md -msgid "\"{name}\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "Mutable (`&mut self`) Second" msgstr "" -#: src/android/aidl/types/file-descriptor.md -msgid "\"{years}\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "Inherent before Trait." msgstr "" -#: src/android/aidl/types/file-descriptor.md -msgid "// Create a `ParcelFileDescriptor` from the file and send it.\n" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "" +"If every method with the same name has different mutability and was either defined in as " +"an inherent method or trait method, with no overlap, this makes the job easy for the " +"compiler." msgstr "" -#: src/android/aidl/types/file-descriptor.md -#, fuzzy -msgid "**birthday_service/src/lib.rs**:" -msgstr "_service_anniversaire/src/lib.rs_ :" - -#: src/android/aidl/types/file-descriptor.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md msgid "" -"// Convert the file descriptor to a `File`. `ParcelFileDescriptor` wraps\n" -" // an `OwnedFd`, which can be cloned and then used to create a " -"`File`\n" -" // object.\n" +"This does introduce some ambiguity for the user, who may be confused as to why a method " +"they're relying on is not producing expected behavior. Avoid name conflicts instead of " +"relying on this mechanism if you can." msgstr "" -#: src/android/aidl/types/file-descriptor.md -msgid "\"Invalid file handle\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "" +"Demonstrate: Change the signature and implementation of `CountOnesExt::count_ones` to `fn " +"count_ones(&mut self) -> u32` and modify the invocation accordingly:" msgstr "" -#: src/android/aidl/types/file-descriptor.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md msgid "" -"`ParcelFileDescriptor` wraps an `OwnedFd`, and so can be created from a " -"`File` (or any other type that wraps an `OwnedFd`), and can be used to " -"create a new `File` handle on the other side." +"`CountOnesExt::count_ones` is invoked, rather than the inherent method, since `&mut self` " +"has a higher priority than `&self`, the one used by the inherent method." msgstr "" -#: src/android/aidl/types/file-descriptor.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md msgid "" -"Other types of file descriptors can be wrapped and sent, e.g. TCP, UDP, and " -"UNIX sockets." +"If an immutable inherent method and a mutable trait method exist for the same type, we " +"can specify which one to use at the call site by using `(&).count_ones()` to get " +"the immutable (higher priority) method or `(&mut ).count_ones()`" msgstr "" -#: src/android/testing.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md #, fuzzy -msgid "Testing in Android" -msgstr "Rust pour Android" +msgid "" +"Point the students to the Rust reference for more information on [method resolution]" +"(https://doc.rust-lang.org/stable/reference/expressions/method-call-expr.html)." +msgstr "Voir la [Rust Reference](https://doc.rust-lang.org/reference/type-layout.html)." -#: src/android/testing.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md msgid "" -"Building on [Testing](../testing.md), we will now look at how unit tests " -"work in AOSP. Use the `rust_test` module for your unit tests:" +"Avoid naming conflicts between extension trait methods and inherent methods. Rust's " +"method resolution algorithm is complex and may surprise users of your code." msgstr "" -#: src/android/testing.md -#, fuzzy -msgid "_testing/Android.bp_:" -msgstr "_hello_rust/Android.bp_ :" +#: src/idiomatic/leveraging-the-type-system/extension-traits/method-resolution-conflicts.md +msgid "" +"The interaction between the priority search used by Rust's method resolution algorithm " +"and automatic `Deref`ing can be used to emulate [specialization](https://github.com/rust-" +"lang/rust/issues/31844) on the stable toolchain, primarily in the context of macro-" +"generated code. Check out [\"Autoref Specialization\"](https://github.com/dtolnay/case-" +"studies/blob/master/autoref-specialization/README.md) for the specific details." +msgstr "" -#: src/android/testing.md -msgid "\"libleftpad\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"What happens when you have a name conflict between two different trait methods " +"implemented for the same type?" msgstr "" -#: src/android/testing.md -msgid "\"leftpad\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"// Which method is invoked?\n" +"// The one from `Ext1`? Or the one from `Ext2`?\n" msgstr "" -#: src/android/testing.md -msgid "\"libleftpad_test\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"The trait you are extending may, in a newer version, add a new trait method with the same " +"name as your extension method. Or another extension trait for the same type may define a " +"method with a name that conflicts with your own extension method." msgstr "" -#: src/android/testing.md -msgid "\"leftpad_test\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"Ask: what will happen in the example above? Will there be a compiler error? Will one of " +"the two methods be given higher priority? Which one?" msgstr "" -#: src/android/testing.md src/android/interoperability/with-c/bindgen.md -msgid "\"general-tests\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"The compiler rejects the code because it cannot determine which method to invoke. Neither " +"`Ext1` nor `Ext2` has a higher priority than the other." msgstr "" -#: src/android/testing.md -#, fuzzy -msgid "_testing/src/lib.rs_:" -msgstr "_hello_rust/src/lib.rs_ :" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "To resolve this conflict, you must specify which trait you want to use." +msgstr "" -#: src/android/testing.md -msgid "//! Left-padding library.\n" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"Demonstrate: call `Ext1::is_palindrome(\"dad\")` or `Ext2::is_palindrome(\"dad\")` " +"instead of `\"dad\".is_palindrome()`." msgstr "" -#: src/android/testing.md -msgid "/// Left-pad `s` to `width`.\n" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"For methods with more complex signatures, you may need to use a more explicit [fully-" +"qualified syntax](https://doc.rust-lang.org/reference/expressions/call-expr." +"html#disambiguating-function-calls)." msgstr "" -#: src/android/testing.md -msgid "\"{s:>width$}\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/trait-method-conflicts.md +msgid "" +"Demonstrate: replace `\"dad\".is_palindrome()` with `<&str as Ext1>::" +"is_palindrome(\"dad\")` or `<&str as Ext2>::is_palindrome(\"dad\")`." msgstr "" -#: src/android/testing.md -msgid "\" foo\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "" +"As with types, it may be desirable to **extend foreign traits**. In particular, to attach " +"new methods to _all_ implementors of a given trait." msgstr "" -#: src/android/testing.md -msgid "\"foobar\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "\"'{}'\"" msgstr "" -#: src/android/testing.md -#, fuzzy -msgid "You can now run the test with" -msgstr "Vous pouvez maintenant générer automatiquement les liaisons :" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "\"'dad'\"" +msgstr "" -#: src/android/testing.md -#, fuzzy -msgid "The output looks like this:" -msgstr "L'approche globale ressemble à ceci:" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "\"'4'\"" +msgstr "" -#: src/android/testing.md -msgid "" -"```text\n" -"INFO: Elapsed time: 2.666s, Critical Path: 2.40s\n" -"INFO: 3 processes: 2 internal, 1 linux-sandbox.\n" -"INFO: Build completed successfully, 3 total actions\n" -"//comprehensive-rust-android/testing:libleftpad_test_host PASSED " -"in 2.3s\n" -" PASSED libleftpad_test.tests::long_string (0.0s)\n" -" PASSED libleftpad_test.tests::short_string (0.0s)\n" -"Test cases: finished with 2 passing and 0 failing out of 2 test cases\n" -"```" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "\"'true'\"" msgstr "" -#: src/android/testing.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"Notice how you only mention the root of the library crate. Tests are found " -"recursively in nested modules." +"Highlight how we added new behavior to _multiple_ types at once. `.quoted()` can be " +"called on string slices, numbers, and booleans since they all implement the `Display` " +"trait." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"The [GoogleTest](https://docs.rs/googletest/) crate allows for flexible test " -"assertions using _matchers_:" +"This flavor of the extension trait pattern uses [_blanket implementations_](https://doc." +"rust-lang.org/stable/reference/glossary.html#blanket-implementation)." msgstr "" -#: src/android/testing/googletest.md -msgid "\"baz\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "" +"A blanket implementation implements a trait for all types `T` that satisfy the trait " +"bounds specified in the `impl` block. In this case, the only requirement is that `T` " +"implements the `Display` trait." msgstr "" -#: src/android/testing/googletest.md -msgid "\"xyz\"" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "" +"Draw the students' attention to the implementation of `DisplayExt::quoted`: we can't make " +"any assumptions about `T` other than that it implements `Display`. All our logic must " +"either use methods from `Display` or functions/macros that don't require other traits." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"If we change the last element to `\"!\"`, the test fails with a structured " -"error message pin-pointing the error:" +"For example, we can call `format!` with `T`, but can't call `.to_uppercase()` because it " +"is not necessarily a `String`." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"GoogleTest is not part of the Rust Playground, so you need to run this " -"example in a local environment. Use `cargo add googletest` to quickly add it " -"to an existing Cargo project." +"We could introduce additional trait bounds on `T`, but it would restrict the set of types " +"that can leverage the extension trait." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"The `use googletest::prelude::*;` line imports a number of [commonly used " -"macros and types](https://docs.rs/googletest/latest/googletest/prelude/index." -"html)." +"Conventionally, the extension trait is named after the trait it extends, followed by the " +"`Ext` suffix. In the example above, `DisplayExt`." msgstr "" -#: src/android/testing/googletest.md -msgid "This just scratches the surface, there are many builtin matchers." +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "There are entire crates that extend standard library traits with new functionality." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"A particularly nice feature is that mismatches in multi-line strings are " -"shown as a diff:" +"`itertools` crate provides the `Itertools` trait that extends `Iterator`. It adds many " +"iterator adapters, such as `interleave` and `unique`. It provides new algorithmic " +"building blocks for iterator pipelines built with method chaining." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"\"Memory safety found,\\n\\\n" -" Rust's strong typing guides the way,\\n\\\n" -" Secure code you'll write.\"" +"`futures` crate provides the `FutureExt` trait, which extends the `Future` trait with new " +"combinators and helper methods." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"\"Memory safety found,\\n\\\n" -" Rust's silly humor guides the way,\\n\\\n" -" Secure code you'll write.\"" +"Extension traits can be used by libraries to distinguish between stable and experimental " +"methods." msgstr "" -#: src/android/testing/googletest.md -msgid "shows a color-coded diff (colors not shown here):" +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md +msgid "Stable methods are part of the trait definition." msgstr "" -#: src/android/testing/googletest.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"The crate is a Rust port of [GoogleTest for C++](https://google.github.io/" -"googletest/)." +"Experimental methods are provided via an extension trait defined in a different library, " +"with a less restrictive stability policy. Some utility methods are then \"promoted\" to " +"the core trait definition once they have been proven useful and their design has been " +"refined." msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"For mocking, [Mockall](https://docs.rs/mockall/) is a widely used library. " -"You need to refactor your code to use traits, which you can then quickly " -"mock:" +"Extension traits can be used to split a [dyn-incompatible trait](https://doc.rust-lang." +"org/reference/items/traits.html#r-items.traits.dyn-compatible) in two:" msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"Mockall is the recommended mocking library in Android (AOSP). There are " -"other [mocking libraries available on crates.io](https://crates.io/keywords/" -"mock), in particular in the area of mocking HTTP services. The other mocking " -"libraries work in a similar fashion as Mockall, meaning that they make it " -"easy to get a mock implementation of a given trait." +"A **dyn-compatible core**, restricted to the methods that satisfy dyn-compatibility " +"requirements." msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"Note that mocking is somewhat _controversial_: mocks allow you to completely " -"isolate a test from its dependencies. The immediate result is faster and " -"more stable test execution. On the other hand, the mocks can be configured " -"wrongly and return output different from what the real dependencies would do." +"An **extension trait**, containing the remaining methods that are not dyn-compatible (e." +"g., methods with a generic parameter)." msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/extending-other-traits.md msgid "" -"If at all possible, it is recommended that you use the real dependencies. As " -"an example, many databases allow you to configure an in-memory backend. This " -"means that you get the correct behavior in your tests, plus they are fast " -"and will automatically clean up after themselves." +"Concrete types that implement the core trait will be able to invoke all methods, thanks " +"to the blanket impl for the extension trait. Trait objects (`dyn CoreTrait`) will be able " +"to invoke all methods on the core trait as well as those on the extension trait that " +"don't require `Self: Sized`." msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md +msgid "In what scenarios should you prefer an extension trait over a free function?" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md +msgid "// vs\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md +msgid "The main advantage of extension traits is **ease of discovery**." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md msgid "" -"Similarly, many web frameworks allow you to start an in-process server which " -"binds to a random port on `localhost`. Always prefer this over mocking away " -"the framework since it helps you test your code in the real environment." +"Extension methods can be easier to discover than free functions. Language servers (e.g., " +"`rust-analyzer`) will suggest them if you type `.` after an instance of the foreign type." msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md msgid "" -"Mockall is not part of the Rust Playground, so you need to run this example " -"in a local environment. Use `cargo add mockall` to quickly add Mockall to an " -"existing Cargo project." +"However, a bespoke extension trait might be overkill for a single method. Both approaches " +"require an additional import, and the familiar method syntax may not justify the " +"boilerplate of a full trait definition." msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md msgid "" -"Mockall has a lot more functionality. In particular, you can set up " -"expectations which depend on the arguments passed. Here we use this to mock " -"a cat which becomes hungry 3 hours after the last time it was fed:" +"**Discoverability:** Extension methods are easier to discover than free functions. " +"Language servers (e.g., `rust-analyzer`) will suggest them if you type `.` after an " +"instance of the foreign type." msgstr "" -#: src/android/testing/mocking.md +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md msgid "" -"You can use `.times(n)` to limit the number of times a mock method can be " -"called to `n` --- the mock will automatically panic when dropped if this " -"isn't satisfied." +"**Method Chaining:** A major ergonomic win for extension traits is method chaining. This " +"is the foundation of the `Iterator` trait, allowing for fluent calls like `data.iter()." +"filter(...).map(...)`. Achieving this with free functions would be far more cumbersome " +"(`map(filter(iter(data), ...), ...)`)." msgstr "" -#: src/android/logging.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md msgid "" -"You should use the `log` crate to automatically log to `logcat` (on-device) " -"or `stdout` (on-host):" +"**API Cohesion:** Extension traits help create a cohesive API. If you have several " +"related functions for a foreign type (e.g., `is_palindrome`, `word_count`, " +"`to_kebab_case`), grouping them in a single `StrExt` trait is often cleaner than having " +"multiple free functions for a user to import." msgstr "" -"Vous devez utiliser la caisse `log` pour vous connecter automatiquement à " -"`logcat` (sur l'appareil) ou `stdout` (sur l'hôte) :" -#: src/android/logging.md -#, fuzzy -msgid "_hello_rust_logs/Android.bp_:" -msgstr "_hello_rust_logs/Android.bp_ :" +#: src/idiomatic/leveraging-the-type-system/extension-traits/should-i-define-an-extension-trait.md +msgid "" +"**Trade-offs:** Despite these advantages, a bespoke extension trait might be overkill for " +"a single, simple function. Both approaches require an additional import, and the familiar " +"method syntax may not justify the boilerplate of a full trait definition." +msgstr "" -#: src/android/logging.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md #, fuzzy -msgid "\"hello_rust_logs\"" -msgstr "_hello_rust_logs/Android.bp_ :" +msgid "Typestate Pattern: Problem" +msgstr "Le modèle d'état de type" -#: src/android/logging.md -msgid "\"liblog_rust\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +msgid "" +"How can we ensure that only valid operations are allowed on a value based on its current " +"state?" msgstr "" -#: src/android/logging.md -msgid "\"liblogger\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/root.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "\"{name} {{\"" msgstr "" -#: src/android/logging.md -#, fuzzy -msgid "_hello_rust_logs/src/main.rs_:" -msgstr "_hello_rust_logs/src/main.rs_ :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "\" {key}={value};\"" +msgstr "" -#: src/android/logging.md -msgid "//! Rust logging demo.\n" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "\"}\\n\"" msgstr "" -#: src/android/logging.md -msgid "/// Logs a greeting.\n" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "\"User\"" msgstr "" -#: src/android/logging.md -msgid "\"rust\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "\"id\"" msgstr "" -#: src/android/logging.md -msgid "\"Starting program.\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "\"42\"" msgstr "" -#: src/android/logging.md -msgid "\"Things are going fine.\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "\"name\"" msgstr "" -#: src/android/logging.md -msgid "\"Something went wrong!\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +msgid "// serializer.serialize_struct_end(); // ← Oops! Forgotten\n" msgstr "" -#: src/android/logging.md src/android/interoperability/with-c/bindgen.md -#: src/android/interoperability/with-c/rust.md -#, fuzzy -msgid "Build, push, and run the binary on your device:" -msgstr "Compilez, transférez et exécutez le binaire sur votre appareil :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +msgid "This `Serializer` is meant to write a structured value." +msgstr "" -#: src/android/logging.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md msgid "" -"```shell\n" -"m hello_rust_logs\n" -"adb push \"$ANDROID_PRODUCT_OUT/system/bin/hello_rust_logs\" /data/local/" -"tmp\n" -"adb shell /data/local/tmp/hello_rust_logs\n" -"```" +"However, in this example we forgot to call `serialize_struct_end()` before `finish()`. As " +"a result, the serialized output is incomplete or syntactically incorrect." msgstr "" -#: src/android/logging.md -#, fuzzy -msgid "The logs show up in `adb logcat`:" -msgstr "Les journaux s'affichent dans `adb logcat` :" - -#: src/android/interoperability.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md msgid "" -"Rust has excellent support for interoperability with other languages. This " -"means that you can:" +"One approach to fix this would be to track internal state manually, and return a `Result` " +"from methods like `serialize_struct_field()` or `finish()` if the current state is " +"invalid." msgstr "" -"Rust a un excellent support pour l'interopérabilité avec d'autres langages. " -"Ça signifie Que tu peux:" - -#: src/android/interoperability.md -#, fuzzy -msgid "Call Rust functions from other languages." -msgstr "Appelez les fonctions Rust à partir d'autres langues." -#: src/android/interoperability.md -#, fuzzy -msgid "Call functions written in other languages from Rust." -msgstr "Fonctions d'appel écrites dans d'autres langages depuis Rust." +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +msgid "But this has downsides:" +msgstr "" -#: src/android/interoperability.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md msgid "" -"When you call functions in a foreign language we say that you're using a " -"_foreign function interface_, also known as FFI." +"It is easy to get wrong as an implementer. Rust’s type system cannot help enforce the " +"correctness of our state transitions." msgstr "" -"Lorsque vous appelez des fonctions dans une langue étrangère, nous disons " -"que vous utilisez un _interface de fonction étrangère_, également connue " -"sous le nom de FFI." - -#: src/android/interoperability/with-c.md -#, fuzzy -msgid "Interoperability with C" -msgstr "Interopérabilité avec C" -#: src/android/interoperability/with-c.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md msgid "" -"Rust has full support for linking object files with a C calling convention. " -"Similarly, you can export Rust functions and call them from C." +"It also adds unnecessary burden on the user, who must handle `Result` values for " +"operations that are misused in source code rather than at runtime." msgstr "" -"Rust prend entièrement en charge la liaison de fichiers objets avec une " -"convention d'appel C. De même, vous pouvez exporter des fonctions Rust et " -"les appeler depuis C." - -#: src/android/interoperability/with-c.md -#, fuzzy -msgid "You can do it by hand if you want:" -msgstr "Vous pouvez le faire à la main si vous le souhaitez :" -#: src/android/interoperability/with-c.md -msgid "\"{x}, {abs_x}\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md +msgid "" +"A better solution is to model the valid state transitions directly in the type system." msgstr "" - -#: src/android/interoperability/with-c.md -#, fuzzy + +#: src/idiomatic/leveraging-the-type-system/typestate-pattern.md msgid "" -"We already saw this in the [Safe FFI Wrapper exercise](../../exercises/day-3/" -"safe-ffi-wrapper.md)." +"In the next slide, we will apply the **typestate pattern** to enforce correct usage at " +"compile time and make it impossible to call incompatible methods or forget to do a " +"required action." msgstr "" -"Nous avons déjà vu cela dans le [Safe FFI Wrapper exercice](../../exercises/" -"day-3/safe-ffi-wrapper.md)." -#: src/android/interoperability/with-c.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md #, fuzzy +msgid "Typestate Pattern: Example" +msgstr "Le modèle d'état de type" + +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md msgid "" -"This assumes full knowledge of the target platform. Not recommended for " -"production." +"The typestate pattern encodes part of a value’s runtime state into its type. This allows " +"us to prevent invalid or inapplicable operations at compile time." msgstr "" -"Cela suppose une parfaite connaissance de la plateforme cible. Non " -"recommandé pour fabrication." -#: src/android/interoperability/with-c.md -#, fuzzy -msgid "We will look at better options next." -msgstr "Nous examinerons ensuite de meilleures options." +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "`Serializer` usage flowchart:" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "Using Bindgen" -msgstr "Utiliser Bindgen" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "" +"This example is inspired by Serde’s [`Serializer` trait](https://docs.rs/serde/latest/" +"serde/ser/trait.Serializer.html). Serde uses typestates internally to ensure " +"serialization follows a valid structure. For more, see: " +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md msgid "" -"The [bindgen](https://rust-lang.github.io/rust-bindgen/introduction.html) " -"tool can auto-generate bindings from a C header file." +"The key idea behind typestate is that state transitions happen by consuming a value and " +"producing a new one. At each step, only operations valid for that state are available." msgstr "" -"L'outil [bindgen](https://rust-lang.github.io/rust-bindgen/introduction." -"html) peut générer automatiquement des liaisons à partir d'un fichier d'en-" -"tête C." -#: src/android/interoperability/with-c/bindgen.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md #, fuzzy -msgid "First create a small C library:" -msgstr "Créez d'abord une petite bibliothèque C :" +msgid "In this example:" +msgstr "Exécutez l'exemple avec :" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "_interoperability/bindgen/libbirthday.h_:" -msgstr "_interoperability/bindgen/libbirthday.h_ :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "We begin with a `Serializer`, which only allows us to start serializing a struct." +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "_interoperability/bindgen/libbirthday.c_:" -msgstr "_interoperability/bindgen/libbirthday.c_ :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "" +"Once we call `.serialize_struct(...)`, ownership moves into a `SerializeStruct` value. " +"From that point on, we can only call methods related to serializing struct fields." +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "" +"The original `Serializer` is no longer accessible — preventing us from mixing modes (such " +"as starting another _struct_ mid-struct) or calling `finish()` too early." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"libbirthday.h\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "" +"Only after calling `.finish_struct()` do we receive the `Serializer` back. At that point, " +"the output can be finalized or reused." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"+--------------\\n\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "" +"If we forget to call `finish_struct()` and drop the `SerializeStruct` early, the " +"`Serializer` is also dropped. This ensures incomplete output cannot leak into the system." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"| Happy Birthday %s!\\n\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-example.md +msgid "" +"By contrast, if we had implemented everything on `Serializer` directly — as seen on the " +"previous slide, nothing would stop someone from skipping important steps or mixing " +"serialization flows." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"| Congratulations with the %i years!\\n\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"How do we manage increasingly complex configuration flows with many possible states and " +"transitions, while still preventing incompatible operations?" msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "Add this to your `Android.bp` file:" -msgstr "Ajoutez ceci à votre fichier `Android.bp` :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "/* [...] */" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "_interoperability/bindgen/Android.bp_:" -msgstr "_interopérabilité/bindgen/Android.bp_ :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"// TODO, implement:\n" +" //\n" +" // fn serialize_struct(self, name: &str) -> SerializeStruct\n" +" // fn finish(self) -> String\n" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"libbirthday\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"// TODO, implement:\n" +" //\n" +" // fn serialize_property(mut self, name: &str) -> SerializeStructProperty\n" msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"libbirthday.c\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"// TODO,\n" +" // How should we finish this struct? This depends on where it appears:\n" +" // - At the root level: return `Serializer`\n" +" // - As a property inside another struct: return `SerializeStruct`\n" +" // - As a value inside a list: return `SerializeList`\n" +" //\n" +" // fn finish(self) -> ???\n" msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md msgid "" -"Create a wrapper header file for the library (not strictly needed in this " -"example):" +"// TODO, implement:\n" +" //\n" +" // fn serialize_string(self, value: &str) -> SerializeStruct\n" +" // fn serialize_struct(self, name: &str) -> SerializeStruct\n" +" // fn serialize_list(self) -> SerializeList\n" +" // fn finish(self) -> SerializeStruct\n" msgstr "" -"Créez un fichier d'en-tête wrapper pour la bibliothèque (pas strictement " -"nécessaire dans ce exemple):" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "_interoperability/bindgen/libbirthday_wrapper.h_:" -msgstr "_interoperability/bindgen/libbirthday_wrapper.h_ :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"// TODO, implement:\n" +" //\n" +" // fn serialize_string(mut self, value: &str) -> Self\n" +" // fn serialize_struct(mut self, value: &str) -> SerializeStruct\n" +" // fn serialize_list(mut self) -> SerializeList\n" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "You can now auto-generate the bindings:" -msgstr "Vous pouvez maintenant générer automatiquement les liaisons :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"// TODO:\n" +" // Like `SerializeStruct::finish`, the return type depends on nesting.\n" +" //\n" +" // fn finish(mut self) -> ???\n" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"libbirthday_bindgen\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +msgid "Diagram of valid transitions:" msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "\"birthday_bindgen\"" -msgstr "`rust_bindgen`" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"Building on our previous serializer, we now want to support **nested structures** and " +"**lists**." +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"libbirthday_wrapper.h\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "However, this introduces both **duplication** and **structural complexity**." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"bindings\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"Even more critically, we now hit a **type system limitation**: we cannot cleanly express " +"what `finish()` should return without duplicating variants for every nesting context (e." +"g. root, struct, list)." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "Finally, we can use the bindings in our Rust program:" -msgstr "Enfin, nous pouvons utiliser les liaisons dans notre programme Rust :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "From the diagram of valid transitions, we can observe:" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"print_birthday_card\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "The transitions are recursive" msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "\"main.rs\"" -msgstr "`main.rs` :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "The return types depend on _where_ a substructure or list appears" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "_interoperability/bindgen/main.rs_:" -msgstr "_interopérabilité/bindgen/main.rs_ :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "Each context requires a return path to its parent" +msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "//! Bindgen demo.\n" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"With only concrete types, this becomes unmanageable. Our current approach leads to an " +"explosion of types and manual wiring." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "// SAFETY: `print_card` is safe to call with a valid `card` pointer.\n" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-advanced.md +msgid "" +"In the next chapter, we’ll see how **generics** let us model recursive flows with less " +"boilerplate, while still enforcing valid operations at compile time." msgstr "" -#: src/android/interoperability/with-c/bindgen.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md msgid "" -"```shell\n" -"m print_birthday_card\n" -"adb push \"$ANDROID_PRODUCT_OUT/system/bin/print_birthday_card\" /data/local/" -"tmp\n" -"adb shell /data/local/tmp/print_birthday_card\n" -"```" +"By combining typestate modeling with generics, we can express a wider range of valid " +"states and transitions without duplicating logic. This approach is especially useful when " +"the number of states grows or when multiple states share behavior but differ in structure." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -#, fuzzy -msgid "Finally, we can run auto-generated tests to ensure the bindings work:" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +msgid "" +"We now have all the tools needed to implement the methods for the `Serializer` and its " +"state type definitions. This ensures that our API only permits valid transitions, as " +"illustrated in the following diagram:" msgstr "" -"Enfin, nous pouvons exécuter des tests générés automatiquement pour nous " -"assurer que les liaisons fonctionnent :" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"libbirthday_bindgen_test\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +msgid "" +"By leveraging generics to track the parent context, we can construct arbitrarily nested " +"serializers that enforce valid transitions between struct, list, and property states." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\":libbirthday_bindgen\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +msgid "" +"This enables us to build a recursive structure while maintaining strict control over " +"which methods are accessible in each state." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "\"none\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +msgid "Methods common to all states can be defined for any `S` in `Serializer`." msgstr "" -#: src/android/interoperability/with-c/bindgen.md -msgid "// Generated file, skip linting\n" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics.md +msgid "" +"Marker types (e.g., `List`) introduce no memory or runtime overhead, as they contain " +"no data other than a possible Zero-Sized Type. Their only role is to enforce correct API " +"usage through the type system." msgstr "" -#: src/android/interoperability/with-c/rust.md -#, fuzzy -msgid "Calling Rust" -msgstr "Appeler Rust" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/root.md +msgid "" +"Referring back to our original diagram of valid transitions, we can visualize the " +"beginning of our implementation as follows:" +msgstr "" -#: src/android/interoperability/with-c/rust.md -#, fuzzy -msgid "Exporting Rust functions and types to C is easy:" -msgstr "Exporter des fonctions et des types Rust vers C est simple :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/root.md +msgid "At the \"root\" of our `Serializer`, the only construct allowed is a `Struct`." +msgstr "" -#: src/android/interoperability/with-c/rust.md -#, fuzzy -msgid "_interoperability/rust/libanalyze/analyze.rs_" -msgstr "_interopérabilité/rust/libanalyze/analyze.rs_" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/root.md +msgid "The `Serializer` can only be finalized into a `String` from this root level." +msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "//! Rust FFI demo.\n" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +msgid "\"{}{name}: \"" msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "/// Analyze the numbers.\n" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +msgid "\"{}}}\"" msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "\"x ({x}) is smallest!\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +msgid "The diagram can now be expanded as follows:" msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "\"y ({y}) is probably larger than x ({x})\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +msgid "A `Struct` can only contain a `Property`;" msgstr "" -#: src/android/interoperability/with-c/rust.md -#, fuzzy -msgid "_interoperability/rust/libanalyze/analyze.h_" -msgstr "_interopérabilité/rust/libanalyze/analyze.h_" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/struct.md +msgid "" +"Finishing a `Struct` returns control back to its parent, which in our previous slide was " +"assumed the `Root`, but in reality however it can be also something else such as `Struct` " +"in case of nested \"structs\"." +msgstr "" -#: src/android/interoperability/with-c/rust.md -#, fuzzy -msgid "_interoperability/rust/libanalyze/Android.bp_" -msgstr "_interopérabilité/rust/libanalyze/Android.bp_" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "\"[\"" +msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "\"libanalyze_ffi\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "\"{value},\"" msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "\"analyze_ffi\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "With the addition of the Property state methods, our diagram is now nearly complete:" msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "\"analyze.rs\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "" +"A property can be defined as a `String`, `Struct`, or `List`, enabling the " +"representation of nested structures." msgstr "" -#: src/android/interoperability/with-c/rust.md -#, fuzzy -msgid "We can now call this from a C binary:" -msgstr "Nous pouvons maintenant appeler cela à partir d'un binaire C :" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/property.md +msgid "" +"This concludes the step-by-step implementation. The full implementation, including " +"support for `List`, is shown in the next slide." +msgstr "" -#: src/android/interoperability/with-c/rust.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md #, fuzzy -msgid "_interoperability/rust/analyze/main.c_" -msgstr "_interoperability/rust/analyze/main.c_" +msgid "Serializer: complete implementation" +msgstr "Mise en œuvre des services" -#: src/android/interoperability/with-c/rust.md -msgid "\"analyze.h\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md +msgid "Looking back at our original desired flow:" msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "_interoperability/rust/analyze/Android.bp_" -msgstr "_interoperability/rust/analyze/Android.bp_" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md +msgid "We can now see this reflected directly in the types of our serializer:" +msgstr "" -#: src/android/interoperability/with-c/rust.md -msgid "\"analyze_numbers\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md +#, fuzzy +msgid "" +"The code for the full implementation of the `Serializer` and all its states can be found " +"in [this Rust playground](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=c9cbb831cd05fe9db4ce42713c83ca16)." msgstr "" +"Testez le code ci-dessus sur [Rust Playground](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2021&gist=3ce2ad13ea1302f6572cb15cd96becf0)." -#: src/android/interoperability/with-c/rust.md -msgid "\"main.c\"" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md +msgid "This pattern isn't a silver bullet. It still allows issues like:" msgstr "" -#: src/android/interoperability/with-c/rust.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md msgid "" -"```shell\n" -"m analyze_numbers\n" -"adb push \"$ANDROID_PRODUCT_OUT/system/bin/analyze_numbers\" /data/local/" -"tmp\n" -"adb shell /data/local/tmp/analyze_numbers\n" -"```" +"Empty or invalid property names (which can be fixed using [the newtype pattern](../../" +"newtype-pattern.md))" msgstr "" -#: src/android/interoperability/with-c/rust.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md msgid "" -"`#[no_mangle]` disables Rust's usual name mangling, so the exported symbol " -"will just be the name of the function. You can also use `#[export_name = " -"\"some_name\"]` to specify whatever name you want." +"Duplicate property names (which could be tracked in `Struct` and handled via `Result`)" msgstr "" -"`#[no_mangle]` désactive la modification du nom habituel de Rust, de sorte " -"que le symbole exporté sera simplement le nom de la fonction. Vous pouvez " -"également utiliser `#[export_name = \"some_name\"]` pour spécifier le nom " -"que vous voulez." -#: src/android/interoperability/cpp.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md msgid "" -"The [CXX crate](https://cxx.rs/) makes it possible to do safe " -"interoperability between Rust and C++." +"If validation failures occur, we can also change method signatures to return a `Result`, " +"allowing recovery:" msgstr "" -"La [caisse CXX](https://cxx.rs/) permet de faire une interopérabilité sûre " -"entre Rust et C++." -#: src/android/interoperability/cpp.md -#, fuzzy -msgid "The overall approach looks like this:" -msgstr "L'approche globale ressemble à ceci:" +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md +msgid "" +"While this API is powerful, it’s not always ergonomic. Production serializers typically " +"favor simpler APIs and reserve the typestate pattern for enforcing critical invariants." +msgstr "" -#: src/android/interoperability/cpp/bridge.md +#: src/idiomatic/leveraging-the-type-system/typestate-pattern/typestate-generics/complete.md msgid "" -"CXX relies on a description of the function signatures that will be exposed " -"from each language to the other. You provide this description using extern " -"blocks in a Rust module annotated with the `#[cxx::bridge]` attribute macro." +"One excellent real-world example is [`rustls::ClientConfig`](https://docs.rs/rustls/" +"latest/rustls/client/struct.ClientConfig.html#method.builder), which uses typestate with " +"generics to guide the user through safe and correct configuration steps." msgstr "" -#: src/android/interoperability/cpp/bridge.md -msgid "\"org::blobstore\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "Using the Borrow checker to enforce Invariants" msgstr "" -#: src/android/interoperability/cpp/bridge.md -msgid "// Shared structs with fields visible to both languages.\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"The borrow checker, while added to enforce memory ownership, can model other problems and " +"prevent API misuse." msgstr "" -#: src/android/interoperability/cpp/bridge.md -#: src/android/interoperability/cpp/generated-cpp.md -msgid "// Rust types and signatures exposed to C++.\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"/// Doors can be open or closed, and you need the right key to lock or unlock\n" +"/// one. Modelled with a Shared key and Owned door.\n" msgstr "" -#: src/android/interoperability/cpp/bridge.md -#: src/android/interoperability/cpp/rust-bridge.md -#: src/android/interoperability/cpp/generated-cpp.md -#: src/android/interoperability/cpp/rust-result.md -#: src/chromium/interoperability-with-cpp/example-bindings.md -#: src/chromium/interoperability-with-cpp/error-handling-qr.md -#: src/chromium/interoperability-with-cpp/error-handling-png.md -#, fuzzy -msgid "\"Rust\"" -msgstr "Rustdoc" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "\"Opened the door with key shape '{}'\"" +msgstr "" -#: src/android/interoperability/cpp/bridge.md -#: src/android/interoperability/cpp/cpp-bridge.md -msgid "// C++ types and signatures exposed to Rust.\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "\"Door wasn't opened! Your key only opens locks with shape '{}'\"" msgstr "" -#: src/android/interoperability/cpp/bridge.md -#: src/android/interoperability/cpp/cpp-bridge.md -#: src/android/interoperability/cpp/cpp-exception.md -#: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "\"C++\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"We've seen the borrow checker prevent memory safety bugs (use-after-free, data races)." msgstr "" -#: src/android/interoperability/cpp/bridge.md -#: src/android/interoperability/cpp/cpp-bridge.md -msgid "\"include/blobstore.h\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"We've also used types to shape and restrict APIs already using [the Typestate pattern](../" +"leveraging-the-type-system/typestate-pattern.md)." msgstr "" -#: src/android/interoperability/cpp/bridge.md -msgid "The bridge is generally declared in an `ffi` module within your crate." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "Language features are often introduced for a specific purpose." msgstr "" -#: src/android/interoperability/cpp/bridge.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md msgid "" -"From the declarations made in the bridge module, CXX will generate matching " -"Rust and C++ type/function definitions in order to expose those items to " -"both languages." +"Over time, users may develop ways of using a feature in ways that were not predicted when " +"they were introduced." msgstr "" -#: src/android/interoperability/cpp/bridge.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md msgid "" -"To view the generated Rust code, use [cargo-expand](https://github.com/" -"dtolnay/cargo-expand) to view the expanded proc macro. For most of the " -"examples you would use `cargo expand ::ffi` to expand just the `ffi` module " -"(though this doesn't apply for Android projects)." +"Java 5 introduced Generics in 2004 with the [main stated purpose of enabling type-safe " +"collections](https://jcp.org/en/jsr/detail?id=14)." msgstr "" -#: src/android/interoperability/cpp/bridge.md -msgid "To view the generated C++ code, look in `target/cxxbridge`." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"Adoption was slow at first, but some new projects began designing their APIs around " +"generics from the beginning." msgstr "" -#: src/android/interoperability/cpp/rust-bridge.md -msgid "Rust Bridge Declarations" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"Since then, users and developers of the language expanded the use of generics to other " +"areas of type-safe API design:" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "Class information can be held onto via Java's `Class` or Guava's `TypeToken`." msgstr "" -#: src/android/interoperability/cpp/rust-bridge.md -msgid "// Opaque type\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "The Builder pattern can be implemented using Recursive Generics." msgstr "" -#: src/android/interoperability/cpp/rust-bridge.md -msgid "// Method on `MyType`\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"We aim to do something similar here: Even though the borrow checker was introduced to " +"prevent use-after-free and data races, we treat it as just another API design tool." msgstr "" -#: src/android/interoperability/cpp/rust-bridge.md -#, fuzzy -msgid "// Free function\n" -msgstr "Fonctions" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"It can be used to model program properties that have nothing to do with preventing memory " +"safety bugs." +msgstr "" -#: src/android/interoperability/cpp/rust-bridge.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md msgid "" -"Items declared in the `extern \"Rust\"` reference items that are in scope in " -"the parent module." +"To use the borrow checker as a problem solving tool, we will need to \"forget\" that the " +"original purpose of it is to prevent mutable aliasing in the context of preventing use-" +"after-frees and data races." msgstr "" -#: src/android/interoperability/cpp/rust-bridge.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md msgid "" -"The CXX code generator uses your `extern \"Rust\"` section(s) to produce a C+" -"+ header file containing the corresponding C++ declarations. The generated " -"header has the same path as the Rust source file containing the bridge, " -"except with a .rs.h file extension." +"We should imagine working within situations where the rules are the same but the meaning " +"is slightly different." msgstr "" -#: src/android/interoperability/cpp/generated-cpp.md -msgid "Results in (roughly) the following C++:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"This example uses ownership and borrowing are used to model the state of a physical door." msgstr "" -#: src/android/interoperability/cpp/cpp-bridge.md -msgid "C++ Bridge Declarations" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"`open_door` **consumes** a `LockedDoor` and returns a new `OpenDoor`. The old " +"`LockedDoor` value is no longer available." msgstr "" -#: src/android/interoperability/cpp/cpp-bridge.md -msgid "Results in (roughly) the following Rust:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"If the wrong key is used, the door is left locked. It is returned as an `Err` case of the " +"`Result`." msgstr "" -#: src/android/interoperability/cpp/cpp-bridge.md -msgid "\"org$blobstore$cxxbridge1$new_blobstore_client\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "It is a compile-time error to try and use a door that has already been opened." msgstr "" -#: src/android/interoperability/cpp/cpp-bridge.md -msgid "\"org$blobstore$cxxbridge1$BlobstoreClient$put\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"Similarly, `lock_door` consumes an `OpenDoor`, preventing closing the door twice at " +"compile time." msgstr "" -#: src/android/interoperability/cpp/cpp-bridge.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md msgid "" -"The programmer does not need to promise that the signatures they have typed " -"in are accurate. CXX performs static assertions that the signatures exactly " -"correspond with what is declared in C++." +"The rules of the borrow checker exist to prevent memory safety bugs, but the underlying " +"logical system does not \"know\" what memory is." msgstr "" -#: src/android/interoperability/cpp/cpp-bridge.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md msgid "" -"`unsafe extern` blocks allow you to declare C++ functions that are safe to " -"call from Rust." +"All the borrow checker does is enforce a specific set of rules of how users can order " +"operations." msgstr "" -#: src/android/interoperability/cpp/shared-types.md -msgid "// A=1, J=11, Q=12, K=13\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants.md +msgid "" +"This is just one case of piggy-backing onto the rules of the borrow checker to design " +"APIs to be harder or impossible to misuse." msgstr "" -#: src/android/interoperability/cpp/shared-types.md -msgid "Only C-like (unit) enums are supported." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "// An internal data type to have something to hold onto.\n" msgstr "" -#: src/android/interoperability/cpp/shared-types.md -msgid "" -"A limited number of traits are supported for `#[derive()]` on shared types. " -"Corresponding functionality is also generated for the C++ code, e.g. if you " -"derive `Hash` also generates an implementation of `std::hash` for the " -"corresponding C++ type." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "// The \"outer\" data.\n" msgstr "" -#: src/android/interoperability/cpp/shared-enums.md -#, fuzzy -msgid "Generated Rust:" -msgstr "Rust non sécurisé (_unsafe_)" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "// let exclusive = exclusive_use(&mut value); // ❌🔨\n" +msgstr "" -#: src/android/interoperability/cpp/shared-enums.md -msgid "Generated C++:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "// let shared = shared_use(&value); // ❌🔨\n" msgstr "" -#: src/android/interoperability/cpp/shared-enums.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md msgid "" -"On the Rust side, the code generated for shared enums is actually a struct " -"wrapping a numeric value. This is because it is not UB in C++ for an enum " -"class to hold a value different from all of the listed variants, and our " -"Rust representation needs to have the same behavior." +"This example re-frames the borrow checker rules away from references and towards semantic " +"meaning in non-memory-safety settings." msgstr "" -#: src/android/interoperability/cpp/rust-result.md -msgid "\"fallible1 requires depth > 0\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "Nothing is being mutated, nothing is being sent across threads." msgstr "" -#: src/android/interoperability/cpp/rust-result.md -msgid "\"Success!\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "" +"In Rust's borrow checker we have access to three different ways of \"taking\" a value:" msgstr "" -#: src/android/interoperability/cpp/rust-result.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md msgid "" -"Rust functions that return `Result` are translated to exceptions on the C++ " -"side." +"Owned value `T`. Value is dropped when the scope ends, unless it is not returned to " +"another scope." msgstr "" -#: src/android/interoperability/cpp/rust-result.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md msgid "" -"The exception thrown will always be of type `rust::Error`, which primarily " -"exposes a way to get the error message string. The error message will come " -"from the error type's `Display` impl." +"Shared Reference `&T`. Allows aliasing but prevents mutable access while shared " +"references are in use." msgstr "" -#: src/android/interoperability/cpp/rust-result.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md msgid "" -"A panic unwinding from Rust to C++ will always cause the process to " -"immediately terminate." +"Mutable Reference `&mut T`. Only one of these is allowed to exist for a value at any one " +"point, but can be used to create shared references." msgstr "" -#: src/android/interoperability/cpp/cpp-exception.md -msgid "\"example/include/example.h\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "" +"Ask: The two commented-out lines in the `demo` functions would cause compilation errors, " +"Why?" msgstr "" -#: src/android/interoperability/cpp/cpp-exception.md -msgid "\"Error: {}\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "" +"`demo_exclusive`: Because the `shared` value is still aliased after the `exclusive` " +"reference is taken." msgstr "" -#: src/android/interoperability/cpp/cpp-exception.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md msgid "" -"C++ functions declared to return a `Result` will catch any thrown exception " -"on the C++ side and return it as an `Err` value to the calling Rust function." +"`demo_denied`: Because `value` is consumed the line before the `shared_again_again` " +"reference is taken from `&value`." msgstr "" -#: src/android/interoperability/cpp/cpp-exception.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md msgid "" -"If an exception is thrown from an extern \"C++\" function that is not " -"declared by the CXX bridge to return `Result`, the program calls C++'s `std::" -"terminate`. The behavior is equivalent to the same exception being thrown " -"through a `noexcept` C++ function." +"Remember that every `&T` and `&mut T` has a lifetime, just one the user doesn't have to " +"annotate or think about most of the time." msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "C++ Type" -msgstr "Exemple C++" - -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`rust::String`" -msgstr "`rust_bindgen`" - -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`&str`" -msgstr "`&str`" - -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`rust::Str`" -msgstr "`rust_test`" - -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`CxxString`" -msgstr "String" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/generalizing-ownership.md +msgid "" +"We rarely specify lifetimes because the Rust compiler allows us to _elide_ them in most " +"cases. See: [Lifetime Elision](../../../lifetimes/lifetime-elision.md)" +msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`std::string`" -msgstr "String" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "" +"Sometimes we want values that _can only be used once_. One critical example of this is in " +"cryptography: A \"Nonce.\"" +msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -msgid "`&[T]`/`&mut [T]`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "/* specifics omitted */" msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`rust::Slice`" -msgstr "`rust_ffi`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "/// A single-use number suitable for cryptographic purposes.\n" +msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -msgid "`rust::Box`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "/// A cryptographically sound random generator function.\n" msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -msgid "`UniquePtr`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "// chosen by a fair dice roll, https://xkcd.com/221/\n" msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -msgid "`std::unique_ptr`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "/// Consume a nonce, but not the key or the data.\n" msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`rust::Vec`" -msgstr "`mpsc::Récepteur`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "// The key and data can be re-used, copied, etc. but the nonce cannot.\n" +msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`CxxVector`" -msgstr "`Cellule`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "// encrypt(nonce, &key, &data_2); // 🛠️❌\n" +msgstr "" -#: src/android/interoperability/cpp/type-mapping.md -#, fuzzy -msgid "`std::vector`" -msgstr "`mpsc::Récepteur`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "Problem: How can we guarantee a value is used only once?" +msgstr "" -#: src/android/interoperability/cpp/type-mapping.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md msgid "" -"These types can be used in the fields of shared structs and the arguments " -"and returns of extern functions." +"Motivation: A nonce is a piece of random, unique data used in cryptographic protocols to " +"prevent replay attacks." msgstr "" -#: src/android/interoperability/cpp/type-mapping.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md msgid "" -"Note that Rust's `String` does not map directly to `std::string`. There are " -"a few reasons for this:" +"Background: In practice people have ended up accidentally re-using nonces. Most commonly, " +"this causes the cryptographic protocol to completely break down and stop fulfilling its " +"function." msgstr "" -#: src/android/interoperability/cpp/type-mapping.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md msgid "" -"`std::string` does not uphold the UTF-8 invariant that `String` requires." +"Depending on the specifics of nonce reuse and cryptography at hand, private keys can also " +"become computable by attackers." msgstr "" -#: src/android/interoperability/cpp/type-mapping.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md msgid "" -"The two types have different layouts in memory and so can't be passed " -"directly between languages." +"Rust has an obvious tool for achieving the invariant \"Once you use this, you can't use " +"it again\": passing a value as an _owned argument_." msgstr "" -#: src/android/interoperability/cpp/type-mapping.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md msgid "" -"`std::string` requires move constructors that don't match Rust's move " -"semantics, so a `std::string` can't be passed by value to Rust." +"Highlight: the `encrypt` function takes `nonce` by value (an owned argument), but `key` " +"and `data` by reference." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md -#: src/android/interoperability/cpp/android-cpp-genrules.md -#: src/android/interoperability/cpp/android-build-rust.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md #, fuzzy -msgid "Building in Android" -msgstr "Rust pour Android" +msgid "The technique for single-use values is as follows:" +msgstr "Les types ont des largeurs comme suit :" -#: src/android/interoperability/cpp/android-build-cpp.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md msgid "" -"Create a `cc_library_static` to build the C++ library, including the CXX " -"generated header and source file." +"Keep constructors private, so a user can't construct values with the same inner value " +"twice." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md -#: src/android/interoperability/cpp/android-build-rust.md -msgid "\"libcxx_test_cpp\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "" +"Don't implement `Clone`/`Copy` traits or equivalent methods, so a user can't duplicate " +"data we want to keep unique." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md -msgid "\"cxx_test.cpp\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "" +"Make the interior type opaque (like with the newtype pattern), so the user cannot modify " +"an existing value on their own." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md -msgid "\"cxx-bridge-header\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "Ask: What are we missing from the newtype pattern in the slide's code?" msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "\"libcxx_test_bridge_header\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "Expect: Module boundary." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "\"libcxx_test_bridge_code\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "Demonstrate: Without a module boundary a user can construct a nonce on their own." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md -msgid "" -"Point out that `libcxx_test_bridge_header` and `libcxx_test_bridge_code` are " -"the dependencies for the CXX-generated C++ bindings. We'll show how these " -"are setup on the next slide." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md +msgid "Fix: Put `Key`, `Nonce`, and `new_nonce` behind a module." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/single-use-values.md msgid "" -"Note that you also need to depend on the `cxx-bridge-header` library in " -"order to pull in common CXX definitions." +"Cryptography Nuance: A nonce might still be used twice if it was created through pseudo-" +"random process with no actual randomness. That can't be prevented through this method. " +"This API design prevents one nonce duplication, but not all logic bugs." msgstr "" -#: src/android/interoperability/cpp/android-build-cpp.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md msgid "" -"Full docs for using CXX in Android can be found in [the Android docs]" -"(https://source.android.com/docs/setup/build/rust/building-rust-modules/" -"android-rust-patterns#rust-cpp-interop-using-cxx). You may want to share " -"that link with the class so that students know where they can find these " -"instructions again in the future." +"We can use the mutual exclusion of `&T` and `&mut T` references to prevent data from " +"being used before it is ready." msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "" -"Create two genrules: One to generate the CXX header, and one to generate the " -"CXX source file. These are then used as inputs to the `cc_library_static`." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "/* fields omitted */" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "" -"// Generate a C++ header containing the C++ bindings\n" -"// to the Rust exported functions in lib.rs.\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "// fake results\n" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "\"cxxbridge\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "// Send the query over, but don't wait for results.\n" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "\"$(location cxxbridge) $(in) --header > $(out)\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "// Finish executing the transaction and retrieve the results.\n" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -#: src/android/interoperability/cpp/android-build-rust.md -msgid "\"lib.rs\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "// The transaction `tx` mutably borrows `db`.\n" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "\"lib.rs.h\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "\"SELECT * FROM users\"" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "// Generate the C++ code that Rust calls into.\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"// This won't compile because `db` is already mutably borrowed by `tx`.\n" +" // let results = db.results(); // ❌🔨\n" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "\"$(location cxxbridge) $(in) > $(out)\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "// The borrow of `db` ends when `tx` is consumed by `commit()`.\n" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md -msgid "\"lib.rs.cc\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "// Now it is possible to borrow `db` again.\n" msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md msgid "" -"The `cxxbridge` tool is a standalone tool that generates the C++ side of the " -"bridge module. It is included in Android and available as a Soong tool." +"Motivation: In this database API queries are kicked off for asynchronous execution and " +"the results are only available once the whole transaction is finished." msgstr "" -#: src/android/interoperability/cpp/android-cpp-genrules.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md msgid "" -"By convention, if your Rust source file is `lib.rs` your header file will be " -"named `lib.rs.h` and your source file will be named `lib.rs.cc`. This naming " -"convention isn't enforced, though." +"A user might think that queries are executed immediately, and try to read results before " +"they are made available. This API misuse could make the app read incomplete or incorrect " +"data." msgstr "" -#: src/android/interoperability/cpp/android-build-rust.md -msgid "" -"Create a `rust_binary` that depends on `libcxx` and your `cc_library_static`." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "While an obvious misunderstanding, situations such as this can happen in practice." msgstr "" -#: src/android/interoperability/cpp/android-build-rust.md -msgid "\"cxx_test\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "Ask: Has anyone misunderstood an API by not reading the docs for proper use?" msgstr "" -#: src/android/interoperability/cpp/android-build-rust.md -msgid "\"libcxx\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "Expect: Examples of early-career or in-university mistakes and misunderstandings." msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "Interoperability with Java" -msgstr "Interopérabilité avec Java" - -#: src/android/interoperability/java.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md msgid "" -"Java can load shared objects via [Java Native Interface (JNI)](https://en." -"wikipedia.org/wiki/Java_Native_Interface). The [`jni` crate](https://docs.rs/" -"jni/) allows you to create a compatible library." +"As an API grows in size and user base, a smaller percentage of users has deep knowledge " +"of the system the API represents." msgstr "" -"Java peut charger des objets partagés via [Java Native Interface (JNI)]" -"(https://en.wikipedia.org/wiki/Java_Native_Interface). Le [`jni` crate]" -"(https://docs.rs/jni/) vous permet de créer une bibliothèque compatible." -#: src/android/interoperability/java.md -#, fuzzy -msgid "First, we create a Rust function to export to Java:" -msgstr "Tout d'abord, nous créons une fonction Rust à exporter vers Java :" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"This example shows how we can use Aliasing XOR Mutability to prevent this kind of misuse." +msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "_interoperability/java/src/lib.rs_:" -msgstr "_interopérabilité/java/src/lib.rs_ :" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"The code might read results before they are ready if the programmer assumes that the " +"queries execute immediately rather than kicked off for asynchronous execution." +msgstr "" -#: src/android/interoperability/java.md -msgid "//! Rust <-> Java FFI demo.\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"The constructor for the `Transaction` type takes a mutable reference to the database " +"connection, and stores it in the returned `Transaction` value." msgstr "" -#: src/android/interoperability/java.md -msgid "/// HelloWorld::hello method implementation.\n" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"The explicit lifetime here doesn't have to be intimidating, it just means \"`Transaction` " +"is outlived by the `DatabaseConnection` that was passed to it\" in this case." msgstr "" -#: src/android/interoperability/java.md -msgid "\"system\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"The reference is mutable to completely lock out the `DatabaseConnection` from other " +"usage, such as starting further transactions or reading the results." msgstr "" -#: src/android/interoperability/java.md -msgid "\"Hello, {input}!\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"While a `Transaction` exists, we can't touch the `DatabaseConnection` variable that was " +"created from it." msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "_interoperability/java/Android.bp_:" -msgstr "_interopérabilité/java/Android.bp_ :" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"Demonstrate: uncomment the `db.results()` line. Doing so will result in a compile error, " +"as `db` is already mutably borrowed." +msgstr "" -#: src/android/interoperability/java.md -msgid "\"libhello_jni\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"Note: The query results not being public and placed behind a getter function lets us " +"enforce the invariant \"users can only look at query results if there is no active " +"transactions.\"" msgstr "" -#: src/android/interoperability/java.md -msgid "\"hello_jni\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/aliasing-xor-mutability.md +msgid "" +"If the query results were placed in a public struct field, this invariant could be " +"violated." msgstr "" -#: src/android/interoperability/java.md -msgid "\"libjni\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "PhantomData 1/4: De-duplicating Same Data & Semantics" msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "We then call this function from Java:" -msgstr "Enfin, nous pouvons appeler cette fonction depuis Java :" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "" +"The newtype pattern can sometimes come up against the DRY principle, how do we solve this?" +msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "_interoperability/java/HelloWorld.java_:" -msgstr "_interopérabilité/java/HelloWorld.java_ :" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "// And so on ...\n" +msgstr "" -#: src/android/interoperability/java.md -msgid "\"helloworld_jni\"" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "" +"Problem: We want to use the newtype pattern to differentiate permissions, but we're " +"having to implement the same traits over and over again for the same data." msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "\"HelloWorld.java\"" -msgstr "Bonjour le monde!" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "" +"Ask: Assume the details of each implementation here are the same between types, what are " +"ways we can avoid repeating ourselves?" +msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "\"HelloWorld\"" -msgstr "Bonjour le monde!" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "Expect:" +msgstr "" -#: src/android/interoperability/java.md -#, fuzzy -msgid "Finally, you can build, sync, and run the binary:" -msgstr "Enfin, vous pouvez créer, synchroniser et exécuter le binaire :" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "Make this an enum, not distinct data types." +msgstr "" -#: src/exercises/android/morning.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md msgid "" -"This is a group exercise: We will look at one of the projects you work with " -"and try to integrate some Rust into it. Some suggestions:" +"Bundle the user ID with permission tokens like `struct Admin(u64, UserPermission, " +"ModeratorPermission, AdminPermission);`" msgstr "" -"Pour le dernier exercice, nous examinerons l'un des projets sur lesquels " -"vous travaillez. Laissez-nous regroupez-vous et faites-le ensemble. Quelques " -"suggestions:" -#: src/exercises/android/morning.md -#, fuzzy -msgid "Call your AIDL service with a client written in Rust." -msgstr "Appelez votre service AIDL avec un client écrit en Rust." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "Adding a type parameter which encodes permissions." +msgstr "" -#: src/exercises/android/morning.md -#, fuzzy -msgid "Move a function from your project to Rust and call it." -msgstr "Déplacez une fonction de votre projet vers Rust et appelez-la." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-01-types.md +msgid "Mentioning `PhantomData` ahead of schedule (it's in the title)." +msgstr "" -#: src/exercises/android/morning.md -#, fuzzy -msgid "" -"No solution is provided here since this is open-ended: it relies on someone " -"in the class having a piece of code which you can turn in to Rust on the fly." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "PhantomData 2/4: Type-level tagging" msgstr "" -"Aucune solution n'est proposée ici car celle-ci est ouverte : elle repose " -"sur quelqu'un en la classe ayant un morceau de code que vous pouvez remettre " -"à Rust à la volée." -#: src/chromium.md -#, fuzzy -msgid "Welcome to Rust in Chromium" -msgstr "Bienvenue au jour 1" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "Let's solve the problem from the previous slide by adding a type parameter." +msgstr "" -#: src/chromium.md -msgid "" -"Rust is supported for third-party libraries in Chromium, with first-party " -"glue code to connect between Rust and existing Chromium C++ code." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "// use std::marker::PhantomData;\n" msgstr "" -#: src/chromium.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "// Admins are users\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md msgid "" -"Today, we'll call into Rust to do something silly with strings. If you've " -"got a corner of the code where you're displaying a UTF8 string to the user, " -"feel free to follow this recipe in your part of the codebase instead of the " -"exact part we talk about." +"// impl Debug for UserTag {/* ... */}\n" +"// impl PartialEq for UserTag {/* ... */}\n" +"// impl Eq for UserTag {/* ... */}\n" +"// And so on ...\n" msgstr "" -#: src/chromium/setup.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "/* All functionality for users and above */" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "/* All functionality for only admins */" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md msgid "" -"Make sure you can build and run Chromium. Any platform and set of build " -"flags is OK, so long as your code is relatively recent (commit position " -"1223636 onwards, corresponding to November 2023):" +"Here we're using a type parameter and gating permissions behind \"tag\" types that " +"implement different permission traits." msgstr "" -#: src/chromium/setup.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md msgid "" -"(A component, debug build is recommended for quickest iteration time. This " -"is the default!)" +"Tag types, or marker types, are zero-sized types that have some semantic meaning to users " +"and API designers." msgstr "" -#: src/chromium/setup.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "Ask: What issues does having it be an actual instance of that type pose?" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md msgid "" -"See [How to build Chromium](https://www.chromium.org/developers/how-tos/get-" -"the-code/) if you aren't already at that point. Be warned: setting up to " -"build Chromium takes time." +"Answer: If it's not a zero-sized type (like `()` or `struct MyTag;`), then we're " +"allocating more memory than we need to when all we care for is type information that is " +"only relevant at compile-time." msgstr "" -#: src/chromium/setup.md -msgid "It's also recommended that you have Visual Studio code installed." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "Demonstrate: remove the `tag` value entirely, then compile!" msgstr "" -#: src/chromium/setup.md -msgid "About the exercises" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "This won't compile, as there's an unused (phantom) type parameter." msgstr "" -#: src/chromium/setup.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "This is where `PhantomData` comes in!" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "Demonstrate: Uncomment the `PhantomData` import, and make `ChatId` the following:" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md msgid "" -"This part of the course has a series of exercises which build on each other. " -"We'll be doing them spread throughout the course instead of just at the end. " -"If you don't have time to complete a certain part, don't worry: you can " -"catch up in the next slot." +"`PhantomData` is a zero-sized type with a type parameter. We can construct values of " +"it like other ZSTs with `let phantom: PhantomData = PhantomData;` or with the " +"`PhantomData::default()` implementation." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md msgid "" -"The Rust community typically uses `cargo` and libraries from [crates.io]" -"(https://crates.io/). Chromium is built using `gn` and `ninja` and a curated " -"set of dependencies." +"Demonstrate: implement `From` for `ChatId`, emphasizing the construction of " +"`PhantomData`" msgstr "" -#: src/chromium/cargo.md -msgid "When writing code in Rust, your choices are:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md +msgid "// Or `PhantomData::default()`\n" msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-02-types-implemented.md msgid "" -"Use `gn` and `ninja` with the help of the templates from `//build/rust/*." -"gni` (e.g. `rust_static_library` that we'll meet later). This uses " -"Chromium's audited toolchain and crates." +"`PhantomData` can be used as part of the Typestate pattern to have data with the same " +"structure but different methods, e.g., have `TaggedData` implement methods or " +"trait implementations that `TaggedData` doesn't." msgstr "" -#: src/chromium/cargo.md -msgid "" -"Use `cargo`, but [restrict yourself to Chromium's audited toolchain and " -"crates](https://chromium.googlesource.com/chromium/src/+/refs/heads/main/" -"docs/rust.md#Using-cargo)" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "PhantomData 3/4: Lifetimes for External Resources" msgstr "" -#: src/chromium/cargo.md -msgid "" -"Use `cargo`, trusting a [toolchain](https://rustup.rs/) and/or [crates " -"downloaded from the internet](https://crates.io/)" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "The invariants of external resources often match what we can do with lifetime rules." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"From here on we'll be focusing on `gn` and `ninja`, because this is how Rust " -"code can be built into the Chromium browser. At the same time, Cargo is an " -"important part of the Rust ecosystem and you should keep it in your toolbox." +"/// Direct FFI to a database library in C.\n" +"/// We got this API as is, we have no influence over it.\n" msgstr "" -#: src/chromium/cargo.md -#, fuzzy -msgid "Mini exercise" -msgstr "Exercices" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "// maximum 255 databases open at the same time\n" +msgstr "" -#: src/chromium/cargo.md -msgid "Split into small groups and:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "// ... etc.\n" msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"Brainstorm scenarios where `cargo` may offer an advantage and assess the " -"risk profile of these scenarios." +"Remember the transaction API from the [Aliasing XOR Mutability](./aliasing-xor-mutability." +"md) example." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"Discuss which tools, libraries, and groups of people need to be trusted when " -"using `gn` and `ninja`, offline `cargo`, etc." +"We held onto a mutable reference to the database connection within the transaction type " +"to lock out the database while a transaction is active." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"Ask students to avoid peeking at the speaker notes before completing the " -"exercise. Assuming folks taking the course are physically together, ask them " -"to discuss in small groups of 3-4 people." +"In this example, we want to implement a `Transaction` API on top of an external, non-Rust " +"API." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "We start by defining a `Transaction` type that holds onto `&mut DatabaseConnection`." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"Notes/hints related to the first part of the exercise (\"scenarios where " -"Cargo may offer an advantage\"):" +"Ask: What are the limits of this implementation? Assume the `u8` is accurate " +"implementation-wise and enough information for us to use the external API." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"It's fantastic that when writing a tool, or prototyping a part of Chromium, " -"one has access to the rich ecosystem of crates.io libraries. There is a " -"crate for almost anything and they are usually quite pleasant to use. " -"(`clap` for command-line parsing, `serde` for serializing/deserializing to/" -"from various formats, `itertools` for working with iterators, etc.)." +"Indirection takes up 7 bytes more than we need to on a 64-bit platform, as well as " +"costing a pointer dereference at runtime." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"`cargo` makes it easy to try a library (just add a single line to `Cargo." -"toml` and start writing code)" +"Problem: We want the transaction to borrow the database connection that created it, but " +"we don't want the `Transaction` object to store a real reference." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"It may be worth comparing how CPAN helped make `perl` a popular choice. Or " -"comparing with `python` + `pip`." +"Ask: What happens when we remove the mutable reference in `Transaction` while keeping the " +"lifetime parameter?" msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "Expect: Unused lifetime parameter!" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"Development experience is made really nice not only by core Rust tools (e.g. " -"using `rustup` to switch to a different `rustc` version when testing a crate " -"that needs to work on nightly, current stable, and older stable) but also by " -"an ecosystem of third-party tools (e.g. Mozilla provides `cargo vet` for " -"streamlining and sharing security audits; `criterion` crate gives a " -"streamlined way to run benchmarks)." +"Like with the type tagging from the previous slides, we can bring in `PhantomData` to " +"capture this unused lifetime parameter for us." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"`cargo` makes it easy to add a tool via `cargo install --locked cargo-vet`." +"The difference is that we will need to use the lifetime alongside another type, but that " +"other type does not matter too much." msgstr "" -#: src/chromium/cargo.md -msgid "It may be worth comparing with Chrome Extensions or VScode extensions." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "Demonstrate: change `Transaction` to the following:" msgstr "" -#: src/chromium/cargo.md -msgid "" -"Broad, generic examples of projects where `cargo` may be the right choice:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "Update the `DatabaseConnection::new_transaction()` method:" msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"Perhaps surprisingly, Rust is becoming increasingly popular in the industry " -"for writing command line tools. The breadth and ergonomics of libraries is " -"comparable to Python, while being more robust (thanks to the rich " -"typesystem) and running faster (as a compiled, rather than interpreted " -"language)." +"This gives an owned database connection that is tied to the `DatabaseConnection` that " +"created it, but with less runtime memory footprint that the store-a-reference version did." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"Participating in the Rust ecosystem requires using standard Rust tools like " -"Cargo. Libraries that want to get external contributions, and want to be " -"used outside of Chromium (e.g. in Bazel or Android/Soong build environments) " -"should probably use Cargo." +"Because `PhantomData` is a zero-sized type (like `()` or `struct MyZeroSizedType;`), the " +"size of `Transaction` is now the same as `u8`." msgstr "" -#: src/chromium/cargo.md -msgid "Examples of Chromium-related projects that are `cargo`\\-based:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "The implementation that held onto a reference instead was as large as a `usize`." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md msgid "" -"`serde_json_lenient` (experimented with in other parts of Google which " -"resulted in PRs with performance improvements)" +"This way of encoding relationships between types and values is very powerful when " +"combined with unsafe, as the ways one can manipulate lifetimes becomes almost arbitrary. " +"This is also dangerous, but when combined with tools like external, mechanically-verified " +"proofs we can safely encode cyclic/self-referential types while encoding lifetime & " +"safety expectations in the relevant data types." msgstr "" -#: src/chromium/cargo.md -msgid "Fontations libraries like `font-types`" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-03-lifetimes.md +msgid "" +"The [GhostCell (2021)](https://plv.mpi-sws.org/rustbelt/ghostcell/) paper and its " +"[relevant implementation](https://gitlab.mpi-sws.org/FP/ghostcell) show this kind of work " +"off. While the borrow checker is restrictive, there are still ways to use escape hatches " +"and then _show that the ways you used those escape hatches are consistent and safe._" msgstr "" -#: src/chromium/cargo.md -msgid "" -"`gnrt` tool (we will meet it later in the course) which depends on `clap` " -"for command-line parsing and on `toml` for configuration files." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "PhantomData 4/4: OwnedFd & BorrowedFd" msgstr "" -#: src/chromium/cargo.md -msgid "" -"Disclaimer: a unique reason for using `cargo` was unavailability of `gn` " -"when building and bootstrapping Rust standard library when building Rust " -"toolchain." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "`BorrowedFd` is a prime example of `PhantomData` in action." msgstr "" -#: src/chromium/cargo.md -msgid "" -"`run_gnrt.py` uses Chromium's copy of `cargo` and `rustc`. `gnrt` depends on " -"third-party libraries downloaded from the internet, but `run_gnrt.py` asks " -"`cargo` that only `--locked` content is allowed via `Cargo.lock`.)" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "// Create a file with a raw syscall with write-only and create permissions.\n" msgstr "" -#: src/chromium/cargo.md -msgid "" -"Students may identify the following items as being implicitly or explicitly " -"trusted:" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "\"c_str.txt\"" msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"`rustc` (the Rust compiler) which in turn depends on the LLVM libraries, the " -"Clang compiler, the `rustc` sources (fetched from GitHub, reviewed by Rust " -"compiler team), binary Rust compiler downloaded for bootstrapping" +"// Pass the ownership of an integer file descriptor to an `OwnedFd`.\n" +" // `OwnedFd::drop()` closes the file descriptor.\n" msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "\"Could not open file with syscall!\"" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"`rustup` (it may be worth pointing out that `rustup` is developed under the " -"umbrella of the https://github.com/rust-lang/ organization - same as `rustc`)" +"// Create a `BorrowedFd` from an `OwnedFd`.\n" +" // `BorrowedFd::drop()` does not close the file because it doesn't own it!\n" msgstr "" -#: src/chromium/cargo.md -msgid "`cargo`, `rustfmt`, etc." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "// std::mem::drop(owned_fd); // ❌🔨\n" msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "// owned_fd will be dropped here, and the file will be closed.\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "A file descriptor represents a specific process's access to a file." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"Various internal infrastructure (bots that build `rustc`, system for " -"distributing the prebuilt toolchain to Chromium engineers, etc.)" +"Reminder: Device and OS-specific features are exposed as if they were files on unix-style " +"systems." msgstr "" -#: src/chromium/cargo.md -msgid "Cargo tools like `cargo audit`, `cargo vet`, etc." +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "" +"[`OwnedFd`](https://rust-lang.github.io/rfcs/3128-io-safety.html#ownedfd-and-" +"borrowedfdfd) is an owned wrapper type for a file descriptor. It _owns_ the file " +"descriptor, and closes it when dropped." msgstr "" -#: src/chromium/cargo.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"Rust libraries vendored into `//third_party/rust` (audited by " -"security@chromium.org)" +"Note: We have our own implementation of it here, draw attention to the explicit `Drop` " +"implementation." msgstr "" -#: src/chromium/cargo.md -msgid "Other Rust libraries (some niche, some quite popular and commonly used)" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "" +"`BorrowedFd` is its borrowed counterpart, it does not need to close the file when it is " +"dropped." msgstr "" -#: src/chromium/policy.md -msgid "Chromium Rust policy" +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md +msgid "Note: We have not explicitly implemented `Drop` for `BorrowedFd`." msgstr "" -#: src/chromium/policy.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"Chromium does not yet allow first-party Rust except in rare cases as " -"approved by Chromium's [Area Tech Leads](https://source.chromium.org/" -"chromium/chromium/src/+/main:ATL_OWNERS)." +"`BorrowedFd` uses a lifetime captured with a `PhantomData` to enforce the invariant \"if " +"this file descriptor exists, the OS file descriptor is still open even though it is not " +"responsible for closing that file descriptor.\"" msgstr "" -#: src/chromium/policy.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"Chromium's policy on third party libraries is outlined [here](https://" -"chromium.googlesource.com/chromium/src/+/main/docs/adding_to_third_party." -"md#rust) - Rust is allowed for third party libraries under various " -"circumstances, including if they're the best option for performance or for " -"security." +"The lifetime parameter of `BorrowedFd` demands that there exists another value in your " +"program that lasts as long as that specific `BorrowedFd` or outlives it (in this case an " +"`OwnedFd`)." msgstr "" -#: src/chromium/policy.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"Very few Rust libraries directly expose a C/C++ API, so that means that " -"nearly all such libraries will require a small amount of first-party glue " -"code." +"Demonstrate: Uncomment the `std::mem::drop(owned_fd)` line and try to compile to show " +"that `borrowed_fd` relies on the lifetime of `owned_fd`." msgstr "" -#: src/chromium/policy.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"```bob\n" -"\"C++\" Rust\n" -".- - - - - - - - - -. .- - - - - - - - - - - - - - - - - - - - - - " -"-.\n" -": : : :\n" -": Existing Chromium : : Chromium Rust Existing " -"Rust :\n" -": \"C++\" : : \"wrapper\" " -"crate :\n" -": +---------------+ : : +----------------+ +-------------" -"+ :\n" -": | | : : | | | " -"| :\n" -": | o-----+-+-----------+-+-> o-+----------+--> " -"| :\n" -": | | : Language : | | Crate | " -"| :\n" -": +---------------+ : boundary : +----------------+ API +-------------" -"+ :\n" -": : : :\n" -"`- - - - - - - - - -' `- - - - - - - - - - - - - - - - - - - - - - " -"-'\n" -"```" +"This has been encoded by the API designers to mean _that other value is what keeps the " +"access to the file open_." msgstr "" -#: src/chromium/policy.md +#: src/idiomatic/leveraging-the-type-system/borrow-checker-invariants/phantomdata-04-borrowedfd.md msgid "" -"First-party Rust glue code for a particular third-party crate should " -"normally be kept in `third_party/rust///wrapper`." +"Because Rust's borrow checker enforces this relationship where one value must last at " +"least as long as another, users of this API do not need to worry about handling this " +"correct file descriptor aliasing and closing logic themselves." msgstr "" -#: src/chromium/policy.md -msgid "Because of this, today's course will be heavily focused on:" +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "Types with private constructors can be used to act as proof of invariants." msgstr "" -#: src/chromium/policy.md -msgid "Bringing in third-party Rust libraries (\"crates\")" +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "// A public type with private fields behind a module boundary.\n" msgstr "" -#: src/chromium/policy.md -msgid "Writing glue code to be able to use those crates from Chromium C++." +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "\"We have a token, so we can make assumptions.\"" msgstr "" -#: src/chromium/policy.md -msgid "If this policy changes over time, the course will evolve to keep up." +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "// We have a token, so we can do this work.\n" msgstr "" -#: src/chromium/build-rules.md -#, fuzzy -msgid "Build rules" -msgstr "Règles de compilation" +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "// We could not get a token, so we can't call `protected_work`.\n" +msgstr "" -#: src/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"Rust code is usually built using `cargo`. Chromium builds with `gn` and " -"`ninja` for efficiency --- its static rules allow maximum parallelism. Rust " -"is no exception." +"Motivation: We want to be able to restrict user's access to functionality until they've " +"performed a specific task." msgstr "" -#: src/chromium/build-rules.md -msgid "Adding Rust code to Chromium" +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "" +"We can do this by defining a type the API consumer cannot construct on their own, through " +"the privacy rules of structs and modules." msgstr "" -#: src/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"In some existing Chromium `BUILD.gn` file, declare a `rust_static_library`:" +"[Newtypes](./newtype-pattern.md) use the privacy rules in a similar way, to restrict " +"construction unless a value is guaranteed to hold up an invariant at runtime." msgstr "" -#: src/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "Ask: What is the purpose of the `proof: ()` field here?" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"```gn\n" -"import(\"//build/rust/rust_static_library.gni\")\n" -"\n" -"rust_static_library(\"my_rust_lib\") {\n" -" crate_root = \"lib.rs\"\n" -" sources = [ \"lib.rs\" ]\n" -"}\n" -"```" +"Without `proof: ()`, `Token` would have no private fields and users would be able to " +"construct values of `Token` arbitrarily." msgstr "" -#: src/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"You can also add `deps` on other Rust targets. Later we'll use this to " -"depend upon third party code." +"Demonstrate: Try to construct the token manually in `main` and show the compilation " +"error. Demonstrate: Remove the `proof` field from `Token` to show how users would be able " +"to construct `Token` if it had no private fields." msgstr "" -#: src/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"You must specify _both_ the crate root, _and_ a full list of sources. The " -"`crate_root` is the file given to the Rust compiler representing the root " -"file of the compilation unit --- typically `lib.rs`. `sources` is a complete " -"list of all source files which `ninja` needs in order to determine when " -"rebuilds are necessary." +"By putting the `Token` type behind a module boundary (`token`), users outside that module " +"can't construct the value on their own as they don't have permission to access the " +"`proof` field." msgstr "" -#: src/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"(There's no such thing as a Rust `source_set`, because in Rust, an entire " -"crate is a compilation unit. A `static_library` is the smallest unit.)" +"The API developer gets to define methods and functions that produce these tokens. The " +"user does not." msgstr "" -#: src/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"Students might be wondering why we need a gn template, rather than using " -"[gn's built-in support for Rust static libraries](https://gn.googlesource." -"com/gn/+/main/docs/reference.md#func_static_library). The answer is that " -"this template provides support for CXX interop, Rust features, and unit " -"tests, some of which we'll use later." +"The token becomes a proof that one has met the API developer's conditions of access for " +"those tokens." msgstr "" -#: src/chromium/build-rules/unsafe.md -msgid "Including `unsafe` Rust Code" +#: src/idiomatic/leveraging-the-type-system/token-types.md +msgid "Ask: How might an API developer accidentally introduce ways to circumvent this?" msgstr "" -#: src/chromium/build-rules/unsafe.md +#: src/idiomatic/leveraging-the-type-system/token-types.md msgid "" -"Unsafe Rust code is forbidden in `rust_static_library` by default --- it " -"won't compile. If you need unsafe Rust code, add `allow_unsafe = true` to " -"the gn target. (Later in the course we'll see circumstances where this is " -"necessary.)" +"Expect answers like \"serialization implementations\", other parser/\"from string\" " +"implementations, or an implementation of `Default`." msgstr "" -#: src/chromium/build-rules/unsafe.md +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md +msgid "Token types work well as a proof of checked permission." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md msgid "" -"```gn\n" -"import(\"//build/rust/rust_static_library.gni\")\n" -"\n" -"rust_static_library(\"my_rust_lib\") {\n" -" crate_root = \"lib.rs\"\n" -" sources = [\n" -" \"lib.rs\",\n" -" \"hippopotamus.rs\"\n" -" ]\n" -" allow_unsafe = true\n" -"}\n" -"```" +"// We don't have to check that we have permissions, because\n" +"// the AdminToken argument is equivalent to such a check.\n" msgstr "" -#: src/chromium/build-rules/depending.md -msgid "Simply add the above target to the `deps` of some Chromium C++ target." +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md +msgid "\"CoolUser\"" msgstr "" -#: src/chromium/build-rules/depending.md -msgid "" -"```gn\n" -"import(\"//build/rust/rust_static_library.gni\")\n" -"\n" -"rust_static_library(\"my_rust_lib\") {\n" -" crate_root = \"lib.rs\"\n" -" sources = [ \"lib.rs\" ]\n" -"}\n" -"\n" -"# or source_set, static_library etc.\n" -"component(\"preexisting_cpp\") {\n" -" deps = [ \":my_rust_lib\" ]\n" -"}\n" -"```" +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md +msgid "\"Incorrect password! Could not prove privileges.\"" msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md msgid "" -"Types are elided in Rust code, which makes a good IDE even more useful than " -"for C++. Visual Studio code works well for Rust in Chromium. To use it," +"This example shows modelling gaining administrator privileges for a chat client with a " +"password and giving a user a moderator rank once those privileges are gained. The " +"`AdminToken` type acts as \"proof of correct user privileges.\"" msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md msgid "" -"Ensure your VSCode has the `rust-analyzer` extension, not earlier forms of " -"Rust support" +"The user asked for a password in-code and if we get the password correct, we get a " +"`AdminToken` to perform administrator actions within a specific environment (here, a chat " +"client)." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md +msgid "Once the permissions are gained, we can call the `add_moderator` function." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md msgid "" -"`gn gen out/Debug --export-rust-project` (or equivalent for your output " -"directory)" +"We can't call that function without the token type, so by being able to call it at all " +"all we can assume we have permissions." msgstr "" -#: src/chromium/build-rules/vscode.md -msgid "`ln -s out/Debug/rust-project.json rust-project.json`" +#: src/idiomatic/leveraging-the-type-system/token-types/permission-tokens.md +msgid "" +"Demonstrate: Try to construct the `AdminToken` in `main` again to reiterate that the " +"foundation of useful tokens is preventing their arbitrary construction." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md msgid "" -"A demo of some of the code annotation and exploration features of rust-" -"analyzer might be beneficial if the audience are naturally skeptical of IDEs." +"Sometimes, a token type needs additional data. A mutex guard is an example of a token " +"that represents permission + data." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md +msgid "// The acquired MutexGuard is proof of exclusive access.\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md msgid "" -"The following steps may help with the demo (but feel free to instead use a " -"piece of Chromium-related Rust that you are most familiar with):" +"Mutexes enforce mutual exclusion of read/write access to a value. We've covered Mutexes " +"earlier in this course already (See: RAII/Mutex), but here we're looking at `MutexGuard` " +"specifically." msgstr "" -#: src/chromium/build-rules/vscode.md -msgid "Open `components/qr_code_generator/qr_code_generator_ffi_glue.rs`" +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md +msgid "" +"`MutexGuard` is a value generated by a `Mutex` that proves you have read/write access at " +"that point in time." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md msgid "" -"Place the cursor over the `QrCode::new` call (around line 26) in " -"\\`qr_code_generator_ffi_glue.rs" +"`MutexGuard` also holds onto a reference to the `Mutex` that generated it, with `Deref` " +"and `DerefMut` implementations that give access to the data of `Mutex` while the " +"underlying `Mutex` keeps that data private from the user." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md msgid "" -"Demo **show documentation** (typical bindings: vscode = ctrl k i; vim/CoC = " -"K)." +"If `mutex.lock()` does not return a `MutexGuard`, you don't have permission to change the " +"value within the mutex." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md msgid "" -"Demo **go to definition** (typical bindings: vscode = F12; vim/CoC = g d). " -"(This will take you to `//third_party/rust/.../qr_code-.../src/lib.rs`.)" +"Not only do you have no permission, but you have no means to access the mutex data unless " +"you gain a `MutexGuard`." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md msgid "" -"Demo **outline** and navigate to the `QrCode::with_bits` method (around line " -"164; the outline is in the file explorer pane in vscode; typical vim/CoC " -"bindings = space o)" +"This contrasts with C++, where mutexes and lock guards do not control access to the data " +"itself, acting only as a flag that a user must remember to check every time they read or " +"manipulate data." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/mutex-guard.md msgid "" -"Demo **type annotations** (there are quote a few nice examples in the " -"`QrCode::with_bits` method)" +"Demonstrate: make the `mutex` variable mutable then try to dereference it to change its " +"value. Show how there's no deref implementation for it, and no other way to get to the " +"data held by it other than getting a mutex guard." msgstr "" -#: src/chromium/build-rules/vscode.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "Variable-Specific Tokens (Branding 1/4)" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "What if we want to tie a token to a specific variable?" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "// Works fine!\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"It may be worth pointing out that `gn gen ... --export-rust-project` will " -"need to be rerun after editing `BUILD.gn` files (which we will do a few " -"times throughout the exercises in this session)." +"// let data_2 = Bytes { bytes: vec![0, 1] };\n" +" // data_2.get_proven(&token_1); // Panics! Can we prevent this?\n" msgstr "" -#: src/exercises/chromium/build-rules.md -#, fuzzy -msgid "Build rules exercise" -msgstr "Règles de compilation" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "" +"What if we want to tie a token to a _specific variable_ in our code? Can we do this in " +"Rust's type system?" +msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"In your Chromium build, add a new Rust target to `//ui/base/BUILD.gn` " -"containing:" +"Motivation: We want to have a Token Type that represents a known, valid index into a byte " +"array." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"**Important**: note that `no_mangle` here is considered a type of unsafety " -"by the Rust compiler, so you'll need to allow unsafe code in your `gn` " -"target." +"Once we have these proven indexes we would be able to avoid bounds checks entirely, as " +"the tokens would act as the _proof of an existing index_." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "Since the index is known to be valid, `get_proven()` can skip the bounds check." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"Add this new Rust target as a dependency of `//ui/base:base`. Declare this " -"function at the top of `ui/base/resource/resource_bundle.cc` (later, we'll " -"see how this can be automated by bindings generation tools):" +"In this example there's nothing stopping the proven index of one array being used on a " +"different array. If an index is out of bounds in this case, it is undefined behavior." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "Demonstrate: Uncomment the `data_2.get_proven(&token_1);` line." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"Call this function from somewhere in `ui/base/resource/resource_bundle.cc` - " -"we suggest the top of `ResourceBundle::MaybeMangleLocalizedString`. Build " -"and run Chromium, and ensure that \"Hello from Rust!\" is printed lots of " -"times." +"The code here panics! We want to prevent this \"crossover\" of token types for indexes at " +"compile time." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "Ask: How might we try to do this?" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"If you use VSCode, now set up Rust to work well in VSCode. It will be useful " -"in subsequent exercises. If you've succeeded, you will be able to use right-" -"click \"Go to definition\" on `println!`." +"Expect students to not reach a good implementation from this, but be willing to " +"experiment and follow through on suggestions." msgstr "" -#: src/exercises/chromium/build-rules.md -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Where to find help" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md +msgid "Ask: What are the alternatives, why are they not good enough?" msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"The options available to the [`rust_static_library` gn template](https://" -"source.chromium.org/chromium/chromium/src/+/main:build/rust/" -"rust_static_library.gni;l=16)" +"Expect runtime checking of index bounds, especially as both `Vec::get` and `Bytes::" +"get_index` already uses runtime checking." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"Information about [`#[no_mangle]`](https://doc.rust-lang.org/beta/reference/" -"abi.html#the-no_mangle-attribute)" +"Runtime bounds checking does not prevent the erroneous crossover in the first place, it " +"only guarantees a panic." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"Information about [`extern \"C\"`](https://doc.rust-lang.org/std/keyword." -"extern.html)" +"The kind of token-association we will be doing here is called Branding. This is an " +"advanced technique that expands applicability of token types to more API designs." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-01-motivation.md msgid "" -"Information about gn's [`--export-rust-project`](https://gn.googlesource.com/" -"gn/+/main/docs/reference.md#compilation-database) switch" +"[`GhostCell`](https://plv.mpi-sws.org/rustbelt/ghostcell/paper.pdf) is a prominent user " +"of this, later slides will touch on it." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "`PhantomData` and Lifetime Subtyping (Branding 2/4)" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "Idea:" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "Use a lifetime as a unique brand for each token." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"[How to install rust-analyzer in VSCode](https://code.visualstudio.com/docs/" -"languages/rust)" +"Make lifetimes sufficiently distinct so that they don't implicitly convert into each " +"other." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "// The main focus\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "// We want this to NOT compile\n" +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "In Rust, lifetimes can have subtyping relations between one another." +msgstr "" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"This example is unusual because it boils down to the lowest-common-" -"denominator interop language, C. Both C++ and Rust can natively declare and " -"call C ABI functions. Later in the course, we'll connect C++ directly to " -"Rust." +"This kind of relation allows the compiler to determine if one lifetime outlives another." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"`allow_unsafe = true` is required here because `#[no_mangle]` might allow " -"Rust to generate two functions with the same name, and Rust can no longer " -"guarantee that the right one is called." +"Determining if a lifetime outlives another also allows us to say _the shortest common " +"lifetime is the one that ends first_." msgstr "" -#: src/exercises/chromium/build-rules.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"If you need a pure Rust executable, you can also do that using the " -"`rust_executable` gn template." +"This is useful in many cases, as it means two different lifetimes can be treated as if " +"they were the same in the regions they do overlap." msgstr "" -#: src/chromium/testing.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Rust community typically authors unit tests in a module placed in the same " -"source file as the code being tested. This was covered [earlier](../testing." -"md) in the course and looks like this:" +"This is usually what we want. But here we want to use lifetimes as a way to distinguish " +"values so we say that a token only applies to a single variable without having to create " +"a newtype for every single variable we declare." msgstr "" -#: src/chromium/testing.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"In Chromium we place unit tests in a separate source file and we continue to " -"follow this practice for Rust --- this makes tests consistently discoverable " -"and helps to avoid rebuilding `.rs` files a second time (in the `test` " -"configuration)." +"**Goal**: We want two lifetimes that the Rust compiler cannot determine if one outlives " +"the other." msgstr "" -#: src/chromium/testing.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"This results in the following options for testing Rust code in Chromium:" +"We are using `try_coerce_lifetimes` as a compile-time check to see if the lifetimes have " +"a common shorter lifetime (AKA being subtyped)." msgstr "" -#: src/chromium/testing.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Native Rust tests (i.e. `#[test]`). Discouraged outside of `//third_party/" -"rust`." +"Note: This slide compiles, by the end of this slide it should only compile when " +"`subtyped_lifetimes` is commented out." msgstr "" -#: src/chromium/testing.md -msgid "" -"`gtest` tests authored in C++ and exercising Rust via FFI calls. Sufficient " -"when Rust code is just a thin FFI layer and the existing unit tests provide " -"sufficient coverage for the feature." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "There are two important parts of this code:" msgstr "" -#: src/chromium/testing.md -msgid "" -"`gtest` tests authored in Rust and using the crate under test through its " -"public API (using `pub mod for_testing { ... }` if needed). This is the " -"subject of the next few slides." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "The `impl for<'a>` bound on the closure passed to `lifetime_separator`." msgstr "" -#: src/chromium/testing.md -msgid "" -"Mention that native Rust tests of third-party crates should eventually be " -"exercised by Chromium bots. (Such testing is needed rarely --- only after " -"adding or updating third-party crates.)" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "The way lifetimes are used in the parameter for `PhantomData`." msgstr "" -#: src/chromium/testing.md -msgid "" -"Some examples may help illustrate when C++ `gtest` vs Rust `gtest` should be " -"used:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "`for<'a>` bound on a Closure" msgstr "" -#: src/chromium/testing.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"QR has very little functionality in the first-party Rust layer (it's just a " -"thin FFI glue) and therefore uses the existing C++ unit tests for testing " -"both the C++ and the Rust implementation (parameterizing the tests so they " -"enable or disable Rust using a `ScopedFeatureList`)." +"We are using `for<'a>` as a way of introducing a lifetime generic parameter to a function " +"type and asking that the body of the function to work for all possible lifetimes." msgstr "" -#: src/chromium/testing.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Hypothetical/WIP PNG integration may need to implement memory-safe " -"implementation of pixel transformations that are provided by `libpng` but " -"missing in the `png` crate - e.g. RGBA => BGRA, or gamma correction. Such " -"functionality may benefit from separate tests authored in Rust." +"What this also does is remove some ability of the compiler to make assumptions about that " +"specific lifetime for the function argument, as it must meet Rust's borrow checking rules " +"regardless of the \"real\" lifetime its arguments are going to have. The caller is " +"substituting in actual lifetime, the function itself cannot." msgstr "" -#: src/chromium/testing/rust-gtest-interop.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"The [`rust_gtest_interop`](https://chromium.googlesource.com/chromium/src/+/" -"main/testing/rust_gtest_interop/README.md) library provides a way to:" +"This is analogous to a forall (Ɐ) quantifier in mathematics, or the way we introduce " +"`` as type variables, but only for lifetimes in trait bounds." msgstr "" -#: src/chromium/testing/rust-gtest-interop.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Use a Rust function as a `gtest` testcase (using the `#[gtest(...)]` " -"attribute)" +"When we write a function generic over a type `T`, we can't determine that type from " +"within the function itself. Even if we call a function `fn foo(first: T, second: " +"U)` with two arguments of the same type, the body of this function cannot determine if " +"`T` and `U` are the same type." msgstr "" -#: src/chromium/testing/rust-gtest-interop.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Use `expect_eq!` and similar macros (similar to `assert_eq!` but not " -"panicking and not terminating the test when the assertion fails)." +"This also prevents _the API consumer_ from defining a lifetime themselves, which would " +"allow them to circumvent the restrictions we want to impose." msgstr "" -#: src/chromium/testing/rust-gtest-interop.md -#, fuzzy -msgid "Example:" -msgstr "Exemple" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "PhantomData and Lifetime Variance" +msgstr "" -#: src/chromium/testing/build-gn.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"The simplest way to build Rust `gtest` tests is to add them to an existing " -"test binary that already contains tests authored in C++. For example:" +"We already know `PhantomData`, which can introduce a formal no-op usage of an otherwise " +"unused type or a lifetime parameter." msgstr "" -#: src/chromium/testing/build-gn.md -msgid "" -"```gn\n" -"test(\"ui_base_unittests\") {\n" -" ...\n" -" sources += [ \"my_rust_lib_unittest.rs\" ]\n" -" deps += [ \":my_rust_lib\" ]\n" -"}\n" -"```" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "Ask: What can we do with `PhantomData`?" msgstr "" -#: src/chromium/testing/build-gn.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Authoring Rust tests in a separate `static_library` also works, but requires " -"manually declaring the dependency on the support libraries:" +"Expect mentions of the Typestate pattern, tying together the lifetimes of owned values." msgstr "" -#: src/chromium/testing/build-gn.md -msgid "" -"```gn\n" -"rust_static_library(\"my_rust_lib_unittests\") {\n" -" testonly = true\n" -" is_gtest_unittests = true\n" -" crate_root = \"my_rust_lib_unittest.rs\"\n" -" sources = [ \"my_rust_lib_unittest.rs\" ]\n" -" deps = [\n" -" \":my_rust_lib\",\n" -" \"//testing/rust_gtest_interop\",\n" -" ]\n" -"}\n" -"\n" -"test(\"ui_base_unittests\") {\n" -" ...\n" -" deps += [ \":my_rust_lib_unittests\" ]\n" -"}\n" -"```" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "Ask: In other languages, what is subtyping?" msgstr "" -#: src/chromium/testing/chromium-import-macro.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"After adding `:my_rust_lib` to GN `deps`, we still need to learn how to " -"import and use `my_rust_lib` from `my_rust_lib_unittest.rs`. We haven't " -"provided an explicit `crate_name` for `my_rust_lib` so its crate name is " -"computed based on the full target path and name. Fortunately we can avoid " -"working with such an unwieldy name by using the `chromium::import!` macro " -"from the automatically-imported `chromium` crate:" +"Expect mentions of inheritance, being able to use a value of type `B` when a asked for a " +"value of type `A` because `B` is a \"subtype\" of `A`." msgstr "" -#: src/chromium/testing/chromium-import-macro.md -msgid "\"//ui/base:my_rust_lib\"" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "Rust does have Subtyping! But only for lifetimes." msgstr "" -#: src/chromium/testing/chromium-import-macro.md -msgid "Under the covers the macro expands to something similar to:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "Ask: If one lifetime is a subtype of another lifetime, what might that mean?" msgstr "" -#: src/chromium/testing/chromium-import-macro.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"More information can be found in [the doc comment](https://source.chromium." -"org/chromium/chromium/src/+/main:build/rust/chromium_prelude/" -"chromium_prelude.rs?q=f:chromium_prelude.rs%20pub.use.*%5Cbimport%5Cb;%20-f:" -"third_party&ss=chromium%2Fchromium%2Fsrc) of the `chromium::import` macro." +"A lifetime is a \"subtype\" of another lifetime when it _outlives_ that other lifetime." msgstr "" -#: src/chromium/testing/chromium-import-macro.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"`rust_static_library` supports specifying an explicit name via `crate_name` " -"property, but doing this is discouraged. And it is discouraged because the " -"crate name has to be globally unique. crates.io guarantees uniqueness of its " -"crate names so `cargo_crate` GN targets (generated by the `gnrt` tool " -"covered in a later section) use short crate names." +"The way that lifetimes used by `PhantomData` behave depends not only on where the " +"lifetime \"comes from\" but on how the reference is defined too." msgstr "" -#: src/exercises/chromium/testing.md -#, fuzzy -msgid "Testing exercise" -msgstr "Exercices" - -#: src/exercises/chromium/testing.md -msgid "Time for another exercise!" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "" +"The reason this compiles is that the [**Variance**](https://doc.rust-lang.org/stable/" +"reference/subtyping.html#r-subtyping.variance) of the lifetime inside of " +"`InvariantLifetime` is too lenient." msgstr "" -#: src/exercises/chromium/testing.md -msgid "In your Chromium build:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "" +"Note: Do not expect to get students to understand variance entirely here, just treat it " +"as a kind of ladder of restrictiveness on the ability of lifetimes to establish subtyping " +"relations." msgstr "" -#: src/exercises/chromium/testing.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Add a testable function next to `hello_from_rust`. Some suggestions: adding " -"two integers received as arguments, computing the nth Fibonacci number, " -"summing integers in a slice, etc." +"Ask: How can we make it more restrictive? How do we make a reference type more " +"restrictive in Rust?" msgstr "" -#: src/exercises/chromium/testing.md -msgid "Add a separate `..._unittest.rs` file with a test for the new function." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "Expect or demonstrate: Making it `&'id mut ()` instead. This will not be enough!" msgstr "" -#: src/exercises/chromium/testing.md -msgid "Add the new tests to `BUILD.gn`." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "" +"We need to use a [**Variance**](https://doc.rust-lang.org/stable/reference/subtyping." +"html#r-subtyping.variance) on lifetimes where subtyping cannot be inferred except on " +"_identical lifetimes_. That is, the only subtype of `'a` the compiler can know is `'a` " +"itself." msgstr "" -#: src/exercises/chromium/testing.md -msgid "Build the tests, run them, and verify that the new test works." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md +msgid "" +"Note: Again, do not try to get the whole class to understand variance. Treat it as a " +"ladder of restrictiveness for now." msgstr "" -#: src/chromium/interoperability-with-cpp.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"The Rust community offers multiple options for C++/Rust interop, with new " -"tools being developed all the time. At the moment, Chromium uses a tool " -"called CXX." +"Demonstrate: Move from `&'id ()` (covariant in lifetime and type), `&'id mut ()` " +"(covariant in lifetime, invariant in type), `*mut &'id mut ()` (invariant in lifetime and " +"type), and finally `*mut &'id ()` (invariant in lifetime but not type)." msgstr "" -#: src/chromium/interoperability-with-cpp.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"You describe your whole language boundary in an interface definition " -"language (which looks a lot like Rust) and then CXX tools generate " -"declarations for functions and types in both Rust and C++." +"Those last two should not compile, which means we've finally found candidates for how to " +"bind lifetimes to `PhantomData` so they can't be compared to one another in this context." msgstr "" -#: src/chromium/interoperability-with-cpp.md -#, fuzzy +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"See the [CXX tutorial](https://cxx.rs/tutorial.html) for a full example of " -"using this." +"Reason: `*mut` means [mutable raw pointer](https://doc.rust-lang.org/reference/types/" +"pointer.html#r-type.pointer.raw). Rust has mutable pointers! But you cannot reason about " +"them in safe Rust. Making this a mutable raw pointer to a reference that has a lifetime " +"complicates the compiler's ability subtype because it cannot reason about mutable raw " +"pointers within the borrow checker." msgstr "" -"Voir le \\[tutoriel CXX\\] [2](https://cxx.rs/tutorial.html) pour un exemple " -"complet d'utilisation." -#: src/chromium/interoperability-with-cpp.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"Talk through the diagram. Explain that behind the scenes, this is doing just " -"the same as you previously did. Point out that automating the process has " -"the following benefits:" +"Wrap up: We've introduced ways to stop the compiler from deciding that lifetimes are " +"\"similar enough\" by choosing a Variance for a lifetime in `PhantomData` that is " +"restrictive enough to prevent this slide from compiling." msgstr "" -#: src/chromium/interoperability-with-cpp.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"The tool guarantees that the C++ and Rust sides match (e.g. you get compile " -"errors if the `#[cxx::bridge]` doesn't match the actual C++ or Rust " -"definitions, but with out-of-sync manual bindings you'd get Undefined " -"Behavior)" +"That is, we can now create variables that can exist in the same scope as each other, but " +"whose types are automatically made different from one another per-variable without much " +"boilerplate." msgstr "" -#: src/chromium/interoperability-with-cpp.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-02-phantomdata.md msgid "" -"The tool automates generation of FFI thunks (small, C-ABI-compatible, free " -"functions) for non-C features (e.g. enabling FFI calls into Rust or C++ " -"methods; manual bindings would require authoring such top-level, free " -"functions manually)" +"The `for<'a>` quantifier is not just for function types. It is a [**Higher-ranked trait " +"bound**](https://doc.rust-lang.org/reference/subtyping.html?search=Hiher#r-subtype.higher-" +"ranked)." msgstr "" -#: src/chromium/interoperability-with-cpp.md -msgid "The tool and the library can handle a set of core types - for example:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Implementing Branded Types (Branding 3/4)" msgstr "" -#: src/chromium/interoperability-with-cpp.md -msgid "" -"`&[T]` can be passed across the FFI boundary, even though it doesn't " -"guarantee any particular ABI or memory layout. With manual bindings `std::" -"span` / `&[T]` have to be manually destructured and rebuilt out of a " -"pointer and length - this is error-prone given that each language represents " -"empty slices slightly differently)" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Constructing branded types is different to how we construct non-branded types." msgstr "" -#: src/chromium/interoperability-with-cpp.md -msgid "" -"Smart pointers like `std::unique_ptr`, `std::shared_ptr`, and/or `Box` " -"are natively supported. With manual bindings, one would have to pass C-ABI-" -"compatible raw pointers, which would increase lifetime and memory-safety " -"risks." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "// The data we want to modify in this context.\n" msgstr "" -#: src/chromium/interoperability-with-cpp.md -msgid "" -"`rust::String` and `CxxString` types understand and maintain differences in " -"string representation across the languages (e.g. `rust::String::lossy` can " -"build a Rust string from non-UTF8 input and `rust::String::c_str` can NUL-" -"terminate a string)." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "// The function that uniquely brands the lifetime of a `Bytes`\n" msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md msgid "" -"CXX requires that the whole C++/Rust boundary is declared in `cxx::bridge` " -"modules inside `.rs` source code." +"Motivation: We want to have \"proven indexes\" for a type, and we don't want those " +"indexes to be usable by different variables of the same type. We also don't want those " +"indexes to escape a scope." msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "\"example/include/blobstore.h\"" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Our Branded Type will be `Bytes`: a byte array." msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "// Definitions of Rust types and functions go here\n" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Our Branded Token will be `ProvenIndex`: an index known to be in range." msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "Point out:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "There are several notable parts to this implementation:" msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md msgid "" -"Although this looks like a regular Rust `mod`, the `#[cxx::bridge]` " -"procedural macro does complex things to it. The generated code is quite a " -"bit more sophisticated - though this does still result in a `mod` called " -"`ffi` in your code." +"`new` does not return a `Bytes`, instead asking for \"starting data\" and a use-once " +"Closure that is passed a `Bytes` when it is called." msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "Native support for C++'s `std::unique_ptr` in Rust" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "That `new` function has a `for<'a>` on its trait bound." msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md -#, fuzzy -msgid "Native support for Rust slices in C++" -msgstr "Support intégré pour les tests." - -#: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "Calls from C++ to Rust, and Rust types (in the top part)" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "We have both a getter for an index and a getter for a values with a proven index." msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md -msgid "Calls from Rust to C++, and C++ types (in the bottom part)" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +#, fuzzy +msgid "Ask: Why does `new` not return a `Bytes`?" +msgstr "Pourquoi `lock()` renvoie-t-il un `Result` ?" + +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Answer: Because we need `Bytes` to have a unique lifetime controlled by the API." msgstr "" -#: src/chromium/interoperability-with-cpp/example-bindings.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md msgid "" -"**Common misconception**: It _looks_ like a C++ header is being parsed by " -"Rust, but this is misleading. This header is never interpreted by Rust, but " -"simply `#include`d in the generated C++ code for the benefit of C++ " -"compilers." +"Ask: So what if `new()` returned `Bytes`, what is the specific harm that it would cause?" msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md -msgid "" -"By far the most useful page when using CXX is the [type reference](https://" -"cxx.rs/bindings.html)." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Answer: Think about the signature of that hypothetical `new()` method:" msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md -msgid "CXX fundamentally suits cases where:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "`fn new<'a>() -> Bytes<'a> { ... }`" msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md msgid "" -"Your Rust-C++ interface is sufficiently simple that you can declare all of " -"it." +"This would allow the API user to choose what the lifetime `'a` is, removing our ability " +"to guarantee that the lifetimes between different instances of `Bytes` are unique and " +"unable to be subtyped to one another." msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md -msgid "" -"You're using only the types natively supported by CXX already, for example " -"`std::unique_ptr`, `std::string`, `&[u8]` etc." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Ask: Why do we need both a `get_index` and a `get_proven`?" msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md -msgid "" -"It has many limitations --- for example lack of support for Rust's `Option` " -"type." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Expect \"Because we can't know if an index is occupied at compile time\"" msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md -msgid "" -"These limitations constrain us to using Rust in Chromium only for well " -"isolated \"leaf nodes\" rather than for arbitrary Rust-C++ interop. When " -"considering a use-case for Rust in Chromium, a good starting point is to " -"draft the CXX bindings for the language boundary to see if it appears simple " -"enough." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md +msgid "Ask: Then what's the point of the proven indexes?" msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md msgid "" -"You should also discuss some of the other sticky points with CXX, for " -"example:" +"Answer: Avoiding bounds checking while keeping knowledge of what indexes are occupied " +"specific to individual variables, unable to erroneously be used on the wrong one." msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-03-impl.md msgid "" -"Its error handling is based around C++ exceptions (given on the next slide)" +"Note: The focus is not on only on avoiding overuse of bounds checks, but also on " +"preventing that \"cross over\" of indexes." msgstr "" -#: src/chromium/interoperability-with-cpp/limitations-of-cxx.md -msgid "Function pointers are awkward to use." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "Branded Types in Action (Branding 4/4)" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"CXX's [support for `Result`](https://cxx.rs/binding/result.html) relies " -"on C++ exceptions, so we can't use that in Chromium. Alternatives:" +"// bytes_2.get_proven(&index_1); // ❌🔨\n" +" \"Computations done!\"" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md -msgid "The `T` part of `Result` can be:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "\"{result}\"" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"Returned via out parameters (e.g. via `&mut T`). This requires that `T` can " -"be passed across the FFI boundary - for example `T` has to be:" -msgstr "" - -#: src/chromium/interoperability-with-cpp/error-handling.md -msgid "A primitive type (like `u32` or `usize`)" +"We now have the implementation ready, we can now write a program where token types that " +"are proofs of existing indexes cannot be shared between variables." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"A type natively supported by `cxx` (like `UniquePtr`) that has a suitable " -"default value to use in a failure case (_unlike_ `Box`)." +"Demonstration: Uncomment the `bytes_2.get_proven(&index_1);` line and show that it does " +"not compile when we use indexes from different variables." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"Retained on the Rust side, and exposed via reference. This may be needed " -"when `T` is a Rust type, which cannot be passed across the FFI boundary, and " -"cannot be stored in `UniquePtr`." +"Ask: What operations can we perform that we can guarantee would produce a proven index?" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md -msgid "The `E` part of `Result` can be:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "Expect a \"push\" implementation, suggested demo:" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"Returned as a boolean (e.g. `true` representing success, and `false` " -"representing failure)" +"Ask: Can we make this not just about a byte array, but as a general wrapper on `Vec`?" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling.md -msgid "" -"Preserving error details is in theory possible, but so far hasn't been " -"needed in practice." +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "Trivial: Yes!" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-qr.md -#, fuzzy -msgid "CXX Error Handling: QR Example" -msgstr "Gestion des erreurs" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "Maybe demonstrate: Generalising `Bytes<'id>` into `BrandedVec<'id, T>`" +msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-qr.md -msgid "" -"The QR code generator is [an example](https://source.chromium.org/chromium/" -"chromium/src/+/main:components/qr_code_generator/qr_code_generator_ffi_glue." -"rs;l=13-18;drc=7bf1b75b910ca430501b9c6a74c1d18a0223ecca) where a boolean is " -"used to communicate success vs failure, and where the successful result can " -"be passed across the FFI boundary:" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "Ask: What other areas could we use something like this?" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-qr.md -msgid "\"qr_code_generator\"" +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md +msgid "" +"The resulting token API is **highly restrictive**, but the things that it makes possible " +"to prove as safe within the Rust type system are meaningful." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-qr.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"Students may be curious about the semantics of the `out_qr_size` output. " -"This is not the size of the vector, but the size of the QR code (and " -"admittedly it is a bit redundant - this is the square root of the size of " -"the vector)." +"[GhostCell](https://plv.mpi-sws.org/rustbelt/ghostcell/paper.pdf), a structure that " +"allows for safe cyclic data structures in Rust (among other previously difficult to " +"represent data structures), uses this kind of token type to make sure cells can't " +"\"escape\" a context where we know where operations similar to those shown in these " +"examples are safe." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-qr.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"It may be worth pointing out the importance of initializing `out_qr_size` " -"before calling into the Rust function. Creation of a Rust reference that " -"points to uninitialized memory results in Undefined Behavior (unlike in C++, " -"when only the act of dereferencing such memory results in UB)." +"This \"Branded Types\" sequence of slides is based off their `BrandedVec` implementation " +"in the paper, which covers many of the implementation details of this use case in more " +"depth as a gentle introduction to how `GhostCell` itself is implemented and used in " +"practice." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-qr.md +#: src/idiomatic/leveraging-the-type-system/token-types/branded-04-in-action.md msgid "" -"If students ask about `Pin`, then explain why CXX needs it for mutable " -"references to C++ data: the answer is that C++ data can’t be moved around " -"like Rust data, because it may contain self-referential pointers." +"GhostCell also uses formal checks outside of Rust's type system to prove that the things " +"it allows within this kind of context (lifetime branding) are safe." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md -#, fuzzy -msgid "CXX Error Handling: PNG Example" -msgstr "Gestion des erreurs" +#: src/idiomatic/polymorphism.md +msgid "" +"Rust has plenty of mechanisms for writing and using polymorphic code, but they're " +"somewhat different from other popular languages!" +msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md +#: src/idiomatic/polymorphism.md msgid "" -"A prototype of a PNG decoder illustrates what can be done when the " -"successful result cannot be passed across the FFI boundary:" +"This chapter will cover the details of Rust's polymorphism and how it's similar, or " +"different to, other languages." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "\"gfx::rust_bindings\"" +#: src/idiomatic/polymorphism/refresher.md +msgid "Basic features of Rust's generics and polymorphism." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md +#: src/idiomatic/polymorphism/refresher.md msgid "" -"/// This returns an FFI-friendly equivalent of `Result,\n" -" /// ()>`.\n" +"In this section we'll be going through the core concepts of Rust's approach to " +"polymorphism, the things you'll run into the most in day-to-day usage." msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "/// C++ bindings for the `crate::png::ResultOfPngReader` type.\n" +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "Traits, Protocols, Interfaces" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "/// C++ bindings for the `crate::png::PngReader` type.\n" +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "\"Email to {}: {}\"" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "" -"`PngReader` and `ResultOfPngReader` are Rust types --- objects of these " -"types cannot cross the FFI boundary without indirection of a `Box`. We " -"can't have an `out_parameter: &mut PngReader`, because CXX doesn't allow C++ " -"to store Rust objects by value." +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "\"Chat message sent to {:?}: {}\"" msgstr "" -#: src/chromium/interoperability-with-cpp/error-handling-png.md -msgid "" -"This example illustrates that even though CXX doesn't support arbitrary " -"generics nor templates, we can still pass them across the FFI boundary by " -"manually specializing / monomorphizing them into a non-generic type. In the " -"example `ResultOfPngReader` is a non-generic type that forwards into " -"appropriate methods of `Result` (e.g. into `is_err`, `unwrap`, and/or " -"`as_mut`)." +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "Rust's concept of polymorphism and generics is heavily built around traits." msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md -msgid "Using cxx in Chromium" +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "Traits are requirements on a type in a generic context." msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md -msgid "" -"In Chromium, we define an independent `#[cxx::bridge] mod` for each leaf-" -"node where we want to use Rust. You'd typically have one for each " -"`rust_static_library`. Just add" +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "Requirements function much like a compile-time checked duck typing." msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +#: src/idiomatic/polymorphism/refresher/traits.md msgid "" -"```gn\n" -"cxx_bindings = [ \"my_rust_file.rs\" ]\n" -" # list of files containing #[cxx::bridge], not all source files\n" -"allow_unsafe = true\n" -"```" +"Duck typing is a concept from the practice of dynamic, untyped languages like Python, " +"\"if it walks like a duck and quacks like a duck, it's a duck.\"" msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +#: src/idiomatic/polymorphism/refresher/traits.md msgid "" -"to your existing `rust_static_library` target alongside `crate_root` and " -"`sources`." +"That is, types with the methods and fields expected by a function are all valid inputs " +"for that function. If a type implements methods, it is that type in a duck-typing context." msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md -msgid "C++ headers will be generated at a sensible location, so you can just" +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "" +"Traits behave like a static duck typing mechanism, in that we specify behavior rather " +"than type. But we get the compile-time checks on if that behavior does really exist." msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md -msgid "\"ui/base/my_rust_file.rs.h\"" +#: src/idiomatic/polymorphism/refresher/traits.md +msgid "" +"Alternatively: Traits are like collections of propositions, and implementing a trait for " +"a type is a proof that the type can be used wherever the trait is asked for." msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md +#: src/idiomatic/polymorphism/refresher/traits.md msgid "" -"You will find some utility functions in `//base` to convert to/from Chromium " -"C++ types to CXX Rust types --- for example [`SpanToRustSlice`](https://" -"source.chromium.org/chromium/chromium/src/+/main:base/containers/span_rust.h;" -"l=21)." +"Traits have required methods, implementing those methods is the proof that a type has the " +"required behavior." msgstr "" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md -msgid "Students may ask --- why do we still need `allow_unsafe = true`?" -msgstr "" +#: src/idiomatic/polymorphism/refresher/traits.md +#, fuzzy +msgid "reference:" +msgstr "Références" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md -msgid "" -"The broad answer is that no C/C++ code is \"safe\" by the normal Rust " -"standards. Calling back and forth to C/C++ from Rust may do arbitrary things " -"to memory, and compromise the safety of Rust's own data layouts. Presence of " -"_too many_ `unsafe` keywords in C/C++ interop can harm the signal-to-noise " -"ratio of such a keyword, and is [controversial](https://steveklabnik.com/" -"writing/the-cxx-debate), but strictly, bringing any foreign code into a Rust " -"binary can cause unexpected behavior from Rust's perspective." -msgstr "" +#: src/idiomatic/polymorphism/refresher/traits.md +#, fuzzy +msgid "https://doc.rust-lang.org/reference/items/traits.html" +msgstr "[Créer des scripts](https://doc.rust-lang.org/cargo/reference/build-scripts.html)" -#: src/chromium/interoperability-with-cpp/using-cxx-in-chromium.md -msgid "" -"The narrow answer lies in the diagram at the top of [this page](../" -"interoperability-with-cpp.md) --- behind the scenes, CXX generates Rust " -"`unsafe` and `extern \"C\"` functions just like we did manually in the " -"previous section." +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +#, fuzzy +msgid "Trait Bounds on Generics" +msgstr "Traits lié" + +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +msgid "\"Item: {}\"" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md #, fuzzy -msgid "Exercise: Interoperability with C++" -msgstr "Interopérabilité avec C" +msgid "\"Hello, Rust!\"" +msgstr "Bonjour le monde!" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Part one" +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +msgid "// Works with integers\n" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "" -"In the Rust file you previously created, add a `#[cxx::bridge]` which " -"specifies a single function, to be called from C++, called " -"`hello_from_rust`, taking no parameters and returning no value." +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +msgid "// Works with strings\n" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/trait-bounds.md msgid "" -"Modify your previous `hello_from_rust` function to remove `extern \"C\"` and " -"`#[no_mangle]`. This is now just a standard Rust function." +"Traits are most commonly used as bounds on generic type parameters for a function or " +"method." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Modify your `gn` target to build these bindings." +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +msgid "" +"Without a trait bound on a generic type parameter, we don't have access to any behavior " +"to write functions and methods with." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/trait-bounds.md msgid "" -"In your C++ code, remove the forward-declaration of `hello_from_rust`. " -"Instead, include the generated header file." +"Trait bounds allow us to specify the minimum viable behavior of a type for it to work in " +"generic code." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Build and run!" +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +#: src/idiomatic/polymorphism/refresher/default-impls.md +#: src/idiomatic/polymorphism/refresher/supertraits.md +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +#: src/idiomatic/polymorphism/refresher/sized.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "ref:" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Part two" +#: src/idiomatic/polymorphism/refresher/trait-bounds.md +#, fuzzy +msgid "https://doc.rust-lang.org/reference/trait-bounds.html" +msgstr "[Espaces de travail](https://doc.rust-lang.org/cargo/reference/workspaces.html)" + +#: src/idiomatic/polymorphism/refresher/deriving-traits.md +msgid "" +"Many traits, protocols, interfaces, have trivial implementations that would be easy to " +"mechanically write." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/deriving-traits.md msgid "" -"It's a good idea to play with CXX a little. It helps you think about how " -"flexible Rust in Chromium actually is." +"Definitions of types (their syntax trees) can be fed to procedural macros (compiler " +"plugins) to automatically generate implementations of traits." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -#, fuzzy -msgid "Some things to try:" -msgstr "Quelques notes:" +#: src/idiomatic/polymorphism/refresher/deriving-traits.md +msgid "" +"These macros have to be authored by someone, the compiler cannot figure out everything by " +"itself." +msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Call back into C++ from Rust. You will need:" +#: src/idiomatic/polymorphism/refresher/deriving-traits.md +msgid "" +"Many traits have a naive, obvious implementation. Mostly implementations that depend on " +"all fields or variants already implementing the trait." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/deriving-traits.md msgid "" -"An additional header file which you can `include!` from your `cxx::bridge`. " -"You'll need to declare your C++ function in that new header file." +"`PartialEq`/`Eq` can be derived on types whose fields / variants all implement those " +"traits fairly easily: line up the fields / variants, if any of them don't match then the " +"equality check returns false." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/deriving-traits.md msgid "" -"An `unsafe` block to call such a function, or alternatively specify the " -"`unsafe` keyword in your `#[cxx::bridge]` [as described here](https://cxx.rs/" -"extern-c++.html#functions-and-member-functions)." +"Derives let us avoid boilerplate mechanically and predictably, the authors of a derive " +"implementation likely authored the trait the derive was implemented with the proper " +"semantics of a trait in mind." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/deriving-traits.md msgid "" -"You may also need to `#include \"third_party/rust/cxx/v1/crate/include/cxx." -"h\"`" +"Ask the class: Have the students had to deal with a codebase where most of the code was " +"trivial boilerplate?" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Pass a C++ string from C++ into Rust." +#: src/idiomatic/polymorphism/refresher/deriving-traits.md +msgid "This is similar to Haskell's `deriving` system." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Pass a reference to a C++ object into Rust." +#: src/idiomatic/polymorphism/refresher/deriving-traits.md +#, fuzzy +msgid "references:" +msgstr "Références" + +#: src/idiomatic/polymorphism/refresher/deriving-traits.md +msgid "https://doc.rust-lang.org/reference/attributes/derive.html#r-attributes.derive" +msgstr "" + +#: src/idiomatic/polymorphism/refresher/default-impls.md +#, fuzzy +msgid "Default Method Implementations" +msgstr "Mise en œuvre" + +#: src/idiomatic/polymorphism/refresher/default-impls.md +msgid "// Required Method\n" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/default-impls.md +#, fuzzy +msgid "// Default implementation\n" +msgstr "Mise en œuvre" + +#: src/idiomatic/polymorphism/refresher/default-impls.md msgid "" -"Intentionally get the Rust function signatures mismatched from the `#[cxx::" -"bridge]`, and get used to the errors you see." +"Traits often have methods that are implemented for you already, once you implement the " +"required methods." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/default-impls.md msgid "" -"Intentionally get the C++ function signatures mismatched from the `#[cxx::" -"bridge]`, and get used to the errors you see." +"A trait method has a default implementation if the function body is present. This " +"implementation can be written in terms of other methods available, such as other methods " +"in the trait or methods of a supertrait." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/default-impls.md msgid "" -"Pass a `std::unique_ptr` of some type from C++ into Rust, so that Rust can " -"own some C++ object." +"Often you'll see methods that provide the broad functionality that is necessary to " +"implement (like `Ord`'s `compare`) with default implementations for functions that can be " +"implemented in terms of those methods (like `Ord`'s `max`/`min`/`clamp`)." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/default-impls.md msgid "" -"Create a Rust object and pass it into C++, so that C++ owns it. (Hint: you " -"need a `Box`)." +"Default methods can be overridden by derive macros, as derive macros produce arbitrary " +"ASTs in the implementation." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Declare some methods on a C++ type. Call them from Rust." +#: src/idiomatic/polymorphism/refresher/default-impls.md +msgid "" +"https://doc.rust-lang.org/reference/items/traits.html#r-items.traits.associated-item-decls" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Declare some methods on a Rust type. Call them from C++." +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "Supertraits / Trait Dependencies" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Part three" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "Traits can be extended by new traits." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "" -"Now you understand the strengths and limitations of CXX interop, think of a " -"couple of use-cases for Rust in Chromium where the interface would be " -"sufficiently simple. Sketch how you might define that interface." +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "/* trait for device ID types */" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "The [`cxx` binding reference](https://cxx.rs/bindings.html)" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "/* Graphics device specifics */" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "" -"The [`rust_static_library` gn template](https://source.chromium.org/chromium/" -"chromium/src/+/main:build/rust/rust_static_library.gni;l=16)" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "// From stdlib\n" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md -msgid "Some of the questions you may encounter:" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "/* methods for Ord */" msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/supertraits.md msgid "" -"I'm seeing a problem initializing a variable of type X with type Y, where X " -"and Y are both function types. This is because your C++ function doesn't " -"quite match the declaration in your `cxx::bridge`." +"When authoring a trait, you can specify traits that a type must also. These are called " +"_Supertraits_." msgstr "" -#: src/exercises/chromium/interoperability-with-cpp.md +#: src/idiomatic/polymorphism/refresher/supertraits.md msgid "" -"I seem to be able to freely convert C++ references into Rust references. " -"Doesn't that risk UB? For CXX's _opaque_ types, no, because they are zero-" -"sized. For CXX trivial types yes, it's _possible_ to cause UB, although " -"CXX's design makes it quite difficult to craft such an example." +"For the example above, any type that implements `GraphicsDevice` must also implement " +"`DeviceId`." msgstr "" -#: src/chromium/adding-third-party-crates.md +#: src/idiomatic/polymorphism/refresher/supertraits.md msgid "" -"Rust libraries are called \"crates\" and are found at [crates.io](https://" -"crates.io). It's _very easy_ for Rust crates to depend upon one another. So " -"they do!" +"These hierarchies of traits let us design systems around the behavior of complex real-" +"world taxonomies (like machine hardware, operating system specifics)." msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "Property" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "This is distinct from object inheritance! But it looks similar." msgstr "" -#: src/chromium/adding-third-party-crates.md -#, fuzzy -msgid "C++ library" -msgstr "Bibliothèque" - -#: src/chromium/adding-third-party-crates.md -#, fuzzy -msgid "Rust crate" -msgstr "Écosystème de Rust" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "" +"Object inheritance allows for overrides and brings in the behavior of the inherited types " +"by default." +msgstr "" -#: src/chromium/adding-third-party-crates.md -#, fuzzy -msgid "Build system" -msgstr "Écosystème de Rust" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "" +"A trait having a supertrait doesn't mean that trait can override method implementations " +"as default implementations." +msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "Lots" +#: src/idiomatic/polymorphism/refresher/supertraits.md +msgid "" +"https://doc.rust-lang.org/reference/items/traits.html?highlight=supertrait#r-items.traits." +"supertraits" msgstr "" -#: src/chromium/adding-third-party-crates.md +#: src/idiomatic/polymorphism/refresher/blanket-impls.md #, fuzzy -msgid "Consistent: `Cargo.toml`" -msgstr "Vous pouvez utiliser le fichier `Cargo.toml` suivant :" +msgid "Blanket Trait Implementations" +msgstr "Mise en œuvre" -#: src/chromium/adding-third-party-crates.md -msgid "Typical library size" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "" +"When a trait is local, we can implement it for as many types as we like. How far can we " +"take this?" msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "Large-ish" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "" +"// A blanket implementation! If something implements Display, it implements\n" +"// PrettyPrint.\n" msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "Small" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "\"{self}\"" msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "Transitive dependencies" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "" +"The subject of a trait implementation at the definition site of a trait can be anything, " +"including `T` with no bounds." msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "Few" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "We can't do anything with a `T` we don't know nothing about, so this is uncommon." msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "For a Chromium engineer, this has pros and cons:" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "" +"Conditional blanket implementations are much more useful and you are more likely to see " +"and author them." msgstr "" -#: src/chromium/adding-third-party-crates.md +#: src/idiomatic/polymorphism/refresher/blanket-impls.md msgid "" -"All crates use a common build system so we can automate their inclusion into " -"Chromium..." +"These implementations will have a bound on the trait, like `impl ToString " +"for T {...}`" msgstr "" -#: src/chromium/adding-third-party-crates.md +#: src/idiomatic/polymorphism/refresher/blanket-impls.md msgid "" -"... but, crates typically have transitive dependencies, so you will likely " -"have to bring in multiple libraries." +"In the example above we have a blanket implementation for all types that implement " +"Display, the implementation has one piece of information available to it from the trait " +"bounds: it implements `Display::fmt`." msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "We'll discuss:" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "This is enough to write an implementation for pretty printing to console." msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "How to put a crate in the Chromium source code tree" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "" +"Do be careful with these kinds of implementations, as it may end up preventing users " +"downstream from implementing a more meaningful." msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "How to make `gn` build rules for it" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +msgid "" +"The above isn't written for `Debug` as that would mean almost all types end up " +"implementing `PrettyPrint`, and `Debug` is not semantically similar to `Display`: It's " +"meant for debug output instead of something more human-readable." msgstr "" -#: src/chromium/adding-third-party-crates.md -msgid "How to audit its source code for sufficient safety." -msgstr "" +#: src/idiomatic/polymorphism/refresher/blanket-impls.md +#, fuzzy +msgid "https://doc.rust-lang.org/reference/glossary.html#blanket-implementation" +msgstr "[Espaces de travail](https://doc.rust-lang.org/cargo/reference/workspaces.html)" -#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md -msgid "Configuring the `Cargo.toml` file to add crates" -msgstr "" +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +#, fuzzy +msgid "Conditional Method Implementations" +msgstr "Mise en œuvre" -#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md -msgid "" -"Chromium has a single set of centrally-managed direct crate dependencies. " -"These are managed through a single [`Cargo.toml`](https://source.chromium." -"org/chromium/chromium/src/+/main:third_party/rust/chromium_crates_io/Cargo." -"toml):" +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +msgid "// No trait bounds on the type definition.\n" msgstr "" -#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md -msgid "" -"```toml\n" -"[dependencies]\n" -"bitflags = \"1\"\n" -"cfg-if = \"1\"\n" -"cxx = \"1\"\n" -"# lots more...\n" -"```" +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +msgid "// Instead bounds are put on the implementations for the type.\n" msgstr "" -#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md -msgid "" -"As with any other `Cargo.toml`, you can specify [more details about the " -"dependencies](https://doc.rust-lang.org/cargo/reference/specifying-" -"dependencies.html) --- most commonly, you'll want to specify the `features` " -"that you wish to enable in the crate." +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +msgid "// alternatively\n" msgstr "" -#: src/chromium/adding-third-party-crates/configuring-cargo-toml.md -msgid "" -"When adding a crate to Chromium, you'll often need to provide some extra " -"information in an additional file, `gnrt_config.toml`, which we'll meet next." +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +msgid "// Specifies the trait bound in a where expression\n" msgstr "" -#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +#: src/idiomatic/polymorphism/refresher/conditional-methods.md msgid "" -"Alongside `Cargo.toml` is [`gnrt_config.toml`](https://source.chromium.org/" -"chromium/chromium/src/+/main:third_party/rust/chromium_crates_io/gnrt_config." -"toml). This contains Chromium-specific extensions to crate handling." +"When authoring a type with generic parameters, we can write implementations for that type " +"that depend on what the parameters are or what traits they implement." msgstr "" -#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md -msgid "" -"If you add a new crate, you should specify at least the `group`. This is one " -"of:" +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +msgid "These methods are only available when the type meets those conditions." msgstr "" -#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md -#: src/chromium/adding-third-party-crates/depending-on-a-crate.md -msgid "For instance," +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +msgid "" +"For things like ordered sets, where you'd want the inner type to always be `Ord`, this is " +"the preferred way of putting a trait bound on a parameter of a type." msgstr "" -#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md +#: src/idiomatic/polymorphism/refresher/conditional-methods.md msgid "" -"Depending on the crate source code layout, you may also need to use this " -"file to specify where its `LICENSE` file(s) can be found." +"We don't put the definition on the type itself as this would cause downstream issues for " +"everywhere the type is mentioned with a generic parameter." msgstr "" -#: src/chromium/adding-third-party-crates/configuring-gnrt-config-toml.md -msgid "" -"Later, we'll see some other things you will need to configure in this file " -"to resolve problems." +#: src/idiomatic/polymorphism/refresher/conditional-methods.md +msgid "We can maintain invariants just fine with conditional method implementations." msgstr "" -#: src/chromium/adding-third-party-crates/downloading-crates.md -msgid "" -"A tool called `gnrt` knows how to download crates and how to generate `BUILD." -"gn` rules." +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "What prevents users from writing arbitrary trait implementations for any type?" msgstr "" -#: src/chromium/adding-third-party-crates/downloading-crates.md -msgid "To start, download the crate you want like this:" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "// Crate `postgresql-bindings`\n" msgstr "" -#: src/chromium/adding-third-party-crates/downloading-crates.md -msgid "" -"Although the `gnrt` tool is part of the Chromium source code, by running " -"this command you will be downloading and running its dependencies from " -"`crates.io`. See [the earlier section](../cargo.md) discussing this security " -"decision." +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "/* details */" msgstr "" -#: src/chromium/adding-third-party-crates/downloading-crates.md -msgid "This `vendor` command may download:" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "// Crate `database-traits`, depends on `postgresql-bindings`\n" msgstr "" -#: src/chromium/adding-third-party-crates/downloading-crates.md +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md #, fuzzy -msgid "Your crate" -msgstr "Crates utiles" +msgid "/* methods */" +msgstr "Méthodes" -#: src/chromium/adding-third-party-crates/downloading-crates.md -msgid "Direct and transitive dependencies" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "// ✅, `DbConnection` is local.\n" msgstr "" -#: src/chromium/adding-third-party-crates/downloading-crates.md -msgid "" -"New versions of other crates, as required by `cargo` to resolve the complete " -"set of crates required by Chromium." +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "// Crate `mycoolnewdb` depends on `database-traits`\n" msgstr "" -#: src/chromium/adding-third-party-crates/downloading-crates.md -msgid "" -"Chromium maintains patches for some crates, kept in `//third_party/rust/" -"chromium_crates_io/patches`. These will be reapplied automatically, but if " -"patching fails you may need to take manual action." +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "// ✅, `MyCoolNewDbConn` is local.\n" msgstr "" -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +#: src/idiomatic/polymorphism/refresher/orphan-rule.md msgid "" -"Once you've downloaded the crate, generate the `BUILD.gn` files like this:" +"// Neither `PostgresqlConn` or `DbConnection` are local to `mycoolnewdb`.\n" +"// This would lead to two implementations of `DbConnection` for PostgresqlConn!\n" msgstr "" -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md -msgid "Now run `git status`. You should find:" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "// ❌🔨\n" msgstr "" -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +#: src/idiomatic/polymorphism/refresher/orphan-rule.md msgid "" -"At least one new crate source code in `third_party/rust/chromium_crates_io/" -"vendor`" +"Rust traits should never be able to be implemented twice in its ecosystem. Two " +"implementations of the same trait for the same type is a conflict with no solution." msgstr "" -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md +#: src/idiomatic/polymorphism/refresher/orphan-rule.md msgid "" -"At least one new `BUILD.gn` in `third_party/rust//v`" +"We can prevent this within a crate by detecting if there are multiple definitions and " +"disallowing it, but what about between crates in the entire Rust ecosystem?" msgstr "" -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md -msgid "An appropriate `README.chromium`" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "Types are either _local_ to a crate, they are defined there, or they're not." msgstr "" -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md -#, fuzzy +#: src/idiomatic/polymorphism/refresher/orphan-rule.md msgid "" -"The \"major semver version\" is a [Rust \"semver\" version number](https://" -"doc.rust-lang.org/cargo/reference/semver.html)." +"In the example's \"crates\", `PostgresqlConn` is local to `postgresql-bindings`, " +"`MyCoolNewDbConn` is local to `mycoolnewdb`." msgstr "" -"Voir la [Rust Reference](https://doc.rust-lang.org/reference/type-layout." -"html)." -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md -msgid "" -"Take a close look, especially at the things generated in `third_party/rust`." +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "Traits are also either _local_ to a crate, they are defined there, or they're not." msgstr "" -#: src/chromium/adding-third-party-crates/generating-gn-build-rules.md -msgid "" -"Talk a little about semver --- and specifically the way that in Chromium " -"it's to allow multiple incompatible versions of a crate, which is " -"discouraged but sometimes necessary in the Cargo ecosystem." +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "Again in the example, the `DbConnection` trait is local to `database-traits`." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "" -"If your build fails, it may be because of a `build.rs`: programs which do " -"arbitrary things at build time. This is fundamentally at odds with the " -"design of `gn` and `ninja` which aim for static, deterministic, build rules " -"to maximize parallelism and repeatability of builds." +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "If something is local, you can write trait implementations for it." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "" -"Some `build.rs` actions are automatically supported; others require action:" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "If the trait is local, you can write implementations of that trait for any type." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "build script effect" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "If the type is local, you can write any trait implementations for that type." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Supported by our gn templates" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "Outside of these boundaries, trait implementations cannot be written." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Work required by you" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "" +"This keeps implementations \"coherent\": Only one implementation of a trait for a type " +"can exist across crates." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Checking rustc version to configure features on and off" +#: src/idiomatic/polymorphism/refresher/orphan-rule.md +msgid "" +"https://doc.rust-lang.org/stable/reference/items/implementations.html#r-items.impl.trait." +"orphan-rule" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Yes" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "Statically Sized and Dynamically Sized Types" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "None" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "/* : Sized */" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Checking platform or CPU to configure features on and off" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "" +"Motivation: Being able to specify between types whose size are known and compile time and " +"types whose size are known at runtime is useful for" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -#, fuzzy -msgid "Generating code" -msgstr "Génériques" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "" +"The Sized trait is automatically implemented by types with a known size at compile-time." +msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Yes - specify in `gnrt_config.toml`" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "" +"This trait is also automatically added to any type parameter that doesn't opt-out of " +"being sized." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Building C/C++" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "Most types implement `Sized`: they have a compile-time known size." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "No" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "" +"Types like `[T]`, `str` and `dyn Trait` are all dynamically sized types. Their size is " +"stored as part of the reference to the value of that type." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Patch around it" +#: src/idiomatic/polymorphism/refresher/sized.md +msgid "Type parameters automatically implement `Sized` unless specified." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md -msgid "Arbitrary other actions" +#: src/idiomatic/polymorphism/refresher/sized.md +#, fuzzy +msgid "" +"https://doc.rust-lang.org/stable/reference/dynamically-sized-types.html#r-dynamic-sized" +msgstr "[Créer des scripts](https://doc.rust-lang.org/cargo/reference/build-scripts.html)" + +#: src/idiomatic/polymorphism/refresher/monomorphization.md +msgid "// instance one, &Vec -> ()\n" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems.md +#: src/idiomatic/polymorphism/refresher/monomorphization.md +msgid "// instance two, &Vec -> ()\n" +msgstr "" + +#: src/idiomatic/polymorphism/refresher/monomorphization.md msgid "" -"Fortunately, most crates don't contain a build script, and fortunately, most " -"build scripts only do the top two actions." +"Each instance of a function or type with generics gets transformed into a unique, " +"concrete version of that function at compile time. Generics do not exist at runtime, only " +"specific types." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +#: src/idiomatic/polymorphism/refresher/monomorphization.md msgid "" -"If `ninja` complains about missing files, check the `build.rs` to see if it " -"writes source code files." +"This comes with a strong baseline performance and capacity for optimization, but at a " +"cost of binary size and compile time." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +#: src/idiomatic/polymorphism/refresher/monomorphization.md msgid "" -"If so, modify [`gnrt_config.toml`](../configuring-gnrt-config-toml.md) to " -"add `build-script-outputs` to the crate. If this is a transitive dependency, " -"that is, one on which Chromium code should not directly depend, also add " -"`allow-first-party-usage=false`. There are several examples already in that " -"file:" +"There are plenty of ways to trim binary size and compilation times, but we're not " +"covering them here." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +#: src/idiomatic/polymorphism/refresher/monomorphization.md msgid "" -"```toml\n" -"[crate.unicode-linebreak]\n" -"allow-first-party-usage = false\n" -"build-script-outputs = [\"tables.rs\"]\n" -"```" +"Pay for what you use: Binary size increase of monomorphization is only incurred for " +"instances of a type or functions on a type used in the final program or dynamic library." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-generate-code.md +#: src/idiomatic/polymorphism/refresher/monomorphization.md msgid "" -"Now rerun [`gnrt.py -- gen`](../generating-gn-build-rules.md) to regenerate " -"`BUILD.gn` files to inform ninja that this particular output file is input " -"to subsequent build steps." +"When to care: Monomorphization impacts compile times and binary size. In circumstances " +"like WebAssembly in-browser or embedded systems development, you may want to be mindful " +"about designing with generics in mind." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md +#: src/idiomatic/polymorphism/from-oop-to-rust.md +msgid "From OOP to Rust: Composition, Not Inheritance" +msgstr "" + +#: src/idiomatic/polymorphism/from-oop-to-rust.md msgid "" -"Some crates use the [`cc`](https://crates.io/crates/cc) crate to build and " -"link C/C++ libraries. Other crates parse C/C++ using [`bindgen`](https://" -"crates.io/crates/bindgen) within their build scripts. These actions can't be " -"supported in a Chromium context --- our gn, ninja and LLVM build system is " -"very specific in expressing relationships between build actions." +"Inheritance is key to OOP's success as a paradigm. Decades of successful software " +"engineering has been done with Inheritance as a core part of business logic." msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md -msgid "So, your options are:" +#: src/idiomatic/polymorphism/from-oop-to-rust.md +msgid "So why did Rust avoid inheritance?" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md -msgid "Avoid these crates" +#: src/idiomatic/polymorphism/from-oop-to-rust.md +msgid "How do we move from inheritance-based problem solving to Rust's approach?" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md -msgid "Apply a patch to the crate." +#: src/idiomatic/polymorphism/from-oop-to-rust.md +msgid "How do you represent heterogeneous collections in Rust?" msgstr "" -#: src/chromium/adding-third-party-crates/resolving-problems/build-scripts-which-take-arbitrary-actions.md +#: src/idiomatic/polymorphism/from-oop-to-rust.md msgid "" -"Patches should be kept in `third_party/rust/chromium_crates_io/patches/" -"` - see for example the [patches against the `cxx` crate](https://" -"source.chromium.org/chromium/chromium/src/+/main:third_party/rust/" -"chromium_crates_io/patches/cxx/) - and will be applied automatically by " -"`gnrt` each time it upgrades the crate." +"In this section we'll be looking at how to move from thinking about polymorphic problem " +"solving with types in OOP languages like java, C++ etc. to Rust's trait-based approach to " +"Polymorphism." msgstr "" -#: src/chromium/adding-third-party-crates/depending-on-a-crate.md +#: src/idiomatic/polymorphism/from-oop-to-rust.md msgid "" -"Once you've added a third-party crate and generated build rules, depending " -"on a crate is simple. Find your `rust_static_library` target, and add a " -"`dep` on the `:lib` target within your crate." +"There will be differences, but there are also plenty of areas in common – especially with " +"modern standards of OOP development. Remember to keep an open mind." msgstr "" -#: src/chromium/adding-third-party-crates/depending-on-a-crate.md -msgid "Specifically," +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "Inheritance in OOP languages" msgstr "" -#: src/chromium/adding-third-party-crates/depending-on-a-crate.md -msgid "" -"```bob\n" -" +------------+ +----------------------+\n" -"\"//third_party/rust\" | crate name | \"/v\" | major semver version | \":" -"lib\"\n" -" +------------+ +----------------------+\n" -"```" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "" msgstr "" -#: src/chromium/adding-third-party-crates/depending-on-a-crate.md -msgid "" -"```gn\n" -"rust_static_library(\"my_rust_lib\") {\n" -" crate_root = \"lib.rs\"\n" -" sources = [ \"lib.rs\" ]\n" -" deps = [ \"//third_party/rust/example_rust_crate/v1:lib\" ]\n" -"}\n" -"```" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "// Base class\n" msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "Auditing Third Party Crates" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "// Inheriting class\n" msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "" -"Adding new libraries is subject to Chromium's standard [policies](https://" -"chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/rust." -"md#Third_party-review), but of course also subject to security review. As " -"you may be bringing in not just a single crate but also transitive " -"dependencies, there may be a lot of code to review. On the other hand, safe " -"Rust code can have limited negative side effects. How should you review it?" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "// Create a Car object\n" msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "" -"Over time Chromium aims to move to a process based around [cargo vet]" -"(https://mozilla.github.io/cargo-vet/)." +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "// Inherited method\n" msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "" -"Meanwhile, for each new crate addition, we are checking for the following:" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "// Car's own method\n" msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md msgid "" -"Understand why each crate is used. What's the relationship between crates? " -"If the build system for each crate contains a `build.rs` or procedural " -"macros, work out what they're for. Are they compatible with the way Chromium " -"is normally built?" +"This should be a short reminder for students about what inheritance is in other languages." msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "Check each crate seems to be reasonably well maintained" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "" +"Inheritance is a mechanism where a \"child\" type gains the fields and methods of the " +"\"parent\" types it is inheriting from." msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "" -"Use `cd third-party/rust/chromium_crates_io; cargo audit` to check for known " -"vulnerabilities (first you'll need to `cargo install cargo-audit`, which " -"ironically involves downloading lots of dependencies from the internet[2](../" -"cargo.md))" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "Methods are able to be overridden as-needed by the inheriting type." msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "" -"Ensure any `unsafe` code is good enough for the [Rule of Two](https://" -"chromium.googlesource.com/chromium/src/+/main/docs/security/rule-of-2." -"md#unsafe-code-in-safe-languages)" +#: src/idiomatic/polymorphism/from-oop-to-rust/inheritance.md +msgid "Can call methods of inherited-from classes with `super`." msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "Check for any use of `fs` or `net` APIs" +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +#, fuzzy +msgid "// methods\n" +msgstr "Méthodes" + +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "// 🔨❌, Rust does not have inheritance!\n" msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md -msgid "" -"Read all the code at a sufficient level to look for anything out of place " -"that might have been maliciously inserted. (You can't realistically aim for " -"100% perfection here: there's often just too much code.)" +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "// Inherited \"id\" field\n" msgstr "" -#: src/chromium/adding-third-party-crates/reviews-and-audits.md +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md msgid "" -"These are just guidelines --- work with reviewers from `security@chromium." -"org` to work out the right way to become confident of the crate." +"// methods, but also includes Id's methods, or maybe overrides to\n" +" // those methods.\n" msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md -msgid "Checking Crates into Chromium Source Code" +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "// ✅\n" msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md -msgid "`git status` should reveal:" +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "// All of data's methods that aren't from traits.\n" msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md -msgid "Crate code in `//third_party/rust/chromium_crates_io`" +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "// Implementations for traits in separate impl blocks.\n" msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md -msgid "" -"Metadata (`BUILD.gn` and `README.chromium`) in `//third_party/rust//" -"`" +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "Inheritance comes with a number of downsides." msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md -msgid "Please also add an `OWNERS` file in the latter location." +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "Heterogeneous by default:" msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md msgid "" -"You should land all this, along with your `Cargo.toml` and `gnrt_config." -"toml` changes, into the Chromium repo." +"Class inheritance implicitly allows types of different classes to be used " +"interchangeably, without being able to specify a concrete type or if a type is identical " +"to another." msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md msgid "" -"**Important**: you need to use `git add -f` because otherwise `.gitignore` " -"files may result in some files being skipped." +"For operations like equality, comparison this allows for comparison and equality that " +"throws and error or otherwise panics." msgstr "" -#: src/chromium/adding-third-party-crates/checking-in.md -msgid "" -"As you do so, you might find presubmit checks fail because of non-inclusive " -"language. This is because Rust crate data tends to include names of git " -"branches, and many projects still use non-inclusive terminology there. So " -"you may need to run:" +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "Multiple sources of truth for what makes up a data structure and how it behaves:" msgstr "" -#: src/chromium/adding-third-party-crates/keeping-up-to-date.md -msgid "" -"As the OWNER of any third party Chromium dependency, you are [expected to " -"keep it up to date with any security fixes](https://chromium.googlesource." -"com/chromium/src/+/main/docs/adding_to_third_party.md#add-owners). It is " -"hoped that we will soon automate this for Rust crates, but for now, it's " -"still your responsibility just as it is for any other third party dependency." +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "A type's fields are obscured by the inheritance hierarchy." msgstr "" -#: src/exercises/chromium/third-party.md +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md msgid "" -"Add [uwuify](https://crates.io/crates/uwuify) to Chromium, turning off the " -"crate's [default features](https://doc.rust-lang.org/cargo/reference/" -"features.html#the-default-feature). Assume that the crate will be used in " -"shipping Chromium, but won't be used to handle untrustworthy input." +"A type's methods could be overriding a parent type or be overridden by a child type, it's " +"hard to tell what the behavior of a type is in complex codebases maintained by multiple " +"parties." msgstr "" -#: src/exercises/chromium/third-party.md +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "Dynamic dispatch as default adds overhead from vtable lookups:" +msgstr "" + +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md msgid "" -"(In the next exercise we'll use uwuify from Chromium, but feel free to skip " -"ahead and do that now if you like. Or, you could create a new " -"[`rust_executable` target](https://source.chromium.org/chromium/chromium/src/" -"+/main:build/rust/rust_executable.gni) which uses `uwuify`)." +"For dynamic dispatch to work, there needs to be somewhere to store information on what " +"methods to call and other pieces of runtime-known pieces of information on the type." msgstr "" -#: src/exercises/chromium/third-party.md -msgid "Students will need to download lots of transitive dependencies." +#: src/idiomatic/polymorphism/from-oop-to-rust/why-no-inheritance.md +msgid "" +"This store is the `vtable` for a value. Method calls will require more dereferences than " +"calling a method for a type that is known at compile time." msgstr "" -#: src/exercises/chromium/third-party.md -msgid "The total crates needed are:" +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "// Data\n" msgstr "" -#: src/exercises/chromium/third-party.md +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md #, fuzzy -msgid "`instant`," -msgstr "`const`" +msgid "// Concrete behavior\n" +msgstr "Aucun comportement indéfini à l'exécution :" -#: src/exercises/chromium/third-party.md -msgid "`lock_api`," +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "// Abstract behavior\n" msgstr "" -#: src/exercises/chromium/third-party.md -msgid "`parking_lot`," +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +#, fuzzy +msgid "// Instanced behavior\n" +msgstr "Aucun comportement indéfini à l'exécution :" + +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "" +"From Rust's perspective, one where Inheritance was never there, introducing inheritance " +"would look like muddying the water between types and traits." msgstr "" -#: src/exercises/chromium/third-party.md -msgid "`parking_lot_core`," +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "A type is a concrete piece of data and its associated behavior." msgstr "" -#: src/exercises/chromium/third-party.md -msgid "`redox_syscall`," +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "A trait is abstract behavior that must be implemented by a type." msgstr "" -#: src/exercises/chromium/third-party.md -msgid "`scopeguard`," +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "A class is a combination of data, behavior, and overrides to that behavior." msgstr "" -#: src/exercises/chromium/third-party.md -msgid "`smallvec`, and" +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "Coming from Rust, an inheritable class looks like a type that is also a trait." msgstr "" -#: src/exercises/chromium/third-party.md -msgid "`uwuify`." +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md +msgid "This is not an upside, as we can no longer reason about concrete types." msgstr "" -#: src/exercises/chromium/third-party.md +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md msgid "" -"If students are downloading even more than that, they probably forgot to " -"turn off the default features." +"Without being able to separate the two, it becomes difficult to reason about generic " +"behavior vs concrete specifics, because in OOP these two concepts are tied up in each " +"other." msgstr "" -#: src/exercises/chromium/third-party.md +#: src/idiomatic/polymorphism/from-oop-to-rust/switch-perspective.md msgid "" -"Thanks to [Daniel Liu](https://github.com/Daniel-Liu-c0deb0t) for this crate!" +"The convenience of flat field access and DRY in type definitions is not worth the loss in " +"specificity between writing code that delineates between behavior and data." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "Bringing It Together --- Exercise" +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md +msgid "\"Inheritance\" in Rust: Supertraits" msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md msgid "" -"In this exercise, you're going to add a whole new Chromium feature, bringing " -"together everything you already learned." +"In Rust, traits can depend on other traits. We're already familiar with Traits being able " +"to have Supertraits." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "The Brief from Product Management" +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md +msgid "This looks superficially similar to inheritance." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "" -"A community of pixies has been discovered living in a remote rainforest. " -"It's important that we get Chromium for Pixies delivered to them as soon as " -"possible." +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md +msgid "This is a mechanism like inheritance, but separates the data from the behavior." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "" -"The requirement is to translate all Chromium's UI strings into Pixie " -"language." +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md +msgid "Keeps behavior in a state where it's easy to reason about." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "" -"There's not time to wait for proper translations, but fortunately pixie " -"language is very close to English, and it turns out there's a Rust crate " -"which does the translation." +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md +msgid "Makes what we aim to achieve with \"multiple inheritance\" easier too:" msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md msgid "" -"In fact, you already [imported that crate in the previous exercise](https://" -"crates.io/crates/uwuify)." +"We only care about what behavior a type is capable of at the point where we clarify we " +"want that behavior (when bounding a generic by traits)." msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md msgid "" -"(Obviously, real translations of Chrome require incredible care and " -"diligence. Don't ship this!)" +"By specifying multiple traits on a generic, we know that the type has the methods of all " +"those traits." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "Steps" +#: src/idiomatic/polymorphism/from-oop-to-rust/supertraits.md +msgid "" +"Does not involve inheritance of fields. A trait doesn't expose fields, only methods and " +"associated types / constants." msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/composition.md msgid "" -"Modify `ResourceBundle::MaybeMangleLocalizedString` so that it uwuifies all " -"strings before display. In this special build of Chromium, it should always " -"do this irrespective of the setting of `mangle_localized_strings_`." +"Rather than mixins or inheritance, we compose types by creating fields of different types." msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/composition.md msgid "" -"If you've done everything right across all these exercises, congratulations, " -"you should have created Chrome for pixies!" +"This has downsides, largely in ergonomics of field access, but gives developers a lot of " +"control and clarity over what a type does and it has access to." msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/composition.md msgid "" -"UTF16 vs UTF8. Students should be aware that Rust strings are always UTF8, " -"and will probably decide that it's better to do the conversion on the C++ " -"side using `base::UTF16ToUTF8` and back again." +"When deriving traits, make sure all the field types of a struct or variant types of an " +"enum implement that trait. Derive macros often assume all types that compose a new type " +"implement that trait already." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "" -"If students decide to do the conversion on the Rust side, they'll need to " -"consider [`String::from_utf16`](https://doc.rust-lang.org/std/string/struct." -"String.html#method.from_utf16), consider error handling, and consider which " -"[CXX supported types can transfer a lot of u16s](https://cxx.rs/binding/" -"slice.html)." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md +msgid "`dyn Trait` for Dynamic Dispatch in Rust" msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md +#, fuzzy +msgid "\"Hello dyn!\"" +msgstr "Bonjour le monde!" + +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md msgid "" -"Students may design the C++/Rust boundary in several different ways, e.g. " -"taking and returning strings by value, or taking a mutable reference to a " -"string. If a mutable reference is used, CXX will likely tell the student " -"that they need to use [`Pin`](https://doc.rust-lang.org/std/pin/). You may " -"need to explain what `Pin` does, and then explain why CXX needs it for " -"mutable references to C++ data: the answer is that C++ data can't be moved " -"around like Rust data, because it may contain self-referential pointers." +"Dynamic Dispatch is a tool in Object Oriented Programming that is often used in places " +"where one needs to care more about the behavior of a type than what the type is." msgstr "" -#: src/exercises/chromium/bringing-it-together.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md msgid "" -"The C++ target containing `ResourceBundle::MaybeMangleLocalizedString` will " -"need to depend on a `rust_static_library` target. The student probably " -"already did this." +"In OOP languages, dynamic dispatch is often an _implicit_ process and not something you " +"can opt out of." msgstr "" -#: src/exercises/chromium/bringing-it-together.md -msgid "" -"The `rust_static_library` target will need to depend on `//third_party/rust/" -"uwuify/v0_2:lib`." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md +msgid "In Rust, we use `dyn Trait`: an opt-in form of dynamic dispatch." msgstr "" -#: src/exercises/chromium/solutions.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md msgid "" -"Solutions to the Chromium exercises can be found in [this series of CLs]" -"(https://chromium-review.googlesource.com/c/chromium/src/+/5096560)." +"For any trait that is _dyn compatible_ we can coerce a reference to a value of that trait " +"into a `dyn Trait` value." msgstr "" -#: src/bare-metal.md -#, fuzzy -msgid "Welcome to Bare Metal Rust" -msgstr "Bienvenue dans Bare Metal Rust" - -#: src/bare-metal.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md msgid "" -"This is a standalone one-day course about bare-metal Rust, aimed at people " -"who are familiar with the basics of Rust (perhaps from completing the " -"Comprehensive Rust course), and ideally also have some experience with bare-" -"metal programming in some other language such as C." +"We call these _trait objects_. Their type is not known at compile time, but their " +"behavior is: what is implemented by the trait itself." msgstr "" -"Il s'agit d'un cours autonome d'une journée sur la bare-metal Rust, destiné " -"aux personnes familiarisées avec le bases de Rust (peut-être après avoir " -"terminé le cours Comprehensive Rust(le guide complet de Rust)), et " -"idéalement aussi avoir quelques expérience de la programmation bare-metal " -"dans un autre langage tel que C." -#: src/bare-metal.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-trait.md msgid "" -"Today we will talk about 'bare-metal' Rust: running Rust code without an OS " -"underneath us. This will be divided into several parts:" +"When you _need_ OOP-style heterogeneous data structures, you can reach for `Box`, but try to keep it homogeneous and generic-based first!" msgstr "" -"Aujourd'hui, nous allons parler de Rust \"bare-metal\": exécuter du code " -"Rust sans système d'exploitation sous nous. Cette volonté être divisé en " -"plusieurs parties :" -#: src/bare-metal.md -#, fuzzy -msgid "What is `no_std` Rust?" -msgstr "Qu'est-ce que `no_std` Rust ?" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "Dyn-compatible traits" +msgstr "" -#: src/bare-metal.md -#, fuzzy -msgid "Writing firmware for microcontrollers." -msgstr "Ecriture de firmware pour microcontrôleurs." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "// dyn compatible\n" +msgstr "" -#: src/bare-metal.md -#, fuzzy -msgid "Writing bootloader / kernel code for application processors." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "// dyn compatible, but you can't use this method when it's dyn\n" msgstr "" -"Ecriture du bootloader / code noyau pour les processeurs d'application." -#: src/bare-metal.md -#, fuzzy -msgid "Some useful crates for bare-metal Rust development." -msgstr "Quelques caisses utiles pour le développement de Rust en métal nu." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "// no longer dyn compatible\n" +msgstr "" -#: src/bare-metal.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md msgid "" -"For the microcontroller part of the course we will use the [BBC micro:bit]" -"(https://microbit.org/) v2 as an example. It's a [development board](https://" -"tech.microbit.org/hardware/) based on the Nordic nRF51822 microcontroller " -"with some LEDs and buttons, an I2C-connected accelerometer and compass, and " -"an on-board SWD debugger." +"Not all traits are able to be invoked as trait objects. A trait that can be invoked is " +"referred to as a _dyn compatible_ trait." msgstr "" -"Pour la partie microcontrôleur du cours, nous utiliserons le [BBC micro:bit]" -"(https://microbit.org/) v2 par exemple. C'est une [carte de développement]" -"(https://tech.microbit.org/hardware/) basée sur le Nordic Microcontrôleur " -"nRF51822 avec quelques LED et boutons, un accéléromètre et une boussole " -"connectés I2C, et un débogueur SWD intégré." -#: src/bare-metal.md -#, fuzzy -msgid "" -"To get started, install some tools we'll need later. On gLinux or Debian:" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "This was previously called _object safe traits_ or _object safety_." msgstr "" -"Pour commencer, installez quelques outils dont nous aurons besoin plus tard. " -"Sous gLinux ou Debian :" -#: src/bare-metal.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md msgid "" -"And give users in the `plugdev` group access to the micro:bit programmer:" +"Dynamic dispatch offloads a lot of compile-time type information into runtime vtable " +"information." msgstr "" -"Et donnez aux utilisateurs du groupe `plugdev` l'accès au programmeur micro:" -"bit :" - -#: src/bare-metal.md src/bare-metal/microcontrollers/debugging.md -#, fuzzy -msgid "On MacOS:" -msgstr "Sur MacOS :" - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`core`" -msgstr "`noyau`" - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`std`" -msgstr "`std`" - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "Slices, `&str`, `CStr`" -msgstr "Tranches, `&str`, `CStr`" - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`NonZeroU8`..." -msgstr "`NonZeroU8`..." - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Option`, `Result`" -msgstr "`Option`, `Résultat`" - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Display`, `Debug`, `write!`..." -msgstr "`Afficher`, `Déboguer`, `écrire !`..." - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`panic!`, `assert_eq!`..." -msgstr "`panique !`, `assert_eq !`..." - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`NonNull` and all the usual pointer-related functions" -msgstr "`NonNull` et toutes les fonctions habituelles liées au pointeur" - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Future` and `async`/`await`" -msgstr "`Future` et `async`/`wait`" - -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`fence`, `AtomicBool`, `AtomicPtr`, `AtomicU32`..." -msgstr "`clôture`, `AtomicBool`, `AtomicPtr`, `AtomicU32`..." -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Duration`" -msgstr "`Durée`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "" +"If a concept is incompatible with what we can meaningfully store in a vtable, either the " +"trait stops being dyn compatible or those methods are excluded from being able to be used " +"in a dyn context." +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Box`, `Cow`, `Arc`, `Rc`" -msgstr "`Boîte`, `Vache`, `Arc`, `Rc`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "" +"A trait is dyn-compatible when all its supertraits are dyn-compatible and when it has no " +"associated constants/types, and no methods that depend on generics." +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Vec`, `BinaryHeap`, `BtreeMap`, `LinkedList`, `VecDeque`" -msgstr "`Vec`, `BinaryHeap`, `BtreeMap`, `LinkedList`, `VecDeque`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "" +"You'll most frequently run into dyn incompatible traits when they have associated types/" +"constants or return values of `Self` (i.e. the Clone trait is not dyn compatible.)" +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`String`, `CString`, `format!`" -msgstr "`Chaîne`, `CString`, `format !`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "" +"This is because the associated data would have to be stored in vtables, taking up extra " +"memory." +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Error`" -msgstr "\"Erreur\"" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "" +"For methods like `clone`, this disqualifies dyn compatibility because the output type " +"depends on the concrete type of `self`." +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Mutex`, `Condvar`, `Barrier`, `Once`, `RwLock`, `mpsc`" -msgstr "`Mutex`, `Condvar`, `Barrière`, `Une fois`, `RwLock`, `mpsc`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-compatible.md +msgid "" +"https://doc.rust-lang.org/1.91.1/reference/items/traits.html#r-items.traits.dyn-compatible" +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`File` and the rest of `fs`" -msgstr "`File` et le reste de `fs`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "Generic Function Parameters vs dyn Trait" +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`println!`, `Read`, `Write`, `Stdin`, `Stdout` and the rest of `io`" -msgstr "`println!`, `Read`, `Write`, `Stdin`, `Stdout` et le reste de `io`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "We have two means of writing polymorphic functions, how do they compare?" +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Path`, `OsString`" -msgstr "`Chemin`, `OsString`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "// Monomorphized to a unique function for i32 inputs.\n" +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`net`" -msgstr "\"net\"" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "// One per\n" +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`Command`, `Child`, `ExitCode`" -msgstr "`Commande`, `Enfant`, `Code de sortie`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "We can write polymorphic functions over generics or over trait objects." +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`spawn`, `sleep` and the rest of `thread`" -msgstr "`spawn`, `sleep` et le reste de `thread`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "" +"When writing functions with generic parameters, for each unique type that substitutes a " +"parameter a new version of that function is generated." +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`SystemTime`, `Instant`" -msgstr "`SystemTime`, `Instantané`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "" +"We went over this in monomorphization: in exchange for binary size, we gain a greater " +"capacity for optimization." +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`HashMap` depends on RNG." -msgstr "`HashMap` dépend de RNG." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "" +"When writing functions that take a trait object, only one version of that function will " +"exist in the final binary (not counting inlining.)" +msgstr "" -#: src/bare-metal/no_std.md -#, fuzzy -msgid "`std` re-exports the contents of both `core` and `alloc`." -msgstr "`std` réexporte le contenu de `core` et `alloc`." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/dyn-vs-generics.md +msgid "" +"Generic parameters are zero-cost other than binary size. Types must be homogenous (all " +"instances of T can only be the same type)." +msgstr "" -#: src/bare-metal/minimal.md -#, fuzzy -msgid "A minimal `no_std` program" -msgstr "Un programme minimal `no_std`" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md +msgid "// 4 bytes, owned value\n" +msgstr "" -#: src/bare-metal/minimal.md -msgid "This will compile to an empty binary." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md +msgid "// 8 bytes, reference\n" msgstr "" -#: src/bare-metal/minimal.md -msgid "`std` provides a panic handler; without it we must provide our own." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md +msgid "// 16 bytes, wide pointer\n" msgstr "" -#: src/bare-metal/minimal.md -msgid "It can also be provided by another crate, such as `panic-halt`." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md +msgid "Trait objects are a limited way of solving problems." msgstr "" -#: src/bare-metal/minimal.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md msgid "" -"Depending on the target, you may need to compile with `panic = \"abort\"` to " -"avoid an error about `eh_personality`." +"If you want to downcast to a concrete type from a trait object, you will need to specify " +"that the trait in question has Any as a supertrait or that the trait object is over the " +"main trait and `Any`." msgstr "" -#: src/bare-metal/minimal.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md +msgid "Even then, you will still need to cast a `dyn MyTrait` to `dyn Any`" +msgstr "" + +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md msgid "" -"Note that there is no `main` or any other entry point; it's up to you to " -"define your own entry point. This will typically involve a linker script and " -"some assembly code to set things up ready for Rust code to run." +"Trait objects have overhead in memory, they are \"wide pointers\" that need to hold not " +"just the pointer to the data itself but another pointer for the vtable." msgstr "" -#: src/bare-metal/alloc.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md msgid "" -"To use `alloc` you must implement a [global (heap) allocator](https://doc." -"rust-lang.org/stable/std/alloc/trait.GlobalAlloc.html)." +"Trait objects, being dynamically sized types, can only be used practically via reference " +"or pointer types." msgstr "" -"Pour utiliser `alloc` vous devez implémenter un [allocateur global (de tas)]" -"(https://doc.rust-lang.org/stable/std/alloc/trait.GlobalAlloc.html)." -#: src/bare-metal/alloc.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/limits.md msgid "" -"// Safe because `HEAP` is only used here and `entry` is only called once.\n" +"There is a baseline overhead of dereferencing the value and relevant trait methods when " +"using trait objects." msgstr "" -#: src/bare-metal/alloc.md -msgid "// Give the allocator some memory to allocate.\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/heterogeneous.md +msgid "Heterogeneous data with `dyn trait`" msgstr "" -#: src/bare-metal/alloc.md -msgid "// Now we can do things that require heap allocation.\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/heterogeneous.md +msgid "\"λ\"" msgstr "" -#: src/bare-metal/alloc.md -#, fuzzy -msgid "\"A string\"" -msgstr "String" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/heterogeneous.md +msgid "\"Woah\"" +msgstr "" -#: src/bare-metal/alloc.md -msgid "" -"`buddy_system_allocator` is a third-party crate implementing a basic buddy " -"system allocator. Other crates are available, or you can write your own or " -"hook into your existing allocator." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/heterogeneous.md +msgid "// We know \"item\" implements Display, but we know nothing else!\n" msgstr "" -#: src/bare-metal/alloc.md -msgid "" -"The const parameter of `LockedHeap` is the max order of the allocator; i.e. " -"in this case it can allocate regions of up to 2\\*\\*32 bytes." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/heterogeneous.md +msgid "\"Display output: {}\"" msgstr "" -#: src/bare-metal/alloc.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/heterogeneous.md msgid "" -"If any crate in your dependency tree depends on `alloc` then you must have " -"exactly one global allocator defined in your binary. Usually this is done in " -"the top-level binary crate." +"`dyn Trait`, being a dynamic dispatch tool, lets us store heterogeneous data in " +"collections." msgstr "" -#: src/bare-metal/alloc.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/heterogeneous.md msgid "" -"`extern crate panic_halt as _` is necessary to ensure that the `panic_halt` " -"crate is linked in so we get its panic handler." +"In this example, we're storing types that all implement `std::fmt::Display` and printing " +"all items in that collection to screen." msgstr "" -#: src/bare-metal/alloc.md -msgid "This example will build but not run, as it doesn't have an entry point." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md +msgid "Any Trait and Downcasting" msgstr "" -#: src/bare-metal/microcontrollers.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md msgid "" -"The `cortex_m_rt` crate provides (among other things) a reset handler for " -"Cortex M microcontrollers." +"The `Any` trait allows us to downcast values back from dyn values into concrete values." msgstr "" -"La caisse `cortex_m_rt` fournit (entre autres) un gestionnaire de " -"réinitialisation pour les microcontrôleurs Cortex M." -#: src/bare-metal/microcontrollers.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md msgid "" -"Next we'll look at how to access peripherals, with increasing levels of " -"abstraction." +"This is an auto trait: like Send/Sync/Sized, it is automatically implemented for any type " +"that meets specific criteria." msgstr "" -"Ensuite, nous verrons comment accéder aux périphériques, avec des niveaux " -"d'abstraction croissants." -#: src/bare-metal/microcontrollers.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md msgid "" -"The `cortex_m_rt::entry` macro requires that the function have type `fn() -" -"> !`, because returning to the reset handler doesn't make sense." +"The criteria for Any is that a type is `'static`. That is, the type does not contain any " +"non-`'static` lifetimes within it." msgstr "" -"La macro `cortex_m_rt::entry` nécessite que la fonction ait le type `fn() -" -"> !`, car le retour au gestionnaire de réinitialisation n'a pas de sens." - -#: src/bare-metal/microcontrollers.md -#, fuzzy -msgid "Run the example with `cargo embed --bin minimal`" -msgstr "Exécutez l'exemple avec `cargo embed --bin minimal`" -#: src/bare-metal/microcontrollers/mmio.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md msgid "" -"Most microcontrollers access peripherals via memory-mapped IO. Let's try " -"turning on an LED on our micro:bit:" +"Any offers two related behaviors: downcasting, and runtime checking of types being the " +"same." msgstr "" -"La plupart des microcontrôleurs accèdent aux périphériques via des E/S " -"mappées en mémoire. Essayons d'allumer une LED sur notre micro:bit:" -#: src/bare-metal/microcontrollers/mmio.md -msgid "/// GPIO port 0 peripheral address\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md +msgid "" +"In the example above, we see the ability to downcast from `Any` into `ThisImplementsAny` " +"automatically." msgstr "" -#: src/bare-metal/microcontrollers/mmio.md -msgid "// GPIO peripheral offsets\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md +msgid "We also see `Any::is` being used to check to see what type the value is." msgstr "" -#: src/bare-metal/microcontrollers/mmio.md -msgid "// PIN_CNF fields\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/any-trait.md +msgid "`Any` does not implement reflection for a type, this is all you can do with `Any`." msgstr "" -#: src/bare-metal/microcontrollers/mmio.md -#: src/bare-metal/microcontrollers/pacs.md -#: src/bare-metal/microcontrollers/hals.md -msgid "// Configure GPIO 0 pins 21 and 28 as push-pull outputs.\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md +msgid "" +"Coming from an OOP background, it's understandable to reach for this dynamic dispatch " +"tool as early as possible." msgstr "" -#: src/bare-metal/microcontrollers/mmio.md +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md msgid "" -"// Safe because the pointers are to valid peripheral control registers, and\n" -" // no aliases exist.\n" +"This is not the preferred way of doing things, trait objects put us in a situation where " +"we're exchanging knowledge of a type that both the developer and compiler has for " +"flexibility." msgstr "" -#: src/bare-metal/microcontrollers/mmio.md -#: src/bare-metal/microcontrollers/pacs.md -#: src/bare-metal/microcontrollers/hals.md -msgid "// Set pin 28 low and pin 21 high to turn the LED on.\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md +msgid "" +"The above example takes things to the absurd: If adding numbers were tied up in the " +"dynamic dispatch process, it would be difficult to do anything at all." msgstr "" -#: src/bare-metal/microcontrollers/mmio.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md msgid "" -"GPIO 0 pin 21 is connected to the first column of the LED matrix, and pin 28 " -"to the first row." +"But dynamic dispatch is often hidden in a lot of programming languages: here's it is more " +"explicit." msgstr "" -"La broche 21 du GPIO 0 est connectée à la première colonne de la matrice LED " -"et la broche 28 à la première rangée." - -#: src/bare-metal/microcontrollers/mmio.md -#: src/bare-metal/microcontrollers/pacs.md -#: src/bare-metal/microcontrollers/hals.md -#: src/bare-metal/microcontrollers/board-support.md -#, fuzzy -msgid "Run the example with:" -msgstr "Exécutez l'exemple avec :" -#: src/bare-metal/microcontrollers/pacs.md -#, fuzzy -msgid "Peripheral Access Crates" -msgstr "Caisses d'accès périphérique" +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md +msgid "" +"In the `i32` implementation of `AddDyn`, first we need to attempt to downcast the `rhs` " +"argument to the same type as `i32`, silently failing if this isn't the case." +msgstr "" -#: src/bare-metal/microcontrollers/pacs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md msgid "" -"[`svd2rust`](https://crates.io/crates/svd2rust) generates mostly-safe Rust " -"wrappers for memory-mapped peripherals from [CMSIS-SVD](https://www.keil.com/" -"pack/doc/CMSIS/SVD/html/index.html) files." +"Then we need to allocate the new value on the heap, because if we're keeping this in the " +"world of dynamic dispatch then we need to do this." msgstr "" -"[`svd2rust`](https://crates.io/crates/svd2rust) génère des wrappers Rust " -"principalement sûrs pour périphériques mappés en mémoire de [CMSIS-SVD]" -"(https://www.keil.com/pack/doc/CMSIS/SVD/html/index.html) des dossiers." -#: src/bare-metal/microcontrollers/pacs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md msgid "" -"SVD (System View Description) files are XML files typically provided by " -"silicon vendors which describe the memory map of the device." +"Once we've added two values together, if we want to view them we must downcast them again " +"into a \"real\" type we can print out given the trait bounds tied up in the operation so " +"far." msgstr "" -"Les fichiers SVD (System View Description) sont des fichiers XML " -"généralement fournis par les fournisseurs de silicium qui décrire la carte " -"mémoire de l'appareil." -#: src/bare-metal/microcontrollers/pacs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md msgid "" -"They are organised by peripheral, register, field and value, with names, " -"descriptions, addresses and so on." +"Ask the class: Why can't we just add Display bounds in `main` to be able to print things " +"as-is?" msgstr "" -"Ils sont organisés par périphérique, registre, champ et valeur, avec noms, " -"descriptions, adresses et ainsi de suite." -#: src/bare-metal/microcontrollers/pacs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md msgid "" -"SVD files are often buggy and incomplete, so there are various projects " -"which patch the mistakes, add missing details, and publish the generated " -"crates." +"Answer: Because add_dyn returns only a `dyn AddDyn`, we lose information about what the " +"type implements between the argument type and return type. Even if the inputs implement " +"`Display`, the return type does not." msgstr "" -"Les fichiers SVD sont souvent bogués et incomplets, il existe donc divers " -"projets qui corrigent le erreurs, ajoutez les détails manquants et publiez " -"les caisses générées." -#: src/bare-metal/microcontrollers/pacs.md -#, fuzzy -msgid "`cortex-m-rt` provides the vector table, among other things." -msgstr "`cortex-m-rt` fournit la table des vecteurs, entre autres choses." +#: src/idiomatic/polymorphism/from-oop-to-rust/dynamic-dispatch/pitfalls.md +msgid "This leads to less performant code which is harder to understand" +msgstr "" -#: src/bare-metal/microcontrollers/pacs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "Sealed traits for Polymorphism users cannot extend" +msgstr "" + +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md msgid "" -"If you `cargo install cargo-binutils` then you can run `cargo objdump --bin " -"pac -- -d --no-show-raw-insn` to see the resulting binary." +"// crate can access the \"sealed\" module and its trait, but projects that\n" +"// depend on it cannot.\n" msgstr "" -"Si vous \"installez cargo cargo-binutils\", vous pouvez exécuter `cargo " -"objdump --bin pac -- -d --no-show-raw-insn` pour voir le binaire résultant." -#: src/bare-metal/microcontrollers/hals.md -#, fuzzy -msgid "HAL crates" -msgstr "caisses HAL" +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "//...\n" +msgstr "" -#: src/bare-metal/microcontrollers/hals.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md msgid "" -"[HAL crates](https://github.com/rust-embedded/awesome-embedded-rust#hal-" -"implementation-crates) for many microcontrollers provide wrappers around " -"various peripherals. These generally implement traits from [`embedded-hal`]" -"(https://crates.io/crates/embedded-hal)." +"Motivation: We want trait-driven code in a crate, but we don't want projects that depend " +"on this crate to be able to implement a trait." msgstr "" -"[Caisses HAL](https://github.com/rust-embedded/awesome-embedded-rust#hal-" -"implementation-crates) pour de nombreux microcontrôleurs fournissent des " -"wrappers autour de divers périphériques. Ceux-ci implémentent généralement " -"des traits de [`embedded-hal`](https://crates.io/crates/embedded-hal)." -#: src/bare-metal/microcontrollers/hals.md -msgid "// Create HAL wrapper for GPIO port 0.\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "Why?" msgstr "" -#: src/bare-metal/microcontrollers/hals.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md msgid "" -"`set_low` and `set_high` are methods on the `embedded_hal` `OutputPin` trait." +"The trait could be considered unstable for downstream-implementations at this point in " +"time." msgstr "" -"`set_low` et `set_high` sont des méthodes sur le trait `embedded_hal` " -"`OutputPin`." -#: src/bare-metal/microcontrollers/hals.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md msgid "" -"HAL crates exist for many Cortex-M and RISC-V devices, including various " -"STM32, GD32, nRF, NXP, MSP430, AVR and PIC microcontrollers." +"Alternatively: Domain is high-risk for naive implementations of a trait (such as " +"cryptography)." msgstr "" -"Les caisses HAL existent pour de nombreux appareils Cortex-M et RISC-V, y " -"compris divers STM32, GD32, nRF, NXP, Microcontrôleurs MSP430, AVR et PIC." - -#: src/bare-metal/microcontrollers/board-support.md -#, fuzzy -msgid "Board support crates" -msgstr "Caisses support planche" -#: src/bare-metal/microcontrollers/board-support.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md msgid "" -"Board support crates provide a further level of wrapping for a specific " -"board for convenience." +"The mechanism we use to do this is restricting access to a supertrait, preventing " +"downstream users from being able to implement that trait for their types." msgstr "" -"Les caisses de support de planche offrent un niveau supplémentaire " -"d'emballage pour une planche spécifique pour plus de commodité." -#: src/bare-metal/microcontrollers/board-support.md -#, fuzzy -msgid "" -"In this case the board support crate is just providing more useful names, " -"and a bit of initialisation." +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "Why not just use enums?" msgstr "" -"Dans ce cas, la caisse de support de carte fournit simplement des noms plus " -"utiles, et un peu de initialisation." -#: src/bare-metal/microcontrollers/board-support.md -#, fuzzy -msgid "" -"The crate may also include drivers for some on-board devices outside of the " -"microcontroller itself." +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "Enums expose implementation details – \"this works for these types\"." msgstr "" -"La caisse peut également inclure des pilotes pour certains périphériques " -"embarqués en dehors du microcontrôleur lui-même." -#: src/bare-metal/microcontrollers/board-support.md -#, fuzzy -msgid "`microbit-v2` includes a simple driver for the LED matrix." -msgstr "`microbit-v2` inclut un pilote simple pour la matrice LED." +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "Users need to use variant constructors of an enum to use the API." +msgstr "" -#: src/bare-metal/microcontrollers/type-state.md -#, fuzzy -msgid "The type state pattern" -msgstr "Le modèle d'état de type" +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "" +"Users can use the enum as a type in their own code, and when the enum changes users need " +"to update their code to match those changes." +msgstr "" -#: src/bare-metal/microcontrollers/type-state.md -msgid "// let gpio0_01_again = gpio0.p0_01; // Error, moved.\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/sealed-traits.md +msgid "" +"Enums require branching on variants, whereas sealed traits lets the compile specify " +"monomorphized functions for each type." msgstr "" -#: src/bare-metal/microcontrollers/type-state.md -msgid "// pin_input.is_high(); // Error, moved.\n" +#: src/idiomatic/polymorphism/from-oop-to-rust/sealing-with-enums.md +msgid "" +"Motivation: API is designed around a specific list of types that are valid for it, users " +"of the API are not expected to extend it." msgstr "" -#: src/bare-metal/microcontrollers/type-state.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealing-with-enums.md msgid "" -"Pins don't implement `Copy` or `Clone`, so only one instance of each can " -"exist. Once a pin is moved out of the port struct nobody else can take it." +"Enums in Rust are _algebraic data types_, we can define different structures for each " +"variant." msgstr "" -"Les broches n'implémentent pas `Copy` ou `Clone`, donc une seule instance de " -"chacun peut exister. Une fois qu'une broche est déplacé hors de la structure " -"du port, personne d'autre ne peut le prendre." -#: src/bare-metal/microcontrollers/type-state.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealing-with-enums.md msgid "" -"Changing the configuration of a pin consumes the old pin instance, so you " -"can’t keep use the old instance afterwards." +"For some domains, this might be enough polymorphism for the problem. Experiment and see " +"what works, what solutions seem to make more sense." msgstr "" -"La modification de la configuration d'une broche consomme l'ancienne " -"instance de broche, vous ne pouvez donc pas continuer à utiliser l'ancienne " -"exemple par la suite." -#: src/bare-metal/microcontrollers/type-state.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealing-with-enums.md msgid "" -"The type of a value indicates the state that it is in: e.g. in this case, " -"the configuration state of a GPIO pin. This encodes the state machine into " -"the type system, and ensures that you don't try to use a pin in a certain " -"way without properly configuring it first. Illegal state transitions are " -"caught at compile time." +"By having the user-facing part of the API refer to an enum, users know what types are " +"valid inputs and can construct those types using the available methods to do so." msgstr "" -"Le type d'une valeur indique l'état dans lequel elle se trouve : par ex. " -"dans ce cas, l'état de la configuration d'une broche GPIO. Cela encode la " -"machine d'état dans le système de type et garantit que vous ne essayez " -"d'utiliser une broche d'une certaine manière sans la configurer correctement " -"au préalable. État illégal les transitions sont interceptées au moment de la " -"compilation." -#: src/bare-metal/microcontrollers/type-state.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sealing-with-enums.md msgid "" -"You can call `is_high` on an input pin and `set_high` on an output pin, but " -"not vice-versa." +"If the types that make up the enum have invariants that the API internally upholds, and " +"the only way users can construct those types is through constructors that build and " +"maintain those invariants, then you can be sure that inputs to a generic method uphold " +"their invariants." msgstr "" -"Vous pouvez appeler `is_high` sur une broche d'entrée et `set_high` sur une " -"broche de sortie, mais pas l'inverse." -#: src/bare-metal/microcontrollers/type-state.md -#, fuzzy -msgid "Many HAL crates follow this pattern." -msgstr "De nombreuses caisses HAL suivent ce modèle." +#: src/idiomatic/polymorphism/from-oop-to-rust/sealing-with-enums.md +msgid "" +"If the types that make up the enum instead are types the user can freely construct, then " +"sanitisation and interpretation may need to be taken into consideration." +msgstr "" -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/sticking-with-traits.md +msgid "// Crate A\n" +msgstr "" + +#: src/idiomatic/polymorphism/from-oop-to-rust/sticking-with-traits.md +msgid "// Crate B, depends on A\n" +msgstr "" + +#: src/idiomatic/polymorphism/from-oop-to-rust/sticking-with-traits.md msgid "" -"The [`embedded-hal`](https://crates.io/crates/embedded-hal) crate provides a " -"number of traits covering common microcontroller peripherals." +"We've already covered normal traits at length, but compared to enums and sealed traits " +"they allow users to extend an API by implementing the behavior that API asks of them." msgstr "" -"La caisse [`embedded-hal`](https://crates.io/crates/embedded-hal) fournit un " -"certain nombre de caractéristiques couvrant les périphériques de " -"microcontrôleur courants." -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy -msgid "GPIO" -msgstr "GPIO" +#: src/idiomatic/polymorphism/from-oop-to-rust/sticking-with-traits.md +msgid "" +"This ability for users to extend is powerful for a number of domains, from serialization " +"to abstract representations of hardware and type safe linear algebra." +msgstr "" -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy -msgid "ADC" -msgstr "ADC" +#: src/idiomatic/polymorphism/from-oop-to-rust/sticking-with-traits.md +msgid "" +"If a trait is exposed publicly in a crate, a user depending on that crate can implement " +"that trait for types they define." +msgstr "" -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy -msgid "I2C, SPI, UART, CAN" -msgstr "I2C, SPI, UART, PEUT" +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "// Problem: implementing a GUI API\n" +msgstr "" -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy -msgid "RNG" -msgstr "GNA" +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "// Question: What's the minimum useful behavior for a drawing API?\n" +msgstr "" -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy -msgid "Timers" -msgstr "Minuteries" +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "\"arc of radius \"" +msgstr "" -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy -msgid "Watchdogs" -msgstr "Chiens de garde" +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "// Question: What's a good API for users?\n" +msgstr "" -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md msgid "" -"Other crates then implement [drivers](https://github.com/rust-embedded/" -"awesome-embedded-rust#driver-crates) in terms of these traits, e.g. an " -"accelerometer driver might need an I2C or SPI bus implementation." +"You're already adept at breaking down problems, but you're likely used to reaching for " +"OOP-style methods." msgstr "" -"D'autres caisses mettent alors en œuvre [pilotes](https://github.com/rust-" -"embedded/awesome-embedded-rust#driver-crates) en ce qui concerne ces traits, " -"par ex. un pilote d'accéléromètre peut nécessiter une implémentation de bus " -"I2C ou SPI." -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md msgid "" -"There are implementations for many microcontrollers, as well as other " -"platforms such as Linux on Raspberry Pi." +"This isn't a drastic change, it just requires re-ordering the way you approach things." msgstr "" -"Il existe des implémentations pour de nombreux microcontrôleurs, ainsi que " -"pour d'autres plates-formes telles que Linux sur Tarte aux framboises." -#: src/bare-metal/microcontrollers/embedded-hal.md -#, fuzzy -msgid "" -"There is work in progress on an `async` version of `embedded-hal`, but it " -"isn't stable yet." +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "Try to solve the problem with either Generics & Traits or Enums first." msgstr "" -"Il y a des travaux en cours sur une version `async` de `embedded-hal`, mais " -"ce n'est pas encore stable." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md msgid "" -"[probe-rs](https://probe.rs/) is a handy toolset for embedded debugging, " -"like OpenOCD but better integrated." +"Does the problem require a specific set of types? An enum may be the cleanest way of " +"solving this problem." msgstr "" -"[probe-rs](https://probe.rs/) est un ensemble d'outils pratique pour le " -"débogage intégré, comme OpenOCD mais en mieux intégré." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md msgid "" -"SWD (Serial Wire Debug) and JTAG via CMSIS-DAP, ST-Link and J-Link probes" -msgstr " et JTAG via les sondes CMSIS-DAP, ST-Link et J-Link" +"Does the problem really care about the specifics of the types involved, or can behavior " +"be focused on?" +msgstr "" -#: src/bare-metal/microcontrollers/probe-rs.md -msgid "GDB stub and Microsoft DAP (Debug Adapter Protocol) server" +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "" +"Organize your problem solving around finding a minimum viable amount of knowledge to " +"implement something." msgstr "" -#: src/bare-metal/microcontrollers/probe-rs.md -msgid "Cargo integration" +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "Does a trait already exist for this use case? If so, use it!" msgstr "" -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md msgid "" -"`cargo-embed` is a cargo subcommand to build and flash binaries, log RTT " -"(Real Time Transfers) output and connect GDB. It's configured by an `Embed." -"toml` file in your project directory." +"If you really do need heterogeneous collections, use them! They exist in Rust as a tool " +"for a reason." msgstr "" -" et connectez GDB. Il est configuré par un Fichier `Embed.toml` dans votre " -"répertoire de projet." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md msgid "" -"[CMSIS-DAP](https://arm-software.github.io/CMSIS_5/DAP/html/index.html) is " -"an Arm standard protocol over USB for an in-circuit debugger to access the " -"CoreSight Debug Access Port of various Arm Cortex processors. It's what the " -"on-board debugger on the BBC micro:bit uses." +"Be aware of the XY problem: a problem may seem most easily addressable by one solution, " +"but it might not tackle the root cause and could lead to new difficult problems popping " +"up in the future." msgstr "" -"[CMSIS-DAP](https://arm-software.github.io/CMSIS_5/DAP/html/index.html) est " -"une norme Arm protocole sur USB pour un débogueur en circuit pour accéder au " -"port d'accès de débogage CoreSight de divers Processeurs Arm Cortex. C'est " -"ce que le débogueur embarqué sur le BBC micro:bit utilise." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md msgid "" -"ST-Link is a range of in-circuit debuggers from ST Microelectronics, J-Link " -"is a range from SEGGER." +"That is, be certain that dynamic dispatch with trait objects is what you need before you " +"commit to using them." msgstr "" -"ST-Link est une gamme de débogueurs en circuit de ST Microelectronics, J-" -"Link est une gamme de SEGER." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy -msgid "" -"The Debug Access Port is usually either a 5-pin JTAG interface or 2-pin " -"Serial Wire Debug." +#: src/idiomatic/polymorphism/from-oop-to-rust/problem-solving.md +msgid "Be certain that traits are what you need before you commit to using them." msgstr "" -"Le port d'accès au débogage est généralement une interface JTAG à 5 broches " -"ou un débogage de fil série à 2 broches." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/unsafe-deep-dive/welcome.md +msgid "IMPORTANT: THIS MODULE IS IN AN EARLY STAGE OF DEVELOPMENT" +msgstr "" + +#: src/unsafe-deep-dive/welcome.md msgid "" -"probe-rs is a library which you can integrate into your own tools if you " -"want to." +"Please do not consider this module of Comprehensive Rust to be complete. With that in " +"mind, your feedback, comments, and especially your concerns, are very welcome." msgstr "" -"probe-rs est une bibliothèque que vous pouvez intégrer dans vos propres " -"outils si vous le souhaitez." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/unsafe-deep-dive/welcome.md msgid "" -"The [Microsoft Debug Adapter Protocol](https://microsoft.github.io/debug-" -"adapter-protocol/) lets VSCode and other IDEs debug code running on any " -"supported microcontroller." +"To comment on this module's development, please use the [GitHub issue tracker](https://" +"github.com/google/comprehensive-rust/issues)." msgstr "" -"Le \\[protocole de l'adaptateur de débogage Microsoft\\] (https://microsoft." -"github.io/debug-adapter-protocol/) permet VSCode et d'autres IDE déboguent " -"le code s'exécutant sur n'importe quel microcontrôleur pris en charge." -#: src/bare-metal/microcontrollers/probe-rs.md +#: src/unsafe-deep-dive/welcome.md #, fuzzy -msgid "cargo-embed is a binary built using the probe-rs library." +msgid "Welcome to the Unsafe Rust Deep Dive" +msgstr "Bienvenue à Comprehensive Rust (le guide complet de Rust) 🦀" + +#: src/unsafe-deep-dive/welcome.md +msgid "This deep dive aims to enable you to work productively with Unsafe Rust." msgstr "" -"cargo-embed est un binaire construit à l'aide de la bibliothèque probe-rs." -#: src/bare-metal/microcontrollers/probe-rs.md -#, fuzzy +#: src/unsafe-deep-dive/welcome.md +msgid "We’ll work on three areas:" +msgstr "" + +#: src/unsafe-deep-dive/welcome.md +msgid "establishing a mental model of Unsafe Rust" +msgstr "" + +#: src/unsafe-deep-dive/welcome.md +msgid "practicing reading & writing Unsafe Rust" +msgstr "" + +#: src/unsafe-deep-dive/welcome.md +msgid "practicing code review for Unsafe Rust" +msgstr "" + +#: src/unsafe-deep-dive/welcome.md msgid "" -"RTT (Real Time Transfers) is a mechanism to transfer data between the debug " -"host and the target through a number of ringbuffers." +"The goal of this class is to teach you enough Unsafe Rust for you to be able to review " +"easy cases yourself, and distinguish difficult cases that need to be reviewed by more " +"experienced Unsafe Rust engineers." msgstr "" -"RTT (Real Time Transfers) est un mécanisme de transfert de données entre " -"l'hôte de débogage et la cible à travers un certain nombre de tampons " -"circulaires." -#: src/bare-metal/microcontrollers/debugging.md -#, fuzzy -msgid "_Embed.toml_:" -msgstr "Intégrer.toml :" +#: src/unsafe-deep-dive/welcome.md +msgid "Establishing a mental model of Unsafe Rust" +msgstr "" -#: src/bare-metal/microcontrollers/debugging.md -#, fuzzy -msgid "In one terminal under `src/bare-metal/microcontrollers/examples/`:" -msgstr "Dans un terminal sous `src/bare-metal/microcontrollers/examples/` :" +#: src/unsafe-deep-dive/welcome.md +msgid "what the `unsafe` keyword means" +msgstr "" -#: src/bare-metal/microcontrollers/debugging.md -#, fuzzy -msgid "In another terminal in the same directory:" -msgstr "Dans un autre terminal du même répertoire :" +#: src/unsafe-deep-dive/welcome.md +msgid "a shared vocabulary for talking about safety" +msgstr "" -#: src/bare-metal/microcontrollers/debugging.md -msgid "On gLinux or Debian:" +#: src/unsafe-deep-dive/welcome.md +msgid "a mental model of how memory works" msgstr "" -#: src/bare-metal/microcontrollers/debugging.md -#, fuzzy -msgid "In GDB, try running:" -msgstr "Dans GDB, essayez d'exécuter :" +#: src/unsafe-deep-dive/welcome.md +msgid "common patterns" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "Other projects" -msgstr "Autres projets" +#: src/unsafe-deep-dive/welcome.md +msgid "expectations for code that uses `unsafe`" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "[RTIC](https://rtic.rs/)" -msgstr "\\* [RTIC](https://rtic.rs/)" +#: src/unsafe-deep-dive/welcome.md +msgid "Practicing working with unsafe" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "\"Real-Time Interrupt-driven Concurrency\"" -msgstr "\"Concurrence pilotée par interruption en temps réel\"" +#: src/unsafe-deep-dive/welcome.md +msgid "reading and writing both code and documentation" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "" -"Shared resource management, message passing, task scheduling, timer queue" +#: src/unsafe-deep-dive/welcome.md +msgid "using unsafe APIs" msgstr "" -"Gestion des ressources partagées, transmission de messages, planification " -"des tâches, file d'attente du minuteur" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "[Embassy](https://embassy.dev/)" -msgstr "[Ambassade](https://embassy.dev/)" +#: src/unsafe-deep-dive/welcome.md +msgid "designing and implementing them" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md +#: src/unsafe-deep-dive/welcome.md #, fuzzy -msgid "`async` executors with priorities, timers, networking, USB" +msgid "Reviewing code" +msgstr "Génériques" + +#: src/unsafe-deep-dive/welcome.md +msgid "the confidence to self-review easy cases" msgstr "" -"Exécuteurs \"asynchrones\" avec priorités, minuteries, mise en réseau, USB" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "[TockOS](https://www.tockos.org/documentation/getting-started)" -msgstr "[TockOS](https://www.tockos.org/documentation/getting-started)" +#: src/unsafe-deep-dive/welcome.md +msgid "the knowledge to detect difficult cases" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy +#: src/unsafe-deep-dive/welcome.md msgid "" -"Security-focused RTOS with preemptive scheduling and Memory Protection Unit " -"support" +"“We'll be using a spiral model of teaching. This means that we revisit the same topic " +"multiple times with increasing depth.”" msgstr "" -"RTOS axé sur la sécurité avec planification préemptive et prise en charge de " -"l'unité de protection de la mémoire" - -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "[Hubris](https://hubris.oxide.computer/)" -msgstr "[Hubris](https://hubris.oxide.computer/)" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy +#: src/unsafe-deep-dive/welcome.md msgid "" -"Microkernel RTOS from Oxide Computer Company with memory protection, " -"unprivileged drivers, IPC" +"A round of introductions is useful, particularly if the class participants don't know " +"each other well. Ask everyone to introduce themselves, noting down any particular goals " +"for the class." msgstr "" -"Microkernel RTOS d'Oxide Computer Company avec protection de la mémoire, " -"pilotes non privilégiés, IPC" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "[Bindings for FreeRTOS](https://github.com/lobaro/FreeRTOS-rust)" -msgstr "[Liaisons pour FreeRTOS](https://github.com/lobaro/FreeRTOS-rust)" +#: src/unsafe-deep-dive/welcome.md +msgid "Who are you?" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "" -"Some platforms have `std` implementations, e.g. [esp-idf](https://esp-rs." -"github.io/book/overview/using-the-standard-library.html)." +#: src/unsafe-deep-dive/welcome.md +msgid "What are you working on?" msgstr "" -"Certaines plates-formes ont des implémentations \"std\", par ex. [esp-idf]" -"(https://esp-rs.github.io/book/overview/using-the-standard-library.html)." -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "RTIC can be considered either an RTOS or a concurrency framework." -msgstr "RTIC peut être considéré comme un RTOS ou un cadre de concurrence." +#: src/unsafe-deep-dive/welcome.md +msgid "What are your goals for this class?" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "It doesn't include any HALs." -msgstr "Il n'inclut aucun HAL." +#: src/unsafe-deep-dive/setup.md +msgid "Setting Up" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md +#: src/unsafe-deep-dive/setup.md #, fuzzy +msgid "Local Rust installation" +msgstr "Installation" + +#: src/unsafe-deep-dive/setup.md msgid "" -"It uses the Cortex-M NVIC (Nested Virtual Interrupt Controller) for " -"scheduling rather than a proper kernel." +"You should have a Rust compiler installed that supports the 2024 edition of the language, " +"which is any version of rustc higher than 1.84." msgstr "" -"Il utilise le Cortex-M NVIC (Nested Virtual Interrupt Controller) pour la " -"planification plutôt qu'un noyau approprié." -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy -msgid "Cortex-M only." -msgstr "Cortex-M uniquement." +#: src/unsafe-deep-dive/setup.md +msgid "(Optional) Create a local instance of the course" +msgstr "" -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy +#: src/unsafe-deep-dive/setup.md msgid "" -"Google uses TockOS on the Haven microcontroller for Titan security keys." +"```console\n" +"$ git clone --depth=1 https://github.com/google/comprehensive-rust.git\n" +"Cloning into 'comprehensive-rust'...\n" +"...\n" +"$ cd comprehensive-rust\n" +"$ cargo install-tools\n" +"...\n" +"$ cargo serve # then open http://127.0.0.1:3000/ in a browser\n" +"```" msgstr "" -"Google utilise TockOS sur le microcontrôleur Haven pour les clés de sécurité " -"Titan." -#: src/bare-metal/microcontrollers/other-projects.md -#, fuzzy +#: src/unsafe-deep-dive/setup.md msgid "" -"FreeRTOS is mostly written in C, but there are Rust bindings for writing " -"applications." +"Ask everyone to confirm that everyone is able to execute `rustc` with a version newer " +"than 1.87." msgstr "" -"FreeRTOS est principalement écrit en C, mais il existe des liaisons Rust " -"pour écrire des applications." -#: src/exercises/bare-metal/morning.md -#, fuzzy -msgid "" -"We will read the direction from an I2C compass, and log the readings to a " -"serial port." +#: src/unsafe-deep-dive/setup.md +msgid "For those people who do not, tell them that we'll resolve that in the break." msgstr "" -"Nous lirons la direction à partir d'une boussole I2C et enregistrerons les " -"lectures sur un port série." -#: src/exercises/bare-metal/morning.md src/exercises/concurrency/morning.md -#, fuzzy +#: src/unsafe-deep-dive/introduction.md msgid "" -"After looking at the exercises, you can look at the [solutions](solutions-" -"morning.md) provided." +"We'll start our course by creating a shared understanding of what Unsafe Rust is and what " +"the `unsafe` keyword does." msgstr "" -"Après avoir regardé l'exercice, vous pouvez regarder la [solution](solutions-" -"afternoon.md) fournie." -#: src/exercises/bare-metal/compass.md -#, fuzzy -msgid "" -"We will read the direction from an I2C compass, and log the readings to a " -"serial port. If you have time, try displaying it on the LEDs somehow too, or " -"use the buttons somehow." +#: src/unsafe-deep-dive/introduction.md src/unsafe-deep-dive/pinning.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "Outline" msgstr "" -"Nous lirons la direction à partir d'une boussole I2C et enregistrerons les " -"lectures sur un port série. Si tu as temps, essayez de l'afficher sur les " -"LED d'une manière ou d'une autre, ou utilisez les boutons d'une manière ou " -"d'une autre." -#: src/exercises/bare-metal/compass.md -#, fuzzy -msgid "Hints:" -msgstr "Astuces:" +#: src/unsafe-deep-dive/introduction.md +msgid "25 minutes" +msgstr "" -#: src/exercises/bare-metal/compass.md -#, fuzzy -msgid "" -"Check the documentation for the [`lsm303agr`](https://docs.rs/lsm303agr/" -"latest/lsm303agr/) and [`microbit-v2`](https://docs.rs/microbit-v2/latest/" -"microbit/) crates, as well as the [micro:bit hardware](https://tech.microbit." -"org/hardware/)." +#: src/unsafe-deep-dive/introduction/definition.md +msgid "“Unsafe Rust is a superset of Safe Rust.”" msgstr "" -"Consultez la documentation du [`lsm303agr`](https://docs.rs/lsm303agr/latest/" -"lsm303agr/) et [`microbit-v2`](https://docs.rs/microbit-v2/latest/microbit/) " -"caisses, ainsi que les [matériel micro:bit](https://tech.microbit.org/" -"hardware/)." -#: src/exercises/bare-metal/compass.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/definition.md msgid "" -"The LSM303AGR Inertial Measurement Unit is connected to the internal I2C bus." +"“Unsafe Rust adds extra capabilities, such as allowing you to dereference raw pointers " +"and call functions that can break Rust’s safety guarantees if called incorrectly.”" msgstr "" -"La centrale de mesure inertielle LSM303AGR est connectée au bus interne I2C." -#: src/exercises/bare-metal/compass.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/definition.md +msgid "“These extra capabilities are referred to as _unsafe operations_.”" +msgstr "" + +#: src/unsafe-deep-dive/introduction/definition.md msgid "" -"TWI is another name for I2C, so the I2C master peripheral is called TWIM." +"“Unsafe operations provide the foundation that the Rust standard library is built on. For " +"example, without the ability to dereference a raw pointer, it would be impossible to " +"implement `Vec` or `Box`.”" msgstr "" -"TWI est un autre nom pour I2C, donc le périphérique maître I2C s'appelle " -"TWIM." -#: src/exercises/bare-metal/compass.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/definition.md msgid "" -"The LSM303AGR driver needs something implementing the `embedded_hal::" -"blocking::i2c::WriteRead` trait. The [`microbit::hal::Twim`](https://docs.rs/" -"microbit-v2/latest/microbit/hal/struct.Twim.html) struct implements this." +"“The compiler will still assist you while writing Unsafe Rust. Borrow checking and type " +"safety still apply. Unsafe operations have their own rules, which we’ll learn about in " +"this class.”" msgstr "" -"Le pilote LSM303AGR a besoin de quelque chose implémentant `embedded_hal::" -"blocking::i2c::WriteRead` trait. Le [`microbit::hal::Twim`](https://docs.rs/" -"microbit-v2/latest/microbit/hal/struct.Twim.html) structure implémente cela." -#: src/exercises/bare-metal/compass.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/definition.md msgid "" -"You have a [`microbit::Board`](https://docs.rs/microbit-v2/latest/microbit/" -"struct.Board.html) struct with fields for the various pins and peripherals." +"The unsafe operations from the [Rust Reference](https://doc.rust-lang.org/reference/" +"unsafety.html) (Avoid spending too much time):" msgstr "" -"Vous avez un [`microbit::Board`](https://docs.rs/microbit-v2/latest/microbit/" -"struct.Board.html) structure avec des champs pour les différentes broches et " -"périphériques." -#: src/exercises/bare-metal/compass.md +#: src/unsafe-deep-dive/introduction/definition.md +msgid "The following language level features cannot be used in the safe subset of Rust:" +msgstr "" + +#: src/unsafe-deep-dive/introduction/definition.md #, fuzzy -msgid "" -"You can also look at the [nRF52833 datasheet](https://infocenter.nordicsemi." -"com/pdf/nRF52833_PS_v1.5.pdf) if you want, but it shouldn't be necessary for " -"this exercise." +msgid "Dereferencing a raw pointer." +msgstr "Déréférencer les pointeurs bruts." + +#: src/unsafe-deep-dive/introduction/definition.md +msgid "Reading or writing a mutable or unsafe external static variable." msgstr "" -"Vous pouvez également consulter le [fiche technique nRF52833](https://" -"infocenter.nordicsemi.com/pdf/nRF52833_PS_v1.5.pdf) si vous le souhaitez, " -"mais cela ne devrait pas être nécessaire pour cet exercice." -#: src/exercises/bare-metal/compass.md +#: src/unsafe-deep-dive/introduction/definition.md +msgid "Accessing a field of a union, other than to assign to it." +msgstr "" + +#: src/unsafe-deep-dive/introduction/definition.md #, fuzzy +msgid "Calling an `unsafe` function." +msgstr "Appel de fonctions non sécurisées" + +#: src/unsafe-deep-dive/introduction/definition.md msgid "" -"Download the [exercise template](../../comprehensive-rust-exercises.zip) and " -"look in the `compass` directory for the following files." +"Calling a safe function marked with a `` from a function that does not " +"have a `` attribute enabling the same features." msgstr "" -"Téléchargez le \\[modèle d'exercice\\] (../../comprehensive-rust-exercises." -"zip) et regardez dans la `boussole` répertoire pour les fichiers suivants." -#: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md +#: src/unsafe-deep-dive/introduction/definition.md #, fuzzy -msgid "_src/main.rs_:" -msgstr "`src/main.rs` :" +msgid "Implementing an unsafe trait." +msgstr "Implémentation de traits non sécurisés" -#: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_Cargo.toml_ (you shouldn't need to change this):" -msgstr "`Cargo.toml` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/introduction/definition.md +msgid "Declaring an extern block." +msgstr "" -#: src/exercises/bare-metal/compass.md -#, fuzzy -msgid "_Embed.toml_ (you shouldn't need to change this):" -msgstr "`Embed.toml` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/introduction/definition.md +msgid "Applying an unsafe attribute to an item." +msgstr "" -#: src/exercises/bare-metal/compass.md src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_.cargo/config.toml_ (you shouldn't need to change this):" +#: src/unsafe-deep-dive/introduction/purpose.md +msgid "Why the unsafe keyword exists" msgstr "" -"`.cargo/config.toml` (vous ne devriez pas avoir besoin de le modifier) :" -#: src/exercises/bare-metal/compass.md -#, fuzzy -msgid "See the serial output on Linux with:" -msgstr "Voir la sortie série sur Linux avec :" +#: src/unsafe-deep-dive/introduction/purpose.md +msgid "Rust ensures safety" +msgstr "" -#: src/exercises/bare-metal/compass.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/purpose.md +msgid "But there are limits to what the compiler can do" +msgstr "" + +#: src/unsafe-deep-dive/introduction/purpose.md +msgid "The unsafe keyword allows programmers to assume responsibility for Rust’s rules" +msgstr "" + +#: src/unsafe-deep-dive/introduction/purpose.md +msgid "“A fundamental goal of Rust is to ensure memory safety.”" +msgstr "" + +#: src/unsafe-deep-dive/introduction/purpose.md msgid "" -"Or on Mac OS something like (the device name may be slightly different):" +"“But, there are limits. Some safety considerations cannot be expressed in a programming " +"language. Even if they could be, there are limits to what the Rust compiler can control.”" msgstr "" -"Ou sur Mac OS quelque chose comme (le nom de l'appareil peut être légèrement " -"différent) :" -#: src/exercises/bare-metal/compass.md -#, fuzzy -msgid "Use Ctrl+A Ctrl+Q to quit picocom." -msgstr "Utilisez Ctrl+A Ctrl+Q pour quitter picocom." +#: src/unsafe-deep-dive/introduction/purpose.md +msgid "" +"“The `unsafe` keyword shifts the burden of upholding Rust’s rules from the compiler to " +"the programmer.”" +msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "Bare Metal Rust Morning Exercise" -msgstr "Exercice du matin avec Rust sur bare metal" +#: src/unsafe-deep-dive/introduction/purpose.md +msgid "" +"“When you see the `unsafe` keyword, you are seeing responsibility shift from the compiler " +"to the programmer." +msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -#, fuzzy -msgid "([back to exercise](compass.md))" -msgstr "([retour à l'exercice](compass.md))" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "The unsafe keyword has two roles" +msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "// Configure serial port.\n" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "_Creating_ APIs with safety considerations" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "// Use the system timer as a delay provider.\n" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "unsafe functions: `unsafe fn get_unchecked(&self) { ... }`" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "// Set up the I2C controller and Inertial Measurement Unit.\n" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "unsafe traits: `unsafe trait Send {}`" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "\"Setting up IMU...\"" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "_Using_ APIs with safety considerations" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "// Set up display and timer.\n" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "invoking built-in unsafe operators: `unsafe { *ptr }`" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "\"Ready.\"" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "calling unsafe functions: `unsafe { x.get_unchecked() }`" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "// Read compass data and log it to the serial port.\n" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "implementing unsafe traits: `unsafe impl Send for Counter {}`" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md -msgid "\"{},{},{}\\t{},{},{}\"" +#: src/unsafe-deep-dive/introduction/two-roles.md +#, fuzzy +msgid "Two roles:" +msgstr "Deux binaires" + +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "" +"**Creating** APIs with safety considerations and defining what needs to be considered" msgstr "" -#: src/exercises/bare-metal/solutions-morning.md +#: src/unsafe-deep-dive/introduction/two-roles.md msgid "" -"// If button A is pressed, switch to the next mode and briefly blink all " -"LEDs\n" -" // on.\n" +"**Using** APIs with safety considerations and confirming that the consideration has been " +"made" msgstr "" -#: src/bare-metal/aps.md -#, fuzzy -msgid "Application processors" -msgstr "Processeurs d'application" +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "Creating APIs with safety considerations" +msgstr "" -#: src/bare-metal/aps.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/two-roles.md msgid "" -"So far we've talked about microcontrollers, such as the Arm Cortex-M series. " -"Now let's try writing something for Cortex-A. For simplicity we'll just work " -"with QEMU's aarch64 ['virt'](https://qemu-project.gitlab.io/qemu/system/arm/" -"virt.html) board." +"“First, the unsafe keyword enables you to create APIs that can break Rust’s safety " +"guarantees. Specifically, you need to use the unsafe keyword when defining unsafe " +"functions and unsafe traits." msgstr "" -"Jusqu'à présent, nous avons parlé de microcontrôleurs, tels que la série Arm " -"Cortex-M. Essayons maintenant d'écrire quelque chose pour Cortex-A. Pour " -"plus de simplicité, nous allons simplement travailler avec aarch64 de QEMU " -"['virt'](https://qemu-project.gitlab.io/qemu/system/arm/virt.html)." -#: src/bare-metal/aps.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/two-roles.md msgid "" -"Broadly speaking, microcontrollers don't have an MMU or multiple levels of " -"privilege (exception levels on Arm CPUs, rings on x86), while application " -"processors do." +"“When used in this role, you’re informing users of your API that they need to be careful.”" msgstr "" -"D'une manière générale, les microcontrôleurs n'ont pas de MMU ou plusieurs " -"niveaux de privilège (exception niveaux sur les processeurs Arm, sonne sur " -"x86), contrairement aux processeurs d'application." -#: src/bare-metal/aps.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/two-roles.md msgid "" -"QEMU supports emulating various different machines or board models for each " -"architecture. The 'virt' board doesn't correspond to any particular real " -"hardware, but is designed purely for virtual machines." +"“The creator of the API should communicate what care needs to be taken. Unsafe APIs are " +"not complete without documentation about safety requirements. Callers need to know that " +"they have satisfied any requirements, and that’s impossible if they’re not written down.”" msgstr "" -"QEMU prend en charge l'émulation de différentes machines ou modèles de " -"cartes pour chaque architecture. Le La carte 'virt' ne correspond à aucun " -"matériel réel particulier, mais est conçue uniquement pour machines " -"virtuelles." -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "Using APIs with safety considerations" +msgstr "" + +#: src/unsafe-deep-dive/introduction/two-roles.md msgid "" -"Before we can start running Rust code, we need to do some initialisation." +"“The unsafe keyword adopts its other role, using APIs, when it is used nearby to a curly " +"brace." msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/two-roles.md msgid "" -"```armasm\n" -".section .init.entry, \"ax\"\n" -".global entry\n" -"entry:\n" -" /*\n" -" * Load and apply the memory management configuration, ready to enable " -"MMU and\n" -" * caches.\n" -" */\n" -" adrp x30, idmap\n" -" msr ttbr0_el1, x30\n" -"\n" -" mov_i x30, .Lmairval\n" -" msr mair_el1, x30\n" -"\n" -" mov_i x30, .Ltcrval\n" -" /* Copy the supported PA range into TCR_EL1.IPS. */\n" -" mrs x29, id_aa64mmfr0_el1\n" -" bfi x30, x29, #32, #4\n" -"\n" -" msr tcr_el1, x30\n" -"\n" -" mov_i x30, .Lsctlrval\n" -"\n" -" /*\n" -" * Ensure everything before this point has completed, then invalidate " -"any\n" -" * potentially stale local TLB entries before they start being used.\n" -" */\n" -" isb\n" -" tlbi vmalle1\n" -" ic iallu\n" -" dsb nsh\n" -" isb\n" -"\n" -" /*\n" -" * Configure sctlr_el1 to enable MMU and cache and don't proceed until " -"this\n" -" * has completed.\n" -" */\n" -" msr sctlr_el1, x30\n" -" isb\n" -"\n" -" /* Disable trapping floating point access in EL1. */\n" -" mrs x30, cpacr_el1\n" -" orr x30, x30, #(0x3 << 20)\n" -" msr cpacr_el1, x30\n" -" isb\n" -"\n" -" /* Zero out the bss section. */\n" -" adr_l x29, bss_begin\n" -" adr_l x30, bss_end\n" -"0: cmp x29, x30\n" -" b.hs 1f\n" -" stp xzr, xzr, [x29], #16\n" -" b 0b\n" -"\n" -"1: /* Prepare the stack. */\n" -" adr_l x30, boot_stack_end\n" -" mov sp, x30\n" -"\n" -" /* Set up exception vector. */\n" -" adr x30, vector_table_el1\n" -" msr vbar_el1, x30\n" -"\n" -" /* Call into Rust code. */\n" -" bl main\n" -"\n" -" /* Loop forever waiting for interrupts. */\n" -"2: wfi\n" -" b 2b\n" -"```" +"“When used in this role, the unsafe keyword means that the author has been careful. They " +"have verified that the code is safe and is providing an assurance to others.”" +msgstr "" + +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "" +"“Unsafe blocks are most common. They allow you to invoke unsafe functions that have been " +"defined using the first role." +msgstr "" + +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "" +"“Unsafe blocks also allow you to perform operations which the compiler knows are unsafe, " +"such as dereferencing a raw pointer.”" +msgstr "" + +#: src/unsafe-deep-dive/introduction/two-roles.md +msgid "“You might also see the unsafe keyword being used to implement unsafe traits." msgstr "" -#: src/bare-metal/aps/entry-point.md -msgid "" -"This is the same as it would be for C: initialising the processor state, " -"zeroing the BSS, and setting up the stack pointer." +#: src/unsafe-deep-dive/introduction/warm-up.md +msgid "Warm-up examples" msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up.md +msgid "Examples to demonstrate:" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up.md +msgid "using an [unsafe block](warm-up/unsafe-block.md) (`unsafe { ... }`)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up.md +msgid "defining an [unsafe function](warm-up/unsafe-fn.md) (`unsafe fn`)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up.md +msgid "[implementing](warm-up/unsafe-impl.md) an unsafe trait (`unsafe impl { ... }`)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up.md +msgid "defining an [unsafe trait](warm-up/unsafe-trait.md) (`unsafe trait`)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md msgid "" -"The BSS (block starting symbol, for historical reasons) is the part of the " -"object file which containing statically allocated variables which are " -"initialised to zero. They are omitted from the image, to avoid wasting space " -"on zeroes. The compiler assumes that the loader will take care of zeroing " -"them." +"Walk through the code. Confirm that the audience is familiar with the dereference " +"operator." msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md +msgid "Attempt to compile the code, trigger the compiler error." +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md +msgid "Add the unsafe block:" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md +msgid "Prompt audience for a code review. Guide learners towards adding a safety comment." +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md +msgid "Add the safety comment:" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md +msgid "// SAFETY: `i` must be within 0..numbers.len()\n" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-block.md +#: src/unsafe-deep-dive/safety-preconditions/references.md +#: src/unsafe-deep-dive/ffi/c-library-example.md +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +#, fuzzy +msgid "_Suggested Solution_" +msgstr "Solutions" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md msgid "" -"The BSS may already be zeroed, depending on how memory is initialised and " -"the image is loaded, but we zero it to be sure." +"/// Convert a nullable pointer to a reference.\n" +"///\n" +"/// Returns `None` when `p` is null, otherwise wraps `val` in `Some`.\n" msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +msgid "// SAFETY: `ptr` is non-null\n" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +msgid "“This looks as though it’s safe code, however it actually requires an unsafe block.”" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +msgid "Highlight the dereference operation, i.e. `*p` within the unsafe block." +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md msgid "" -"We need to enable the MMU and cache before reading or writing any memory. If " -"we don't:" +"“Callers must ensure that the `ptr` is null, or that it may be converted to a reference." msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +msgid "“It may be counter-intuitive, but many pointers cannot be converted to references." +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md msgid "" -"Unaligned accesses will fault. We build the Rust code for the `aarch64-" -"unknown-none` target which sets `+strict-align` to prevent the compiler " -"generating unaligned accesses, so it should be fine in this case, but this " -"is not necessarily the case in general." +"“Among other issues, a pointer could be created that points to some arbitrary bits rather " +"than a valid value. That’s not something that Rust allows and something that this " +"function needs to protect itself against." msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md msgid "" -"If it were running in a VM, this can lead to cache coherency issues. The " -"problem is that the VM is accessing memory directly with the cache disabled, " -"while the host has cacheable aliases to the same memory. Even if the host " -"doesn't explicitly access the memory, speculative accesses can lead to cache " -"fills, and then changes from one or the other will get lost when the cache " -"is cleaned or the VM enables the cache. (Cache is keyed by physical address, " -"not VA or IPA.)" +"“So we, as API designers, have two paths. We can either try to assume responsibility for " +"guarding against invalid inputs, or we can shift that responsibility to the caller with " +"the unsafe keyword.”" msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md msgid "" -"For simplicity, we just use a hardcoded pagetable (see `idmap.S`) which " -"identity maps the first 1 GiB of address space for devices, the next 1 GiB " -"for DRAM, and another 1 GiB higher up for more devices. This matches the " -"memory layout that QEMU uses." +"“The first path is a difficult one. We’re accepting a generic type T, which is all " +"possible types that implement Sized. That’s a lot of types!" msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +msgid "“Therefore, the second path makes more sense." +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +msgid "_Extra content (time permitting)_" +msgstr "" + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md msgid "" -"We also set up the exception vector (`vbar_el1`), which we'll see more about " -"later." +"“By the way, if you’re interested in the details of pointers and what the rules of " +"converting them to references are, the standard library has a lot of useful " +"documentation. You should also look into the source code of many of the methods on std::" +"pointer." msgstr "" -#: src/bare-metal/aps/entry-point.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md msgid "" -"All examples this afternoon assume we will be running at exception level 1 " -"(EL1). If you need to run at a different exception level you'll need to " -"modify `entry.S` accordingly." +"“For example, the `ptr_to_ref` function on this slide actually exists in the standard " +"library as the `as_mut` method on pointers.”" msgstr "" -#: src/bare-metal/aps/inline-assembly.md -#, fuzzy -msgid "Inline assembly" -msgstr "Assemblage en ligne" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-fn.md +msgid "" +"Open the documentation for [std::pointer.as_mut](https://doc.rust-lang.org/std/primitive." +"pointer.html#method.as_mut) and highlight the Safety section." +msgstr "" -#: src/bare-metal/aps/inline-assembly.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md msgid "" -"Sometimes we need to use assembly to do things that aren't possible with " -"Rust code. For example, to make an HVC (hypervisor call) to tell the " -"firmware to power off the system:" +"“Before we take a look at the code, we should double check that everyone knows what a " +"trait is. Is anyone able to explain traits for the rest of the class?" msgstr "" -"Parfois, nous devons utiliser l'assemblage pour faire des choses qui ne sont " -"pas possibles avec le code Rust. Par exemple, pour effectuer un " -#: src/bare-metal/aps/inline-assembly.md +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md msgid "" -"// Safe because this only uses the declared registers and doesn't do\n" -" // anything with memory.\n" +"“Traits are often described as a way to create shared behavior. Thinking about traits as " +"shared behavior focuses on the syntax of methods and their signatures." msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"hvc #0\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +msgid "" +"“There’s also a deeper way to think of traits: as sets of requirements. This emphasizes " +"the shared semantics of the implementing types." msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w0\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +#, fuzzy +msgid "“Can anyone explain what the `Send` and `Sync` traits are?" +msgstr "Les traits intégrés \"Envoyer\" et \"Synchroniser\" ne sont pas sûrs." + +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +msgid "If no" msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w1\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +msgid "" +"“Send and Sync relate to concurrency. There are many details, but broadly speaking, Send " +"types can be shared between threads by value. Sync types must be shared by reference." msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w2\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +msgid "" +"There are many rules to follow to ensure that it’s safe to share data across thread " +"boundaries. Those rules cannot be checked by the compiler, and therefore the code author " +"must take responsibility for upholding them." msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w3\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +msgid "Arc implements Send and Sync, therefore it’s safe for our clock to as well." msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w4\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-impl.md +msgid "" +"It may be useful to point out that the word _atomic_ has the meaning of “indivisible” or " +"“whole” from Ancient Greek, rather than the contemporary English sense of “tiny particle”." msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w5\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-trait.md +msgid "/// Indicates that the type uses 32 bits of memory.\n" msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w6\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-trait.md +msgid "“Now let’s define our own unsafe trait.”" msgstr "" -#: src/bare-metal/aps/inline-assembly.md -msgid "\"w7\"" +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-trait.md +msgid "Add the unsafe keyword and compile the code." msgstr "" -#: src/bare-metal/aps/inline-assembly.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-trait.md msgid "" -"(If you actually want to do this, use the [`smccc`](https://crates.io/crates/" -"smccc) crate which has wrappers for all these functions.)" +"“If the requirements of the trait are semantic, then your trait may not need any methods " +"at all. The documentation is essential, however.”" msgstr "" -"(Si vous voulez vraiment faire cela, utilisez le crate [`psci`](https://" -"crates.io/crates/smccc) qui contient des wrappers pour toutes ces fonctions.)" -#: src/bare-metal/aps/inline-assembly.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/warm-up/unsafe-trait.md msgid "" -"PSCI is the Arm Power State Coordination Interface, a standard set of " -"functions to manage system and CPU power states, among other things. It is " -"implemented by EL3 firmware and hypervisors on many systems." +"“Traits without methods are called marker traits. When implementing them for types, you " +"are adding information to the type system. You have now given the compiler the ability to " +"talk about types that meet the requirements described in the documentation.”" msgstr "" -"PSCI est l'interface de coordination de l'état de l'alimentation du bras, un " -"ensemble standard de fonctions pour gérer le système et les états " -"d'alimentation du processeur, entre autres. Il est implémenté par le " -"firmware EL3 et les hyperviseurs sur de nombreux systèmes." -#: src/bare-metal/aps/inline-assembly.md +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust.md +msgid "Characteristics of unsafe" +msgstr "" + +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust.md +msgid "[Dangerous](characteristics-of-unsafe-rust/dangerous.md)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust.md +msgid "[Sometimes necessary](characteristics-of-unsafe-rust/sometimes-necessary.md)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust.md +msgid "[Sometimes useful](characteristics-of-unsafe-rust/sometimes-useful.md)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/dangerous.md #, fuzzy +msgid "Unsafe is dangerous" +msgstr "Rust non sécurisé (_unsafe_)" + +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/dangerous.md msgid "" -"The `0 => _` syntax means initialise the register to 0 before running the " -"inline assembly code, and ignore its contents afterwards. We need to use " -"`inout` rather than `in` because the call could potentially clobber the " -"contents of the registers." +"“Use-after-free (UAF), integer overflows, and out of bounds (OOB) reads/writes comprise " +"90% of vulnerabilities with OOB being the most common.”" msgstr "" -"La syntaxe `0 => _` signifie initialiser le registre à 0 avant d'exécuter le " -"code assembleur en ligne, et ignorer son contenu par la suite. Nous devons " -"utiliser `inout` plutôt que `in` car l'appel pourrait potentiellement " -"encombrer le contenu des registres." -#: src/bare-metal/aps/inline-assembly.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/dangerous.md msgid "" -"This `main` function needs to be `#[no_mangle]` and `extern \"C\"` because " -"it is called from our entry point in `entry.S`." +"\\--- **Jeff Vander Stoep and Chong Zang**, Google. \"[Queue the Hardening Enhancements]" +"(https://security.googleblog.com/2019/05/queue-hardening-enhancements.html)\"" msgstr "" -"Cette fonction `main` doit être `#[no_mangle]` et `extern \"C\"` car elle " -"est appelée depuis notre point d'entrée dans `entry.S`." -#: src/bare-metal/aps/inline-assembly.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/dangerous.md msgid "" -"`_x0`–`_x3` are the values of registers `x0`–`x3`, which are conventionally " -"used by the bootloader to pass things like a pointer to the device tree. " -"According to the standard aarch64 calling convention (which is what `extern " -"\"C\"` specifies to use), registers `x0`–`x7` are used for the first 8 " -"arguments passed to a function, so `entry.S` doesn't need to do anything " -"special except make sure it doesn't change these registers." +"“The software industry has gathered lots of evidence that unsafe code is difficult to " +"write correctly and creates very serious problems.”" msgstr "" -"`_x0`–`_x3` sont les valeurs des registres `x0`–`x3`, qui sont classiquement " -"utilisés par le bootloader pour passer des choses comme un pointeur vers " -"l'arborescence des périphériques. Selon l'appel standard aarch64 convention " -"(qui est ce que `extern \"C\"` spécifie d'utiliser), les registres `x0`–`x7` " -"sont utilisés pour la 8 premiers arguments passés à une fonction, donc " -"`entry.S` n'a rien de spécial à faire sauf assurez-vous qu'il ne modifie pas " -"ces registres." -#: src/bare-metal/aps/inline-assembly.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/dangerous.md msgid "" -"Run the example in QEMU with `make qemu_psci` under `src/bare-metal/aps/" -"examples`." +"“The issues in this list are eliminated by Rust. The unsafe keyword lets them back into " +"your source code.”" msgstr "" -"Exécutez l'exemple dans QEMU avec `make qemu_psci` sous `src/bare-metal/aps/" -"examples`." -#: src/bare-metal/aps/mmio.md -#, fuzzy -msgid "Volatile memory access for MMIO" -msgstr "Accès mémoire volatile pour MMIO" +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/dangerous.md +msgid "“Be careful.”" +msgstr "" -#: src/bare-metal/aps/mmio.md -#, fuzzy -msgid "Use `pointer::read_volatile` and `pointer::write_volatile`." -msgstr "Utilisez `pointer::read_volatile` et `pointer::write_volatile`." +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md +msgid "Unsafe is sometimes necessary" +msgstr "" -#: src/bare-metal/aps/mmio.md -#, fuzzy -msgid "Never hold a reference." -msgstr "Ne détenez jamais une référence." +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md +msgid "The Rust compiler can only enforce its rules for code that it has compiled." +msgstr "" -#: src/bare-metal/aps/mmio.md -#, fuzzy -msgid "" -"`addr_of!` lets you get fields of structs without creating an intermediate " -"reference." +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md +msgid "\"{pid}\"" msgstr "" -"`addr_of!` vous permet d'obtenir des champs de structures sans créer de " -"référence intermédiaire." -#: src/bare-metal/aps/mmio.md -#, fuzzy -msgid "" -"Volatile access: read or write operations may have side-effects, so prevent " -"the compiler or hardware from reordering, duplicating or eliding them." +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md +msgid "“There are some activities that _require_ unsafe." msgstr "" -"Accès volatile : les opérations de lecture ou d'écriture peuvent avoir des " -"effets secondaires, évitez donc que le compilateur ou matériel de les " -"réorganiser, de les dupliquer ou de les supprimer." -#: src/bare-metal/aps/mmio.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md msgid "" -"Usually if you write and then read, e.g. via a mutable reference, the " -"compiler may assume that the value read is the same as the value just " -"written, and not bother actually reading memory." +"“The Rust compiler cannot verify that external functions comply with Rust's memory " +"guarantees. Therefore, invoking external functions requires an unsafe block.”" msgstr "" -"Habituellement, si vous écrivez puis lisez, par ex. via une référence " -"mutable, le compilateur peut supposer que la valeur lue est la même que la " -"valeur que vous venez d'écrire et ne vous souciez pas de lire la mémoire." -#: src/bare-metal/aps/mmio.md +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md #, fuzzy +msgid "Optional:" +msgstr "Exceptions" + +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md msgid "" -"Some existing crates for volatile access to hardware do hold references, but " -"this is unsound. Whenever a reference exist, the compiler may choose to " -"dereference it." +"“Working with the external environment often involves sharing memory. The interface that " +"computers provide is a memory address (a pointer).”" msgstr "" -"Certaines caisses existantes pour l'accès volatile au matériel contiennent " -"des références, mais ce n'est pas valable. Chaque fois qu'une référence " -"existe, le compilateur peut choisir de la déréférencer." -#: src/bare-metal/aps/mmio.md -#, fuzzy -msgid "" -"Use the `addr_of!` macro to get struct field pointers from a pointer to the " -"struct." +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md +msgid "“Here's an example that asks the Linux kernel to write to memory that we control:" msgstr "" -"Utilisez la macro `addr_of!` pour obtenir des pointeurs de champ struct à " -"partir d'un pointeur vers la struct." -#: src/bare-metal/aps/uart.md -#, fuzzy -msgid "Let's write a UART driver" -msgstr "Écrivons un pilote UART" +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md +msgid "\"{buf:?}\"" +msgstr "" -#: src/bare-metal/aps/uart.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-necessary.md msgid "" -"The QEMU 'virt' machine has a [PL011](https://developer.arm.com/" -"documentation/ddi0183/g) UART, so let's write a driver for that." +"“This FFI call reaches into the operating system to fill our buffer (`buf`). As well as " +"calling an external function, we must mark the boundary as `unsafe` because the compiler " +"cannot verify how the OS touches that memory.”" msgstr "" -"La machine QEMU 'virt' a un [PL011](https://developer.arm.com/documentation/" -"ddi0183/g) UART, écrivons donc un pilote pour cela." -#: src/bare-metal/aps/uart.md -msgid "/// Minimal driver for a PL011 UART.\n" +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-useful.md +msgid "Unsafe is sometimes useful" msgstr "" -#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -msgid "" -"/// Constructs a new instance of the UART driver for a PL011 device at the\n" -" /// given base address.\n" -" ///\n" -" /// # Safety\n" -" ///\n" -" /// The given base address must point to the 8 MMIO control registers of " -"a\n" -" /// PL011 device, which must be mapped into the address space of the " -"process\n" -" /// as device memory and not have any other aliases.\n" +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-useful.md +msgid "Your code can go faster!" msgstr "" -#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -msgid "/// Writes a single byte to the UART.\n" +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-useful.md +msgid "Code using `unsafe` _might_ be faster." msgstr "" -#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -msgid "// Wait until there is room in the TX buffer.\n" +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-useful.md +msgid "" +"`fast_sum()` skips bounds checks. However, benchmarking is necessary to validate " +"performance claims. For cases like this, Rust's iterators can usually elide bounds checks " +"anyway." msgstr "" -#: src/bare-metal/aps/uart.md +#: src/unsafe-deep-dive/introduction/characteristics-of-unsafe-rust/sometimes-useful.md msgid "" -"// Safe because we know that the base address points to the control\n" -" // registers of a PL011 device which is appropriately mapped.\n" +"Optional: [show identical generated assembly](https://rust.godbolt.org/z/d48v1Y5aj) for " +"the two functions." msgstr "" -#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -msgid "// Write to the TX buffer.\n" +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Unsafe keyword shifts responsibility" msgstr "" -#: src/bare-metal/aps/uart.md src/bare-metal/aps/better-uart/driver.md -msgid "// Wait until the UART is no longer busy.\n" +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Is Memory Safe?" msgstr "" -#: src/bare-metal/aps/uart.md -#, fuzzy -msgid "" -"Note that `Uart::new` is unsafe while the other methods are safe. This is " -"because as long as the caller of `Uart::new` guarantees that its safety " -"requirements are met (i.e. that there is only ever one instance of the " -"driver for a given UART, and nothing else aliasing its address space), then " -"it is always safe to call `write_byte` later because we can assume the " -"necessary preconditions." +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Responsibility for Memory Safety" msgstr "" -"Notez que `Uart::new` n'est pas sûr alors que les autres méthodes sont " -"sûres. C'est parce que tant que le l'appelant de `Uart::new` garantit que " -"ses exigences de sécurité sont respectées (c'est-à-dire qu'il n'y a jamais " -"une instance du pilote pour un UART donné, et rien d'autre aliasant son " -"espace d'adressage), alors il est toujours sûr d'appeler `write_byte` plus " -"tard car nous pouvons supposer que le nécessaire conditions préalables." -#: src/bare-metal/aps/uart.md -#, fuzzy -msgid "" -"We could have done it the other way around (making `new` safe but " -"`write_byte` unsafe), but that would be much less convenient to use as every " -"place that calls `write_byte` would need to reason about the safety" +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Compiler" msgstr "" -"Nous aurions pu faire l'inverse (rendre `new` sûr mais `write_byte` non " -"sûr), mais cela serait beaucoup moins pratique à utiliser car chaque endroit " -"qui appelle `write_byte` aurait besoin de raisonner sur la sécurité" -#: src/bare-metal/aps/uart.md -#, fuzzy -msgid "" -"This is a common pattern for writing safe wrappers of unsafe code: moving " -"the burden of proof for soundness from a large number of places to a smaller " -"number of places." +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Programmer" msgstr "" -"Il s'agit d'un modèle courant pour écrire des wrappers sûrs de code non " -"sécurisé : déplacer la charge de la preuve pour solidité d'un grand nombre " -"d'endroits à un plus petit nombre d'endroits." -#: src/bare-metal/aps/uart/traits.md -#, fuzzy -msgid "More traits" -msgstr "Plus de traits" +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Who has responsibility for memory safety?" +msgstr "" -#: src/bare-metal/aps/uart/traits.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Safe Rust → compiler" +msgstr "" + +#: src/unsafe-deep-dive/introduction/responsibility-shift.md +msgid "Unsafe Rust → programmer" +msgstr "" + +#: src/unsafe-deep-dive/introduction/responsibility-shift.md msgid "" -"We derived the `Debug` trait. It would be useful to implement a few more " -"traits too." +"“While writing safe Rust, you cannot create memory safety problems. The compiler will " +"ensure that a program with mistakes will not build.”" msgstr "" -"Nous avons dérivé le trait `Debug`. Il serait également utile de mettre en " -"œuvre quelques traits supplémentaires." -#: src/bare-metal/aps/uart/traits.md -#: src/exercises/bare-metal/solutions-afternoon.md +#: src/unsafe-deep-dive/introduction/responsibility-shift.md msgid "" -"// Safe because it just contains a pointer to device memory, which can be\n" -"// accessed from any context.\n" +"“The `unsafe` keyword shifts responsibility for maintaining memory safety from the " +"compiler to programmers. It signals that there are preconditions that must be satisfied." msgstr "" -#: src/bare-metal/aps/uart/traits.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/responsibility-shift.md msgid "" -"Implementing `Write` lets us use the `write!` and `writeln!` macros with our " -"`Uart` type." +"“To uphold that responsibility, programmers must ensure that they've understood what the " +"preconditions are and that their code will always satisfy them." msgstr "" -"L'implémentation de `Write` nous permet d'utiliser les macros `write!` et " -"`writeln!` avec notre type `Uart`." -#: src/bare-metal/aps/uart/traits.md -#, fuzzy +#: src/unsafe-deep-dive/introduction/responsibility-shift.md msgid "" -"Run the example in QEMU with `make qemu_minimal` under `src/bare-metal/aps/" -"examples`." +"“Throughout this course, we'll use the term _safety preconditions_ to describe this " +"situation.”" msgstr "" -"Exécutez l'exemple dans QEMU avec `make qemu_minimal` sous `src/bare-metal/" -"aps/examples`." -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "A better UART driver" -msgstr "Un meilleur pilote UART" +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "Impact on workflow" +msgstr "" -#: src/bare-metal/aps/better-uart.md +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md #, fuzzy +msgid "While writing code" +msgstr "Génériques" + +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "Verify that you understand the preconditions of any `unsafe` functions/traits" +msgstr "" + +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "Check that the preconditions are satisfied" +msgstr "" + +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "Document your reasoning in safety comments" +msgstr "" + +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "Enhanced code review" +msgstr "" + +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "Self-review → peer reviewer → unsafe Rust expert (when needed)" +msgstr "" + +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "Escalate to a person who is comfortable with your code and reasoning" +msgstr "" + +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md msgid "" -"The PL011 actually has [a bunch more registers](https://developer.arm.com/" -"documentation/ddi0183/g/programmers-model/summary-of-registers), and adding " -"offsets to construct pointers to access them is error-prone and hard to " -"read. Plus, some of them are bit fields which would be nice to access in a " -"structured way." +"“The unsafe keyword places more responsibility on the programmer; therefore it requires a " +"stronger development workflow." msgstr "" -"Le PL011 a en fait \\[un tas de registres supplémentaires\\] [1](https://" -"developer.arm.com/documentation/ddi0183/g/programmers-model/summary-of-" -"registers), et ajoute des décalages pour construire des pointeurs pour " -"accéder est sujette aux erreurs et difficile à lire. De plus, certains " -"d'entre eux sont des champs de bits, ce qui serait bien de accéder de " -"manière structurée." -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "Offset" -msgstr "Décalage" +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "" +"“This class assumes a specific software development workflow where code review is " +"mandatory, and where the author and primary reviewer have access to an unsafe Rust " +"expert.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "Register name" -msgstr "Nom du registre" +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "" +"“The author and primary reviewer will verify simple unsafe Rust code themselves, and punt " +"to an unsafe expert when necessary.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "Width" -msgstr "Largeur" +#: src/unsafe-deep-dive/introduction/impact-on-workflow.md +msgid "" +"“There are only a few unsafe Rust experts, and they are very busy, so we need to " +"optimally use their time.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x00" -msgstr "0x00" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "Example: may_overflow function" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "DR" -msgstr "DR" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "/// Adds 2^31 - 1 to negative numbers.\n" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "12" -msgstr "12" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "\"{x}\"" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x04" -msgstr "0x04" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "" +"“The `unsafe` keyword may have a subtly different meaning than what some people assume.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "RSR" -msgstr "RSR" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "“The code author believes that the code is correct. In principle, the code is safe.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x18" -msgstr "0x18" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "" +"“In this toy example, the `may_overflow` function is only intended to be called with " +"negative numbers." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "FR" -msgstr "EN" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "Ask learners if they can explain why `may_overflow` requires the unsafe keyword." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "9" -msgstr "9" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "" +"“In case you’re unsure what the problem is, let’s pause briefly to explain. An `i32` only " +"has 31 bits available for positive numbers. When an operation produces a result that " +"requires more than 31 bits, then the program is put into an invalid state. And it’s not " +"just a numerical problem. Compilers optimize code on the basis that invalid states are " +"impossible. This causes code paths to be deleted, producing erratic runtime behavior " +"while also introducing security vulnerabilities." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x20" -msgstr "0x20" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "" +"Compile and run the code, producing a panic. Then run the example in the playground to " +"run under `--release` mode to trigger UB." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "ILPR" -msgstr "ILPR" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "“This code can be used correctly, however, improper usage is highly dangerous.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x24" -msgstr "0x24" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "“And it's impossible for the compiler to verify that the usage is correct.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "IBRD" -msgstr "BIRD" +#: src/unsafe-deep-dive/introduction/may_overflow.md +msgid "" +"This is what we mean when we say that the `unsafe` keyword marks the location where " +"responsibility for memory safety shifts from the compiler to the programmer." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "16" -msgstr "16" +#: src/unsafe-deep-dive/safety-preconditions.md +msgid "" +"Safety preconditions are conditions on an action that must be satisfied before that " +"action will be safe." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x28" -msgstr "0x28" +#: src/unsafe-deep-dive/safety-preconditions.md +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "" +"“Safety preconditions are conditions on code that must be satisfied to maintain Rust's " +"safety guarantees" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "FBRD" -msgstr "FBRD" +#: src/unsafe-deep-dive/safety-preconditions.md +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "" +"“You're likely to see a strong affinity between safety preconditions and the rules of " +"Safe Rust.”" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x2c" -msgstr "0x2c" +#: src/unsafe-deep-dive/safety-preconditions.md +msgid "Q: Can you list any?" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "LCR_H" -msgstr "LCR_H" +#: src/unsafe-deep-dive/safety-preconditions.md +msgid "(Fuller list in the next slide)" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x30" -msgstr "0x30" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Common safety preconditions" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "CR" -msgstr "CR" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Aliasing and Mutability" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x34" -msgstr "0x34" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Alignment" +msgstr "" -#: src/bare-metal/aps/better-uart.md +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md #, fuzzy -msgid "IFLS" -msgstr "IFLS" +msgid "Array access is in-bound" +msgstr "L'accès au tableau est vérifié dans les limites." -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x38" -msgstr "0x38" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Pointer provenance" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "IMSC" -msgstr "IMSC" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Validity" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "11" -msgstr "11" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Memory" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x3c" -msgstr "0x3c" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Avoid spending too much time explaining every precondition: we will be working through " +"the details during the course. The intent is to show that there are several." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "RIS" -msgstr "SIR" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"\"An incomplete list, but these are a few of the major safety preconditions to get us " +"thinking.\"" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x40" -msgstr "0x40" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Validity. Values must be valid values of the type that they represent. Rust's references " +"may not be null. Creating one with `unsafe` causes the." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "MIS" -msgstr "SIG" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Alignment. References to values must be well-aligned, which means th" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x44" -msgstr "0x44" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Aliasing. All Rust code must uphold Rust's borrowing rules. If you are manually creating " +"mutable references (`&mut T`) from pointers, then you may only create one" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "ICR" -msgstr "RIC" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Initialization. All instances of Rust types must be fully initialized. To create a value " +"from raw memory, we need to make sure that we've written" +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "0x48" -msgstr "0x48" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Pointer provenance. The origin of a pointer is important. Casting a `usize` to a raw " +"pointer is no longer allowed." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "DMACR" -msgstr "DMACR" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Lifetimes. References must not outlive their referent." +msgstr "" -#: src/bare-metal/aps/better-uart.md -#, fuzzy -msgid "There are also some ID registers which have been omitted for brevity." +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Some conditions are even more subtle than they first seem." msgstr "" -"Il existe également des registres d'identification qui ont été omis par " -"souci de brièveté." -#: src/bare-metal/aps/better-uart/bitflags.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md msgid "" -"The [`bitflags`](https://crates.io/crates/bitflags) crate is useful for " -"working with bitflags." +"Consider \"in-bounds array access\". Reading from the memory location, i.e. " +"dereferencing, is not required to break the program. Creating an out-of-bounds reference " +"already breaks the compiler's assumptions, leading to erratic behavior." msgstr "" -"Le crate [`bitflags`](https://crates.io/crates/bitflags) est utile pour " -"travailler avec les bitflags." -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Flags from the UART flag register.\n" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Rust tells LLVM to use its `getelementptr inbounds` assumption. That assumption will " +"cause later optimization passes within the compiler to misbehave (because out-of-bounds " +"memory access cannot occur)." msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Clear to send.\n" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Optional: open [the playground](https://play.rust-lang.org/?" +"version=stable&mode=release&edition=2024&gist=4116c4de01c863cac918f193448210b1), which " +"shows the code below. Explain that this is essentially a C function written in Rust " +"syntax that gets items from an array. Generate the LLVM IR with the **Show LLVM IR** " +"button. Highlight `getelementptr inbounds i32, ptr %array, i64 %offset`." msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Data set ready.\n" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "Expected output (the line to highlight starts with \\`%\\_3):" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Data carrier detect.\n" +#: src/unsafe-deep-dive/safety-preconditions/common-preconditions.md +msgid "" +"Bounds: You correctly noted that creating an out-of-bounds pointer (beyond the \"one-past-" +"the-end\" rule) is UB, even without dereferencing, due to LLVM's inbounds assumptions." msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// UART busy transmitting data.\n" +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "/// Return the element at `index` from `arr`\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Receive FIFO is empty.\n" +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "Ask: “What are the safety preconditions of `get`?”" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Transmit FIFO is full.\n" +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "The pointer `arr` is non-null, well-aligned and refers to an array of `i32`" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Receive FIFO is full.\n" +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "`index` is in-bounds" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Transmit FIFO is empty.\n" +#: src/unsafe-deep-dive/safety-preconditions/getter.md +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Add safety comments:" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -msgid "/// Ring indicator.\n" +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "" +"/// Return the element at `index` from `arr`\n" +"///\n" +"/// # Safety\n" +"///\n" +"/// - `arr` is non-null, correctly aligned and points to a valid `i32`\n" +"/// - `index` is in-bounds for the array\n" msgstr "" -#: src/bare-metal/aps/better-uart/bitflags.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/getter.md +msgid "// SAFETY: Caller guarantees that index is inbounds\n" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/getter.md msgid "" -"The `bitflags!` macro creates a newtype something like `Flags(u16)`, along " -"with a bunch of method implementations to get and set flags." +"Optional: Add runtime checks can be added in debug builds to provide some extra " +"robustness." msgstr "" -"La macro `bitflags!` crée un nouveau type quelque chose comme `Flags(u16)`, " -"avec un tas de méthodes implémentations pour obtenir et définir des drapeaux." -#: src/bare-metal/aps/better-uart/registers.md -#, fuzzy -msgid "Multiple registers" -msgstr "Plusieurs registres" +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "Determining Preconditions" +msgstr "" -#: src/bare-metal/aps/better-uart/registers.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "Where do you find the safety preconditions?" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/determining.md msgid "" -"We can use a struct to represent the memory layout of the UART's registers." +"Attempt to compile the program to trigger the compiler error (\"error\\[E0133\\]: call to " +"unsafe function ...\")." msgstr "" -"Nous pouvons utiliser une structure pour représenter la disposition de la " -"mémoire des registres de l'UART." -#: src/bare-metal/aps/better-uart/registers.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/determining.md msgid "" -"[`#[repr(C)]`](https://doc.rust-lang.org/reference/type-layout.html#the-c-" -"representation) tells the compiler to lay the struct fields out in order, " -"following the same rules as C. This is necessary for our struct to have a " -"predictable layout, as default Rust representation allows the compiler to " -"(among other things) reorder fields however it sees fit." +"Ask: “Where would you look if you wanted to know the preconditions for a function? Here " +"we need to understand when it's safe to convert from a null pointer to a mutable " +"reference.”" msgstr "" -"[`#[repr(C)]`](https://doc.rust-lang.org/reference/type-layout.html#the-c-" -"representation) indique le compilateur pour disposer les champs struct dans " -"l'ordre, en suivant les mêmes règles que C. Ceci est nécessaire pour que " -"notre structure ait une mise en page prévisible, car la représentation Rust " -"par défaut permet compilateur pour (entre autres) réorganiser les champs " -"comme bon lui semble." -#: src/bare-metal/aps/better-uart/driver.md +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "Locations to look:" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "A function's API documentation, especially its safety section" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "The source code and its internal safety comments" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/determining.md #, fuzzy -msgid "Now let's use the new `Registers` struct in our driver." +msgid "Module documentation" +msgstr "Tests de documentation" + +#: src/unsafe-deep-dive/safety-preconditions/determining.md +#, fuzzy +msgid "Rust Reference" +msgstr "Références" + +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "" +"Consult [the documentation](https://doc.rust-lang.org/std/primitive.pointer.html#method." +"as_mut) for the `as_mut` method." msgstr "" -"Utilisons maintenant la nouvelle structure `Registers` dans notre pilote." -#: src/bare-metal/aps/better-uart/driver.md -msgid "/// Driver for a PL011 UART.\n" +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "Highlight Safety section." msgstr "" -#: src/bare-metal/aps/better-uart/driver.md +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "**Safety**" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/determining.md msgid "" -"// Safe because we know that self.registers points to the control\n" -" // registers of a PL011 device which is appropriately mapped.\n" +"When calling this method, you have to ensure that either the pointer is null or the " +"pointer is convertible to a reference." msgstr "" -#: src/bare-metal/aps/better-uart/driver.md +#: src/unsafe-deep-dive/safety-preconditions/determining.md msgid "" -"/// Reads and returns a pending byte, or `None` if nothing has been\n" -" /// received.\n" +"Click the \"convertible to a reference\" hyperlink to the \"Pointer to reference " +"conversion\"" msgstr "" -#: src/bare-metal/aps/better-uart/driver.md -msgid "// TODO: Check for error conditions in bits 8-11.\n" +#: src/unsafe-deep-dive/safety-preconditions/determining.md +msgid "" +"Track down the rules for converting a pointer to a reference, i.e., whether it is " +"\"dereferenceable\"." msgstr "" -#: src/bare-metal/aps/better-uart/driver.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/determining.md msgid "" -"Note the use of `addr_of!` / `addr_of_mut!` to get pointers to individual " -"fields without creating an intermediate reference, which would be unsound." +"Consider the implications of this excerpt (Rust 1.90.0) \"You must enforce Rust’s " +"aliasing rules. The exact aliasing rules are not decided yet, ...\"" msgstr "" -"Notez l'utilisation de `addr_of!` / `addr_of_mut!` pour obtenir des " -"pointeurs vers des champs individuels sans créer une référence " -"intermédiaire, qui serait malsaine." -#: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md +#: src/unsafe-deep-dive/safety-preconditions/references.md #, fuzzy -msgid "Using it" -msgstr "En l'utilisant" +msgid "Example: References" +msgstr "Références invalides" -#: src/bare-metal/aps/better-uart/using.md -#, fuzzy -msgid "" -"Let's write a small program using our driver to write to the serial console, " -"and echo incoming bytes." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Confirm understanding of the syntax" msgstr "" -"Écrivons un petit programme en utilisant notre pilote pour écrire sur la " -"console série et écho entrant octets." -#: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Base address of the primary PL011 UART.\n" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "`Box` type is a reference to an integer on the heap that is owned by the box." msgstr "" -#: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md -#: src/exercises/bare-metal/solutions-afternoon.md +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"// Safe because `PL011_BASE_ADDRESS` is the base address of a PL011 device,\n" -" // and nothing else accesses that address range.\n" +"`*mut i32` type is a so-called raw pointer to an integer that the compiler does not know " +"the ownership of. Programmers need to ensure the rules are enforced without assistance " +"from the compiler." msgstr "" -#: src/bare-metal/aps/better-uart/using.md src/bare-metal/aps/logging/using.md -msgid "\"main({x0:#x}, {x1:#x}, {x2:#x}, {x3:#x})\"" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "" +"Note: raw pointers do not provide ownership info to Rust. A pointer can be semantically " +"owning the data, or semantically borrowing, but that information only exists in the " +"programmer's mind." msgstr "" -#: src/bare-metal/aps/better-uart/using.md -msgid "b'\\r'" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "`&mut *boxed as *mut _` expression:" msgstr "" -#: src/bare-metal/aps/better-uart/using.md src/async/pitfalls/cancellation.md -msgid "b'\\n'" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "`*boxed` is ..." msgstr "" -#: src/bare-metal/aps/better-uart/using.md -msgid "b'q'" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "`&mut *boxed` is ..." msgstr "" -#: src/bare-metal/aps/better-uart/using.md -msgid "\"Bye!\"" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "finally, `as *mut i32` casts the reference to a pointer." msgstr "" -#: src/bare-metal/aps/better-uart/using.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"As in the [inline assembly](../inline-assembly.md) example, this `main` " -"function is called from our entry point code in `entry.S`. See the speaker " -"notes there for details." +"References, such as `&mut i32`, \"borrow\" their referent. This is Rust's ownership " +"system." msgstr "" -"Comme dans l'exemple [inline assembly](../inline-assembly.md), cette " -"fonction `main` est appelée depuis notre code du point d'entrée dans `entry." -"S`. Voir les notes du formateur pour plus de détails." -#: src/bare-metal/aps/better-uart/using.md -#, fuzzy -msgid "" -"Run the example in QEMU with `make qemu` under `src/bare-metal/aps/examples`." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Confirm understanding of ownership" msgstr "" -"Exécutez l'exemple dans QEMU avec `make qemu` sous `src/bare-metal/aps/" -"examples`." -#: src/bare-metal/aps/logging.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Step through code:" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"It would be nice to be able to use the logging macros from the [`log`]" -"(https://crates.io/crates/log) crate. We can do this by implementing the " -"`Log` trait." +"(Line 3) Creates raw pointer to the `123` by dereferencing the box, creating a new " +"reference and casting the new reference as a pointer." msgstr "" -"Ce serait bien de pouvoir utiliser les macros de journalisation du crate " -"[`log`](https://crates.io/crates/log). Nous pouvons le faire en implémentant " -"le trait `Log`." -#: src/bare-metal/aps/logging.md -msgid "\"[{}] {}\"" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "(Line 4) Creates raw pointer with a NULL value" msgstr "" -#: src/bare-metal/aps/logging.md -msgid "/// Initialises UART logger.\n" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "(Line 7) Converts the raw pointer to an Option with `.as_mut()`" msgstr "" -#: src/bare-metal/aps/logging.md +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Highlight that pointers are nullable in Rust (unlike references)." +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Compile to reveal the error messages." +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Discuss" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "(Line 6) `println!(\"{:?}\", *a);`" +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/references.md #, fuzzy +msgid "Prefix star dereferences a raw pointer." +msgstr "Déréférencer les pointeurs bruts." + +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"The unwrap in `log` is safe because we initialise `LOGGER` before calling " -"`set_logger`." +"It is an explicit operation. Whereas regular references have implicit dereferencing most " +"of the time thanks to the Deref trait. This is referred to as \"auto-deref\"." msgstr "" -"Le déballage dans `log` est sûr car nous initialisons `LOGGER` avant " -"d'appeler `set_logger`." -#: src/bare-metal/aps/logging/using.md +#: src/unsafe-deep-dive/safety-preconditions/references.md #, fuzzy -msgid "We need to initialise the logger before we use it." -msgstr "Nous devons initialiser l'enregistreur avant de l'utiliser." +msgid "Dereferencing a raw pointer is an unsafe operation." +msgstr "Déréférencer les pointeurs bruts." -#: src/bare-metal/aps/logging/using.md -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"{info}\"" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Requires an unsafe block." +msgstr "" + +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "(Line 7) `println!(\"{:?}\", b.as_mut());`" msgstr "" -#: src/bare-metal/aps/logging/using.md -#, fuzzy -msgid "Note that our panic handler can now log details of panics." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "`as_mut()` is an unsafe function." msgstr "" -"Notez que notre gestionnaire de panique peut désormais enregistrer les " -"détails des paniques." -#: src/bare-metal/aps/logging/using.md -#, fuzzy -msgid "" -"Run the example in QEMU with `make qemu_logger` under `src/bare-metal/aps/" -"examples`." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Calling an unsafe function requires an unsafe block." msgstr "" -"Exécutez l'exemple dans QEMU avec `make qemu_logger` sous `src/bare-metal/" -"aps/examples`." -#: src/bare-metal/aps/exceptions.md +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"AArch64 defines an exception vector table with 16 entries, for 4 types of " -"exceptions (synchronous, IRQ, FIQ, SError) from 4 states (current EL with " -"SP0, current EL with SPx, lower EL using AArch64, lower EL using AArch32). " -"We implement this in assembly to save volatile registers to the stack before " -"calling into Rust code:" +"Demonstrate: Fix the code (add unsafe blocks) and compile again to show the working " +"program." msgstr "" -#: src/bare-metal/aps/exceptions.md -msgid "EL is exception level; all our examples this afternoon run in EL1." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Demonstrate: Replace `as *mut i32` with `as *mut _`, show that it compiles." msgstr "" -#: src/bare-metal/aps/exceptions.md +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"For simplicity we aren't distinguishing between SP0 and SPx for the current " -"EL exceptions, or between AArch32 and AArch64 for the lower EL exceptions." +"We can partially omit the target type in the cast. The Rust compiler knows that the " +"source of the cast is a `&mut i32`. This reference type can only be converted to one " +"pointer type, `*mut i32`." msgstr "" -#: src/bare-metal/aps/exceptions.md +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"For this example we just log the exception and power down, as we don't " -"expect any of them to actually happen." +"We said that the unsafe code marks the responsibility shift from the compiler to the " +"programmer." msgstr "" -#: src/bare-metal/aps/exceptions.md +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"We can think of exception handlers and our main execution context more or " -"less like different threads. [`Send` and `Sync`](../../concurrency/send-sync." -"md) will control what we can share between them, just like with threads. For " -"example, if we want to share some value between exception handlers and the " -"rest of the program, and it's `Send` but not `Sync`, then we'll need to wrap " -"it in something like a `Mutex` and put it in a static." +"How do we convey that we thought about our unusual responsibilities while writing unsafe " +"code? Safety comments." msgstr "" -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "[oreboot](https://github.com/oreboot/oreboot)" -msgstr "[oreboot](https://github.com/oreboot/oreboot)" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Safety comments explain why unsafe code is correct." +msgstr "" -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "\"coreboot without the C\"" -msgstr "\"coreboot sans le C\"" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Without a safety comment, unsafe code is not safe." +msgstr "" -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "Supports x86, aarch64 and RISC-V." -msgstr "Prend en charge x86, aarch64 et RISC-V." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Discuss: Whether to use one large unsafe block or two smaller ones:" +msgstr "" -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "Relies on LinuxBoot rather than having many drivers itself." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Possibility of using a single unsafe block rather than multiple." msgstr "" -"S'appuie sur LinuxBoot plutôt que d'avoir lui-même de nombreux pilotes." -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "" -"[Rust RaspberryPi OS tutorial](https://github.com/rust-embedded/rust-" -"raspberrypi-OS-tutorials)" +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "Using more allows safety comments as specific as possible." msgstr "" -"\\[Tutoriel Rust RaspberryPi OS\\] (https://github.com/rust-embedded/rust-" -"raspberrypi-OS-tutorials)" -#: src/bare-metal/aps/other-projects.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/references.md msgid "" -"Initialisation, UART driver, simple bootloader, JTAG, exception levels, " -"exception handling, page tables" +"// SAFETY: `a` is a non-null pointer to i32, it is initialized and still\n" +" // allocated.\n" msgstr "" -"Initialisation, pilote UART, chargeur de démarrage simple, JTAG, niveaux " -"d'exception, gestion des exceptions, tables de pages" -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "" -"Some dodginess around cache maintenance and initialisation in Rust, not " -"necessarily a good example to copy for production code." -msgstr "Pas tous très bien écrits, alors méfiez-vous." +#: src/unsafe-deep-dive/safety-preconditions/references.md +msgid "// SAFETY: `b` is a null pointer, which `as_mut()` converts to `None`.\n" +msgstr "" -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "[`cargo-call-stack`](https://crates.io/crates/cargo-call-stack)" -msgstr "[`pile-appel-cargo`](https://crates.io/crates/pile-appel-cargo)" +#: src/unsafe-deep-dive/safety-preconditions/defining.md +msgid "User-defined types are entitled to have their own safety preconditions" +msgstr "" -#: src/bare-metal/aps/other-projects.md -#, fuzzy -msgid "Static analysis to determine maximum stack usage." -msgstr "Analyse statique pour déterminer l'utilisation maximale de la pile." +#: src/unsafe-deep-dive/safety-preconditions/defining.md +msgid "Include documentation so that they can later be determined and satisfied" +msgstr "" -#: src/bare-metal/aps/other-projects.md -msgid "" -"The RaspberryPi OS tutorial runs Rust code before the MMU and caches are " -"enabled. This will read and write memory (e.g. the stack). However:" +#: src/unsafe-deep-dive/safety-preconditions/ascii.md +msgid "/// Text that is guaranteed to be encoded within 7-bit ASCII.\n" msgstr "" -#: src/bare-metal/aps/other-projects.md +#: src/unsafe-deep-dive/safety-preconditions/ascii.md msgid "" -"Without the MMU and cache, unaligned accesses will fault. It builds with " -"`aarch64-unknown-none` which sets `+strict-align` to prevent the compiler " -"generating unaligned accesses so it should be alright, but this is not " -"necessarily the case in general." +"/// Creates a new `Ascii` from a byte slice without checking for ASCII\n" +" /// validity.\n" +" ///\n" +" /// # Safety\n" +" ///\n" +" /// Providing non-ASCII bytes results in undefined behavior.\n" msgstr "" -#: src/bare-metal/aps/other-projects.md +#: src/unsafe-deep-dive/safety-preconditions/ascii.md msgid "" -"If it were running in a VM, this can lead to cache coherency issues. The " -"problem is that the VM is accessing memory directly with the cache disabled, " -"while the host has cacheable aliases to the same memory. Even if the host " -"doesn't explicitly access the memory, speculative accesses can lead to cache " -"fills, and then changes from one or the other will get lost. Again this is " -"alright in this particular case (running directly on the hardware with no " -"hypervisor), but isn't a good pattern in general." +"\"The `Ascii` type is a minimal wrapper around a byte slice. Internally, they share the " +"same representation. However, `Ascii` requires that the high bit must not be used.\"" msgstr "" -#: src/bare-metal/useful-crates.md -msgid "Useful crates" -msgstr "Crates utiles" - -#: src/bare-metal/useful-crates.md -#, fuzzy +#: src/unsafe-deep-dive/safety-preconditions/ascii.md msgid "" -"We'll go over a few crates which solve some common problems in bare-metal " -"programming." +"Optional: Extend the example to mention that it's possible to use `debug_assert!` to test " +"the preconditions during tests without impacting release builds." msgstr "" -"Nous allons passer en revue quelques caisses qui résolvent certains " -"problèmes courants de la programmation bare-metal." -#: src/bare-metal/useful-crates/zerocopy.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game.md msgid "" -"The [`zerocopy`](https://docs.rs/zerocopy/) crate (from Fuchsia) provides " -"traits and macros for safely converting between byte sequences and other " -"types." +"“We've seen many examples of code that has problems in the class, but we lack consistent " +"terminology." msgstr "" -"La caisse [`zerocopy`](https://docs.rs/zerocopy/) (de Fuchsia) fournit des " -"traits et des macros pour convertir en toute sécurité entre séquences " -"d'octets et autres types." -#: src/bare-metal/useful-crates/zerocopy.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game.md msgid "" -"This is not suitable for MMIO (as it doesn't use volatile reads and writes), " -"but can be useful for working with structures shared with hardware e.g. by " -"DMA, or sent over some external interface." +"“The goal of the next section is to introduce some terms that describe many of the " +"concepts that we have been thinking about." msgstr "" -"Ce n'est pas adapté pour MMIO (car il n'utilise pas de lectures et " -"d'écritures volatiles), mais peut être utile pour travailler avec des " -"structures partagées avec du matériel, par ex. par DMA, ou envoyé sur une " -"interface externe." -#: src/bare-metal/useful-crates/zerocopy.md +#: src/unsafe-deep-dive/rules-of-the-game.md #, fuzzy -msgid "" -"`FromBytes` can be implemented for types for which any byte pattern is " -"valid, and so can safely be converted from an untrusted sequence of bytes." +msgid "undefined behavior" +msgstr "Aucun comportement indéfini à l'exécution :" + +#: src/unsafe-deep-dive/rules-of-the-game.md +msgid "sound" msgstr "" -"`FromBytes` peut être implémenté pour les types pour lesquels n'importe quel " -"modèle d'octet est valide, et peut donc être en toute sécurité converti à " -"partir d'une séquence d'octets non fiable." -#: src/bare-metal/useful-crates/zerocopy.md -#, fuzzy -msgid "" -"Attempting to derive `FromBytes` for these types would fail, because " -"`RequestType` doesn't use all possible u32 values as discriminants, so not " -"all byte patterns are valid." +#: src/unsafe-deep-dive/rules-of-the-game.md +msgid "unsound" msgstr "" -"Tenter de dériver `FromBytes` pour ces types échouerait, car `RequestType` " -"n'utilise pas tous les valeurs u32 possibles comme discriminants, donc tous " -"les modèles d'octets ne sont pas valides." -#: src/bare-metal/useful-crates/zerocopy.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game.md msgid "" -"`zerocopy::byteorder` has types for byte-order aware numeric primitives." +"“Given that many safety preconditions are semantic rather than syntactic, it's important " +"to use a shared vocabulary. That way we can agree on semantics." msgstr "" -"`zerocopy::byteorder` a des types pour les primitives numériques sensibles à " -"l'ordre des octets." -#: src/bare-metal/useful-crates/zerocopy.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game.md msgid "" -"Run the example with `cargo run` under `src/bare-metal/useful-crates/" -"zerocopy-example/`. (It won't run in the Playground because of the crate " -"dependency.)" +"“The overarching goal is to develop a mental framework of what soundness is and ensure " +"that Rust code that contains unsafe remains sound.”" msgstr "" -"Exécutez l'exemple avec `cargo run` sous `src/bare-metal/useful-crates/" -"zerocopy-example/`. (Ce ne sera pas exécuter dans le Playground en raison de " -"la dépendance de la caisse.)" -#: src/bare-metal/useful-crates/aarch64-paging.md -#, fuzzy -msgid "" -"The [`aarch64-paging`](https://crates.io/crates/aarch64-paging) crate lets " -"you create page tables according to the AArch64 Virtual Memory System " -"Architecture." +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md +msgid "Soundness is fundamental to Rust" msgstr "" -"La caisse [`aarch64-paging`](https://crates.io/crates/aarch64-paging) vous " -"permet de créer des tables de pages en fonction de la mémoire virtuelle " -"AArch64 Architecture du système." -#: src/bare-metal/useful-crates/aarch64-paging.md -msgid "// Create a new page table with identity mapping.\n" +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md +msgid "Soundness ≈ impossible to cause memory safety problems" msgstr "" -#: src/bare-metal/useful-crates/aarch64-paging.md -msgid "// Map a 2 MiB region of memory as read-only.\n" +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md +msgid "Sound functions have common “shapes”" msgstr "" -#: src/bare-metal/useful-crates/aarch64-paging.md -msgid "// Set `TTBR0_EL1` to activate the page table.\n" +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md +msgid "“A fundamental principle of Rust code is that it is sound." msgstr "" -#: src/bare-metal/useful-crates/aarch64-paging.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md msgid "" -"For now it only supports EL1, but support for other exception levels should " -"be straightforward to add." +"“We’ll create a formal definition of the term soundness shortly. In the meantime, think " +"of sound code as code that cannot trigger memory safety problems." msgstr "" -"Pour l'instant, il ne prend en charge que EL1, mais la prise en charge " -"d'autres niveaux d'exception devrait être simple à ajouter." -#: src/bare-metal/useful-crates/aarch64-paging.md -#, fuzzy -msgid "" -"This is used in Android for the [Protected VM Firmware](https://cs.android." -"com/android/platform/superproject/+/master:packages/modules/Virtualization/" -"pvmfw/)." +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md +msgid "“Sound code is made up of _sound functions_ and _sound operations_." msgstr "" -"Ceci est utilisé dans Android pour le \\[micrologiciel de la machine " -"virtuelle protégée\\] [2](https://cs.android.com/android/platform/" -"superproject/+/master:packages/modules/Virtualization/pvmfw/)." -#: src/bare-metal/useful-crates/aarch64-paging.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md msgid "" -"There's no easy way to run this example, as it needs to run on real hardware " -"or under QEMU." +"“A sound function is a function where none of its possible inputs could provoke soundness " +"problems." msgstr "" -"Il n'y a pas de moyen simple d'exécuter cet exemple, car il doit être " -"exécuté sur du matériel réel ou sous QEMU." -#: src/bare-metal/useful-crates/buddy_system_allocator.md -#, fuzzy -msgid "" -"[`buddy_system_allocator`](https://crates.io/crates/buddy_system_allocator) " -"is a third-party crate implementing a basic buddy system allocator. It can " -"be used both for [`LockedHeap`](https://docs.rs/buddy_system_allocator/0.9.0/" -"buddy_system_allocator/struct.LockedHeap.html) implementing [`GlobalAlloc`]" -"(https://doc.rust-lang.org/core/alloc/trait.GlobalAlloc.html) so you can use " -"the standard `alloc` crate (as we saw [before](../alloc.md)), or for " -"allocating other address space. For example, we might want to allocate MMIO " -"space for PCI BARs:" -msgstr "" -"[`buddy_system_allocator`](https://crates.io/crates/buddy_system_allocator) " -"est une caisse tierce implémentant un système d'allocation de copains de " -"base. Il peut être utilisé à la fois pour [`LockedHeap`](https://docs.rs/" -"buddy_system_allocator/0.9.0/buddy_system_allocator/struct.LockedHeap.html) " -"implémentant [`GlobalAlloc`](https://doc.rust-lang.org/core/alloc/trait." -"GlobalAlloc.html) afin que vous puissiez utiliser le caisse `alloc` standard " -"(comme nous l'avons vu \\[avant\\] [4](../alloc.md)), ou pour allouer un " -"autre espace d'adressage. Par exemple, nous pourrions vouloir allouer de " -"l'espace MMIO pour les PCI BAR :" +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md +msgid "Sound functions have common shapes." +msgstr "" -#: src/bare-metal/useful-crates/buddy_system_allocator.md -#, fuzzy -msgid "PCI BARs always have alignment equal to their size." -msgstr "Les PCI BAR ont toujours un alignement égal à leur taille." +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md +msgid "Those shapes are what we’ll look at now." +msgstr "" -#: src/bare-metal/useful-crates/buddy_system_allocator.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/rust-is-sound.md msgid "" -"Run the example with `cargo run` under `src/bare-metal/useful-crates/" -"allocator-example/`. (It won't run in the Playground because of the crate " -"dependency.)" +"“We’ll start with one that’s implemented in Safe Rust, and then see what could happen " +"when we introduce `unsafe` to different parts." msgstr "" -"Exécutez l'exemple avec `cargo run` sous `src/bare-metal/useful-crates/" -"allocator-example/`. (Ce ne sera pas exécuter dans le Playground en raison " -"de la dépendance de la caisse.)" -#: src/bare-metal/useful-crates/tinyvec.md -#, fuzzy -msgid "" -"Sometimes you want something which can be resized like a `Vec`, but without " -"heap allocation. [`tinyvec`](https://crates.io/crates/tinyvec) provides " -"this: a vector backed by an array or slice, which could be statically " -"allocated or on the stack, which keeps track of how many elements are used " -"and panics if you try to use more than are allocated." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory.md +msgid "Copying memory - Introduction" msgstr "" -"Parfois, vous voulez quelque chose qui peut être redimensionné comme un " -"`Vec`, mais sans allocation de tas. [`tinyvec`](https://crates.io/crates/" -"tinyvec) fournit ceci : un vecteur soutenu par un tableau ou une tranche, " -"qui pourrait être statiquement alloué ou sur la pile, qui garde une trace du " -"nombre d'éléments utilisés et panique si vous essayez de utiliser plus que " -"ce qui est alloué." -#: src/bare-metal/useful-crates/tinyvec.md -#, fuzzy -msgid "" -"`tinyvec` requires that the element type implement `Default` for " -"initialisation." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory.md +msgid "/// Reads bytes from `source` and writes them to `dest`\n" msgstr "" -"`tinyvec` nécessite que le type d'élément implémente `Default` pour " -"l'initialisation." -#: src/bare-metal/useful-crates/tinyvec.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory.md +msgid "“Here is our initial function prototype.”" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory.md msgid "" -"The Rust Playground includes `tinyvec`, so this example will run fine inline." +"“`copy` accepts two slices as arguments. `dest` (destination) is mutable, whereas " +"`source` is not.”" msgstr "" -"Le Rust Playground inclut `tinyvec`, donc cet exemple fonctionnera bien en " -"ligne." -#: src/bare-metal/useful-crates/spin.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory.md +msgid "“Let's see the shapes of sound Rust code.”" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +msgid "“The implementation only uses safe Rust." +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +msgid "What can we learn from this?" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md msgid "" -"`std::sync::Mutex` and the other synchronisation primitives from `std::sync` " -"are not available in `core` or `alloc`. How can we manage synchronisation or " -"interior mutability, such as for sharing state between different CPUs?" +"“It is impossible for `copy` to trigger memory safety issues when implemented in Safe " +"Rust. This is true for all possible input arguments.”" msgstr "" -"`std::sync::Mutex` et les autres primitives de synchronisation de `std::" -"sync` ne sont pas disponibles dans `core` ou `alloc`. Comment gérer la " -"synchronisation ou la mutabilité intérieure, comme pour le partage état " -"entre différents processeurs ?" -#: src/bare-metal/useful-crates/spin.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md msgid "" -"The [`spin`](https://crates.io/crates/spin) crate provides spinlock-based " -"equivalents of many of these primitives." +"“For example, by using Rust’s iterators, we can ensure that we’ll never trigger errors " +"relating to handling pointers directly, such as needing null pointer or bounds checks.”" msgstr "" -"Le crate [`spin`](https://crates.io/crates/spin) fournit des équivalents " -"basés sur des verrous d'attente de plusieurs de ces primitives." -#: src/bare-metal/useful-crates/spin.md -msgid "Be careful to avoid deadlock if you take locks in interrupt handlers." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +msgid "Ask: “Can you think of any others?”" msgstr "" -#: src/bare-metal/useful-crates/spin.md -msgid "" -"`spin` also has a ticket lock mutex implementation; equivalents of `RwLock`, " -"`Barrier` and `Once` from `std::sync`; and `Lazy` for lazy initialisation." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +msgid "No aliasing issues" msgstr "" -#: src/bare-metal/useful-crates/spin.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +msgid "Dangling pointers are impossible" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +msgid "Alignment will be correct" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md +msgid "Cannot accidentally read from uninitialized memory" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md msgid "" -"The [`once_cell`](https://crates.io/crates/once_cell) crate also has some " -"useful types for late initialisation with a slightly different approach to " -"`spin::once::Once`." +"“We can say that the `copy` function is _sound_ because Rust ensures that all of the " +"safety preconditions are satisfied.”" msgstr "" -#: src/bare-metal/useful-crates/spin.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md msgid "" -"The Rust Playground includes `spin`, so this example will run fine inline." +"“From the point of view of the programmer, as this function is implemented in safe Rust, " +"we can think of it as having no safety preconditions.”" msgstr "" -#: src/bare-metal/android.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/safe.md msgid "" -"To build a bare-metal Rust binary in AOSP, you need to use a " -"`rust_ffi_static` Soong rule to build your Rust code, then a `cc_binary` " -"with a linker script to produce the binary itself, and then a `raw_binary` " -"to convert the ELF to a raw binary ready to be run." +"“This does not mean that `copy` will always do what the caller might want. If there is " +"insufficient space available in the `dest` slice, then data will not be copied across.”" msgstr "" -"Pour construire un binaire Rust bare-metal dans AOSP, vous devez utiliser " -"une règle Soong `rust_ffi_static` pour construire votre code Rust, puis un " -"`cc_binary` avec un script de liaison pour produire le binaire lui-même, " -"puis un `raw_binary` pour convertir l'ELF en un binaire brut prêt à être " -"exécuté." -#: src/bare-metal/android/vmbase.md -msgid "vmbase" -msgstr "vmbase" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md +msgid "// SAFETY: `i` must be in-bounds as it was produced by source.len()\n" +msgstr "" -#: src/bare-metal/android/vmbase.md -#, fuzzy -msgid "" -"For VMs running under crosvm on aarch64, the [vmbase](https://android." -"googlesource.com/platform/packages/modules/Virtualization/+/refs/heads/" -"master/vmbase/) library provides a linker script and useful defaults for the " -"build rules, along with an entry point, UART console logging and more." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md +msgid "// SAFETY: `i` must be in-bounds as it was produced by dest.len()\n" msgstr "" -"Pour les machines virtuelles exécutées sous crosvm sur aarch64, la " -"bibliothèque [vmbase](https://android.googlesource.com/platform/packages/" -"modules/Virtualization/+/refs/heads/master/vmbase/) fournit un script de " -"liaison et des informations utiles. valeurs par défaut pour les règles de " -"construction, ainsi qu'un point d'entrée, la journalisation de la console " -"UART et plus encore." -#: src/bare-metal/android/vmbase.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md msgid "" -"The `main!` macro marks your main function, to be called from the `vmbase` " -"entry point." +"“Here we have a safe function that encapsulates unsafe blocks that are used internally." msgstr "" -"La macro `main!` marque votre fonction principale, à appeler depuis le point " -"d'entrée `vmbase`." -#: src/bare-metal/android/vmbase.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md msgid "" -"The `vmbase` entry point handles console initialisation, and issues a " -"PSCI_SYSTEM_OFF to shutdown the VM if your main function returns." +"“This implementation avoids iterators. Instead, the implementor is accessing memory " +"manually.”" msgstr "" -"Le point d'entrée `vmbase` gère l'initialisation de la console et émet un " -"PSCI_SYSTEM_OFF pour l'arrêt la VM si votre fonction principale revient." -#: src/exercises/bare-metal/afternoon.md -#, fuzzy -msgid "We will write a driver for the PL031 real-time clock device." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md +msgid "“Is this correct?” “Are there any problems?”" msgstr "" -"Nous allons écrire un pilote pour le dispositif d'horloge en temps réel " -"PL031." -#: src/exercises/bare-metal/afternoon.md src/exercises/concurrency/afternoon.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md +msgid "“Who has responsibility for ensuring that correctness? The author of the function." +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/encapsulated-unsafe.md msgid "" -"After looking at the exercises, you can look at the [solutions](solutions-" -"afternoon.md) provided." +"“A Safe Rust function that contains unsafe blocks remains sound if it’s impossible for an " +"input to cause memory safety issues." msgstr "" -"Après avoir regardé l'exercice, vous pouvez regarder la [solution](solutions-" -"afternoon.md) fournie." -#: src/exercises/bare-metal/rtc.md -#: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy -msgid "RTC driver" -msgstr "Pilote RTC" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "The functionality of copying bytes from one place to the next remains the same." +msgstr "" -#: src/exercises/bare-metal/rtc.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md msgid "" -"The QEMU aarch64 virt machine has a [PL031](https://developer.arm.com/" -"documentation/ddi0224/c) real-time clock at 0x9010000. For this exercise, " -"you should write a driver for it." +"“However, we need to manually create a slice. To do that, we first need to find the end " +"of the data." msgstr "" -"La machine QEMU aarch64 virt a une horloge en temps réel \\[PL031\\] [1]" -"(https://developer.arm.com/documentation/ddi0224/c) à 0x9010000. Pour cet " -"exercice, vous devrait écrire un pilote pour cela et l'utiliser pour " -"imprimer l'heure actuelle sur la console série. Vous pouvez utiliser la " -"caisse [`chrono`](https://crates.io/crates/chrono) pour le formatage de la " -"date/heure." -#: src/exercises/bare-metal/rtc.md -msgid "" -"Use it to print the current time to the serial console. You can use the " -"[`chrono`](https://crates.io/crates/chrono) crate for date/time formatting." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "“As we’re working with text, we’ll use the C convention of a null-terminated string." msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "" -"Use the match register and raw interrupt status to busy-wait until a given " -"time, e.g. 3 seconds in the future. (Call [`core::hint::spin_loop`](https://" -"doc.rust-lang.org/core/hint/fn.spin_loop.html) inside the loop.)" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "Compile the code. See that the output remains the same." msgstr "" -#: src/exercises/bare-metal/rtc.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md msgid "" -"_Extension if you have time:_ Enable and handle the interrupt generated by " -"the RTC match. You can use the driver provided in the [`arm-gic`](https://" -"docs.rs/arm-gic/) crate to configure the Arm Generic Interrupt Controller." +"“An unsound function can still work correctly for some inputs. Just because your tests " +"pass, does not mean that you have a sound function.”" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "Use the RTC interrupt, which is wired to the GIC as `IntId::spi(2)`." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "“Can anyone spot any issues?”" msgstr "" -#: src/exercises/bare-metal/rtc.md -msgid "" -"Once the interrupt is enabled, you can put the core to sleep via `arm_gic::" -"wfi()`, which will cause the core to sleep until it receives an interrupt." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "Readability: difficult to quickly scan code" msgstr "" -#: src/exercises/bare-metal/rtc.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md #, fuzzy -msgid "" -"Download the [exercise template](../../comprehensive-rust-exercises.zip) and " -"look in the `rtc` directory for the following files." +msgid "`source` pointer might be null" +msgstr "Le pointeur doit être non nul." + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "`source` pointer might be dangling, i.e. point to freed or uninitialized memory" msgstr "" -"Téléchargez le \\[modèle d'exercice\\] (../../comprehensive-rust-exercises." -"zip) et regardez dans le `rtc` répertoire pour les fichiers suivants." -#: src/exercises/bare-metal/rtc.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "`source` might not be null-terminated" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md msgid "" -"_src/exceptions.rs_ (you should only need to change this for the 3rd part of " -"the exercise):" +"“Assume that we cannot change the function signature, what improvements could we make to " +"the code to address these issues?”" msgstr "" -"`src/exceptions.rs` (vous ne devriez pas avoir besoin de le modifier) :" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_src/logger.rs_ (you shouldn't need to change this):" -msgstr "`src/logger.rs` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "Null pointer: Add null check with early return (`if source.is_null() { return; }`)" +msgstr "" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_src/pl011.rs_ (you shouldn't need to change this):" -msgstr "`src/pl011.rs` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "" +"Readability: Use a well-tested library rather than implementing “find first null byte” " +"ourselves" +msgstr "" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_build.rs_ (you shouldn't need to change this):" -msgstr "`build.rs` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "“Some safety requirements are impossible to defensively check for, however, i.e.:”" +msgstr "" -#: src/exercises/bare-metal/rtc.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md #, fuzzy -msgid "_entry.S_ (you shouldn't need to change this):" -msgstr "`entry.S` (vous ne devriez pas avoir besoin de le modifier) :" +msgid "dangling pointer" +msgstr "Nombres à virgule flottante" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_exceptions.S_ (you shouldn't need to change this):" -msgstr "`exceptions.S` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "no null termination byte" +msgstr "" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_idmap.S_ (you shouldn't need to change this):" -msgstr "`idmap.S` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "“How can we make this function sound?”" +msgstr "" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_image.ld_ (you shouldn't need to change this):" -msgstr "`image.ld` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "Either" +msgstr "" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "_Makefile_ (you shouldn't need to change this):" -msgstr "`Makefile` (vous ne devriez pas avoir besoin de le modifier) :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "" +"Change the type of the `source` input argument to something that has a known length, i.e. " +"use a slice like the previous example." +msgstr "" -#: src/exercises/bare-metal/rtc.md -#, fuzzy -msgid "Run the code in QEMU with `make qemu`." -msgstr "Exécutez le code dans QEMU avec `make qemu`." +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "Or" +msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "Bare Metal Rust Afternoon" -msgstr "Bare Metal Rust Après-midi" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "Mark the function as unsafe" +msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy -msgid "([back to exercise](rtc.md))" -msgstr "([retour à l'exercice](rtc.md))" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/exposed-unsafe.md +msgid "Document the safety preconditions" +msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy -msgid "_main.rs_:" -msgstr "`main.rs` :" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "" +"/// ...\n" +"///\n" +"/// # Safety\n" +"///\n" +"/// This function can easily trigger undefined behavior. Ensure that:\n" +"///\n" +"/// - `source` pointer is non-null and non-dangling\n" +"/// - `source` data ends with a null byte within its memory allocation\n" +"/// - `source` data is not freed (its lifetime invariants are preserved)\n" +"/// - `source` data contains fewer than `isize::MAX` bytes\n" +msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Base addresses of the GICv3.\n" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "// SAFETY: Caller has provided a non-null pointer\n" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Base address of the PL031 RTC.\n" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "// SAFETY: Caller has provided a data with length < isize:MAX\n" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// The IRQ used by the PL031 RTC.\n" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "// SAFETY: Caller maintains lifetime and aliasing requirements\n" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"main({:#x}, {:#x}, {:#x}, {:#x})\"" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "Changes to previous iterations:" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "" -"// Safe because `GICD_BASE_ADDRESS` and `GICR_BASE_ADDRESS` are the base\n" -" // addresses of a GICv3 distributor and redistributor respectively, and\n" -" // nothing else accesses those address ranges.\n" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "`copy` marked as unsafe" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "Safety preconditions are documented" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "inline safety comments" +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md msgid "" -"// Safe because `PL031_BASE_ADDRESS` is the base address of a PL031 device,\n" -" // and nothing else accesses that address range.\n" +"An unsafe function is sound when both its safety preconditions and its internal unsafe " +"blocks are documented." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"RTC: {time}\"" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "Fixes needed in `main`." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "// Wait for 3 seconds, without interrupts.\n" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "" +"`a` does not satisfy one of the preconditions of `copy` (source\\` data ends with a null " +"byte within its memory allocation)" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"Waiting for {}\"" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/documented-safety-preconditions.md +msgid "SAFETY comment needed" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"matched={}, interrupt_pending={}\"" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/crying-wolf.md +msgid "“It is also possible to create so-called crying wolf functions." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "\"Finished waiting\"" +#: src/unsafe-deep-dive/rules-of-the-game/copying-memory/crying-wolf.md +msgid "" +"“These are functions which are tagged as unsafe, but which have no safety preconditions " +"that programmers need to check." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "// Wait another 3 seconds for an interrupt.\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "3 Shapes of Sound Rust" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md #, fuzzy -msgid "_pl031.rs_:" -msgstr "`pl031.rs` :" +msgid "Functions written only in Safe Rust" +msgstr "Fonctions d'appel écrites dans d'autres langages depuis Rust." -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Data register\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "Functions that contain `unsafe` blocks which are impossible to misuse" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Match register\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "Unsafe functions that have their safety preconditions documented" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Load register\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "We want to write sound code." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Control register\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "Sound code can only have the following shapes:" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Interrupt Mask Set or Clear register\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "safe functions that contain no unsafe blocks" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Raw Interrupt Status\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "" +"safe functions that completely encapsulate unsafe blocks, meaning that the caller does " +"not need to know about them" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Masked Interrupt Status\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "" +"unsafe functions that contain unsafe blocks but don't encapsulate them, and pass the " +"proof burden to their caller" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Interrupt Clear Register\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "Burden of proof" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -#, fuzzy -msgid "/// Driver for a PL031 real-time clock.\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "safe functions with only Safe Rust -> compiler" msgstr "" -"Nous allons écrire un pilote pour le dispositif d'horloge en temps réel " -"PL031." -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "" -"/// Constructs a new instance of the RTC driver for a PL031 device at the\n" -" /// given base address.\n" -" ///\n" -" /// # Safety\n" -" ///\n" -" /// The given base address must point to the MMIO control registers of " -"a\n" -" /// PL031 device, which must be mapped into the address space of the " -"process\n" -" /// as device memory and not have any other aliases.\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "safe functions with unsafe blocks -> function author" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Reads the current RTC value.\n" +#: src/unsafe-deep-dive/rules-of-the-game/3-shapes-of-sound-rust.md +msgid "unsafe functions -> function caller" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/soundness.md +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md msgid "" -"// Safe because we know that self.registers points to the control\n" -" // registers of a PL031 device which is appropriately mapped.\n" +"A sound function is one that can't trigger UB if its safety preconditions are satisfied." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "" -"/// Writes a match value. When the RTC value matches this then an interrupt\n" -" /// will be generated (if it is enabled).\n" +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/soundness.md +msgid "Read the definition of sound functions." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/soundness.md msgid "" -"/// Returns whether the match register matches the RTC value, whether or " -"not\n" -" /// the interrupt is enabled.\n" +"Remind the students that the programmer who implements the caller is responsible for " +"satisfying the safety precondition; the compiler is not helping." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/soundness.md msgid "" -"/// Returns whether there is currently an interrupt pending.\n" -" ///\n" -" /// This should be true if and only if `matched` returns true and the\n" -" /// interrupt is masked.\n" +"Translate into informal terms. Soundness means that the function is nice and plays by the " +"rules. It documents its safety preconditions, and when the caller satisfies them, the " +"function behaves well (no UB)." msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "" -"/// Sets or clears the interrupt mask.\n" -" ///\n" -" /// When the mask is true the interrupt is enabled; when it is false " -"the\n" -" /// interrupt is disabled.\n" +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "Soundness Proof (Part 2)" msgstr "" -#: src/exercises/bare-metal/solutions-afternoon.md -msgid "/// Clears a pending interrupt, if any.\n" +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "Corollary: All functions implemented in pure safe Rust are sound." msgstr "" -#: src/concurrency.md -#, fuzzy -msgid "Welcome to Concurrency in Rust" -msgstr "Bienvenue à Comprehensive Rust(le guide complet de Rust) 🦀" +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "Proof:" +msgstr "" -#: src/concurrency.md -#, fuzzy -msgid "" -"Rust has full support for concurrency using OS threads with mutexes and " -"channels." +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "Safe Rust code has no safety preconditions." msgstr "" -"Rust prend entièrement en charge la concurrence en utilisant des threads de " -"système d'exploitation avec des mutex et canaux." -#: src/concurrency.md -#, fuzzy +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md msgid "" -"The Rust type system plays an important role in making many concurrency bugs " -"compile time bugs. This is often referred to as _fearless concurrency_ since " -"you can rely on the compiler to ensure correctness at runtime." +"Therefore, callers of functions implemented in pure safe Rust always trivially satisfy " +"the empty set of preconditions." msgstr "" -"Le système de type Rust joue un rôle important dans la création de nombreux " -"bugs de concurrence bogues de temps de compilation. Ceci est souvent appelé " -"_concurrence sans peur_ puisque vous peut compter sur le compilateur pour " -"assurer l'exactitude au moment de l'exécution." -#: src/concurrency.md -msgid "" -"Rust lets us access OS concurrency toolkit: threads, sync. primitives, etc." +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "Safe Rust code can't trigger UB." +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "QED." +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "Read the corollary." +msgstr "" + +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md +msgid "Explain the proof." msgstr "" -#: src/concurrency.md +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/corollary.md msgid "" -"The type system gives us safety for concurrency without any special features." +"Translate into informal terms: all safe Rust code is nice. It does not have safety " +"preconditions that the programmer has to think of, always plays by the rules, and never " +"triggers UB." msgstr "" -#: src/concurrency.md +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md msgid "" -"The same tools that help with \"concurrent\" access in a single thread (e." -"g., a called function that might mutate an argument or save references to it " -"to read later) save us from multi-threading issues." +"An unsound function can trigger UB even if you satisfy the documented safety " +"preconditions." msgstr "" -#: src/concurrency/threads.md -#, fuzzy -msgid "Rust threads work similarly to threads in other languages:" +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md +msgid "Unsound code is _bad_." msgstr "" -"Les threads Rust fonctionnent de la même manière que les threads dans " -"d'autres langages :" -#: src/concurrency/threads.md -msgid "\"Count in thread: {i}!\"" +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md +msgid "Read the definition of unsound functions." msgstr "" -#: src/concurrency/threads.md -msgid "\"Main thread: {i}\"" +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md +msgid "" +"Translate into informal terms: unsound code is not nice. No, that's an understatement. " +"Unsound code is BAD. Even if you play by the documented rules, unsound code can still " +"trigger UB!" msgstr "" -#: src/concurrency/threads.md -#, fuzzy -msgid "Threads are all daemon threads, the main thread does not wait for them." +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md +msgid "We don't want any unsound code in our repositories." msgstr "" -"Les threads sont tous des threads démons, le thread principal ne les attend " -"pas." -#: src/concurrency/threads.md -#, fuzzy -msgid "Thread panics are independent of each other." -msgstr "Les thread panics sont indépendants les uns des autres." +#: src/unsafe-deep-dive/rules-of-the-game/soundness-proof/unsoundness.md +msgid "Finding unsound code is the **primary** goal of the code review." +msgstr "" -#: src/concurrency/threads.md -#, fuzzy -msgid "Panics can carry a payload, which can be unpacked with `downcast_ref`." +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "Memory moves through different phases as objects (values) are created and destroyed." msgstr "" -"Les paniques peuvent transporter une charge utile, qui peut être " -"décompressée avec `downcast_ref`." -#: src/concurrency/threads.md -msgid "Rust thread APIs look not too different from e.g. C++ ones." +#: src/unsafe-deep-dive/memory-lifecycle.md +#, fuzzy +msgid "Memory State" +msgstr "Gestion de la mémoire" + +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "Readable from Safe Rust?" msgstr "" -#: src/concurrency/threads.md +#: src/unsafe-deep-dive/memory-lifecycle.md #, fuzzy -msgid "Run the example." -msgstr "Exécutez l'exemple avec :" +msgid "Available" +msgstr "Variables" -#: src/concurrency/threads.md -msgid "" -"5ms timing is loose enough that main and spawned threads stay mostly in " -"lockstep." +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "Allocated" msgstr "" -#: src/concurrency/threads.md -msgid "Notice that the program ends before the spawned thread reaches 10!" +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "Initialized" msgstr "" -#: src/concurrency/threads.md +#: src/unsafe-deep-dive/memory-lifecycle.md msgid "" -"This is because main ends the program and spawned threads do not make it " -"persist." +"This section discusses what happens as memory from the operating system becomes a valid " +"variable in the program." msgstr "" -#: src/concurrency/threads.md -msgid "Compare to pthreads/C++ std::thread/boost::thread if desired." +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "When memory is available, the operating system has provided our program with it." msgstr "" -#: src/concurrency/threads.md -msgid "How do we wait around for the spawned thread to complete?" +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "" +"When memory is allocated, it is reserved for values to be written to it. We call this " +"uninitialized memory." msgstr "" -#: src/concurrency/threads.md -#, fuzzy -msgid "" -"[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html) " -"returns a `JoinHandle`. Look at the docs." +#: src/unsafe-deep-dive/memory-lifecycle.md +msgid "When memory is initialized, it is safe to read from." msgstr "" -"[`Default`](https://doc.rust-lang.org/std/default/trait.Default.html) " -"utilisé pour construire une instance par défaut d'un type." -#: src/concurrency/threads.md -msgid "" -"`JoinHandle` has a [`.join()`](https://doc.rust-lang.org/std/thread/struct." -"JoinHandle.html#method.join) method that blocks." +#: src/unsafe-deep-dive/initialization/maybeuninit.md +msgid "`MaybeUninit` allows Rust to refer to uninitialized memory." msgstr "" -#: src/concurrency/threads.md -#, fuzzy -msgid "" -"Use `let handle = thread::spawn(...)` and later `handle.join()` to wait for " -"the thread to finish and have the program count all the way to 10." +#: src/unsafe-deep-dive/initialization/maybeuninit.md +msgid "\"{uninit:?}\"" msgstr "" -"Utilisez `let handle = thread::spawn(...)` et plus tard `handle.join()` pour " -"attendre le fil pour finir." -#: src/concurrency/threads.md -msgid "Now what if we want to return a value?" +#: src/unsafe-deep-dive/initialization/maybeuninit.md +msgid "“Safe Rust is unable to refer to data that’s potentially uninitialized”" msgstr "" -#: src/concurrency/threads.md -msgid "Look at docs again:" +#: src/unsafe-deep-dive/initialization/maybeuninit.md +msgid "“Yet, all data arrives at the program as uninitialized.”" msgstr "" -#: src/concurrency/threads.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit.md msgid "" -"[`thread::spawn`](https://doc.rust-lang.org/std/thread/fn.spawn.html)'s " -"closure returns `T`" +"“Therefore, we need some bridge in the type system to allow memory to transition. " +"`MaybeUninit` is that type.”" msgstr "" -"Cependant, vous pouvez utiliser un [fil de discussion de portée](https://doc." -"rust-lang.org/std/thread/fn.scope.html) pour cela :" -#: src/concurrency/threads.md +#: src/unsafe-deep-dive/initialization/maybeuninit.md msgid "" -"`JoinHandle` [`.join()`](https://doc.rust-lang.org/std/thread/struct." -"JoinHandle.html#method.join) returns `thread::Result`" +"“`MaybeUninit` is very similar to the `Option` type, although its semantics are " +"very different. The equivalent of `Option::None` for `MaybeUninit` is uninitialized " +"memory, which is only safe to write to.”" msgstr "" -#: src/concurrency/threads.md -#, fuzzy -msgid "" -"Use the `Result` return value from `handle.join()` to get access to the " -"returned value." +#: src/unsafe-deep-dive/initialization/maybeuninit.md +msgid "“Reading from memory that may be uninitialized is extremely dangerous.”" msgstr "" -"Utilisez la valeur de retour `Result` de `handle.join()` pour accéder à la " -"panique charge utile. C'est le bon moment pour parler de \\[`Tous`\\]." -#: src/concurrency/threads.md -msgid "Ok, what about the other case?" +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "MaybeUninit and arrays" msgstr "" -#: src/concurrency/threads.md -#, fuzzy -msgid "Trigger a panic in the thread. Note that this doesn't panic `main`." +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "b\"RUST\"" msgstr "" -"Déclenchez une panique dans le fil, notez que cela n'affecte pas `main`." -#: src/concurrency/threads.md -#, fuzzy -msgid "" -"Access the panic payload. This is a good time to talk about [`Any`](https://" -"doc.rust-lang.org/std/any/index.html)." +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "// Initialize elements by writing values to the memory\n" msgstr "" -"Utilisez la valeur de retour `Result` de `handle.join()` pour accéder à la " -"panique charge utile. C'est le bon moment pour parler de \\[`Tous`\\]." -#: src/concurrency/threads.md -msgid "Now we can return values from threads! What about taking inputs?" +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "" +"// When a portion of an array is initialized, one can\n" +" // use unsafe to isolate it\n" msgstr "" -#: src/concurrency/threads.md -msgid "Capture something by reference in the thread closure." +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +#: src/unsafe-deep-dive/initialization/partial-initialization.md +msgid "\"{text}\"" msgstr "" -#: src/concurrency/threads.md -msgid "An error message indicates we must move it." +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "// We must manually drop the initialized elements\n" msgstr "" -#: src/concurrency/threads.md -msgid "Move it in, see we can compute and then return a derived value." +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "" +"To create an array of uninitialized memory, the `::uninit()` constructor can be used " +"within a `const` context." msgstr "" -#: src/concurrency/threads.md -msgid "If we want to borrow?" +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "Use `ptr::write` to initialize values as per normal." msgstr "" -#: src/concurrency/threads.md +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md msgid "" -"Main kills child threads when it returns, but another function would just " -"return and leave them running." +"`.assume_init()` does not work as easily for arrays. It requires every value to be " +"initialized, which may not occur when reusing a buffer. This example uses a pointer to " +"isolate the initialized bytes to create a string slice." msgstr "" -#: src/concurrency/threads.md -msgid "That would be stack use-after-return, which violates memory safety!" +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "" +"When creating a sub-slice of a partially-initialized array, be careful with ownership and " +"correctly implementing drop. Reminder: `MaybeUninit` will not call drop on its `T`." msgstr "" -#: src/concurrency/threads.md -msgid "How do we avoid this? see next slide." +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md +msgid "" +"`MaybeUninit<[u8;2048]>` is distinct from `[MaybeUninit::; 2048]`. This is the " +"difference between an array of uninitialized memory and an array that contains " +"uninitialized elements." msgstr "" -#: src/concurrency/scoped-threads.md -#, fuzzy -msgid "Normal threads cannot borrow from their environment:" -msgstr "Les threads normaux ne peuvent pas emprunter à leur environnement :" - -#: src/concurrency/scoped-threads.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md msgid "" -"However, you can use a [scoped thread](https://doc.rust-lang.org/std/thread/" -"fn.scope.html) for this:" +"`MaybeUninit<[u8;2048]>` is \"all or nothing\". You either fully initialize the whole " +"array and then call `assume_init`, or you must keep it as `MaybeUninit<[u8; 2048]>` and " +"avoid touching it as `[u8; 2048]`." msgstr "" -"Cependant, vous pouvez utiliser un [fil de discussion de portée](https://doc." -"rust-lang.org/std/thread/fn.scope.html) pour cela :" -#: src/concurrency/scoped-threads.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md msgid "" -"The reason for that is that when the `thread::scope` function completes, all " -"the threads are guaranteed to be joined, so they can return borrowed data." +"`[MaybeUninit; 2048]` lets you initialize elements one at a time, then take a sub-" +"slice of just the initialized prefix and treat it as `[u8]` via `std::slice::" +"from_raw_parts`." msgstr "" -"La raison en est que lorsque la fonction `thread::scope` se termine, tous " -"les threads sont garantis d'être joints, afin qu'ils puissent renvoyer des " -"données empruntées." -#: src/concurrency/scoped-threads.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md msgid "" -"Normal Rust borrowing rules apply: you can either borrow mutably by one " -"thread, or immutably by any number of threads." +"`slice_assume_init_ref` is safe only when every element in the slice is initialized. For " +"this example, we only pass `&buf[..input.len()]` after writing exactly those bytes." msgstr "" -"Les règles d'emprunt normales de Rust s'appliquent : vous pouvez soit " -"emprunter de manière mutable par un thread, soit de manière immuable par " -"n'importe quel nombre de threads." -#: src/concurrency/channels.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/arrays.md msgid "" -"Rust channels have two parts: a `Sender` and a `Receiver`. The two " -"parts are connected via the channel, but you only see the end-points." +"When `T` needs drop, you must manually call `assume_init_drop()` for the initialized " +"elements. Skipping this leaks memory. However, calling it on an uninitialized element is " +"undefined behavior." msgstr "" -"Les canaux Rust ont deux parties : un `Sender` et un `Receiver`. Les " -"deux parties sont connectés via le canal, mais vous ne voyez que les " -"extrémités." -#: src/concurrency/channels.md -msgid "\"Received: {:?}\"" +#: src/unsafe-deep-dive/initialization/maybeuninit/zeroed-method.md +msgid "// SAFETY: All values of `x` have been written to\n" msgstr "" -#: src/concurrency/channels.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/zeroed-method.md +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "\"{x:?}\"" +msgstr "" + +#: src/unsafe-deep-dive/initialization/maybeuninit/zeroed-method.md msgid "" -"`mpsc` stands for Multi-Producer, Single-Consumer. `Sender` and `SyncSender` " -"implement `Clone` (so you can make multiple producers) but `Receiver` does " -"not." +"“MaybeUninit::zeroed() is an alternative constructor to MaybeUninit::uninit(). It " +"instructs the compiler to fill the bits of T with zeros.”" msgstr "" -"`mpsc` signifie Multi-Producer, Single-Consumer. `Sender` et `SyncSender` " -"implémentent `Clone` (donc vous pouvez créer plusieurs producteurs) mais " -"`Receiver` ne le fait pas." -#: src/concurrency/channels.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/zeroed-method.md msgid "" -"`send()` and `recv()` return `Result`. If they return `Err`, it means the " -"counterpart `Sender` or `Receiver` is dropped and the channel is closed." +"Q: “Although the memory has been written to, the type remains `MaybeUninit`. Can " +"anyone think of why?”" msgstr "" -"`send()` et `recv()` renvoient `Result`. S'ils renvoient `Err`, cela " -"signifie que la contrepartie `Sender` ou `Receiver` est supprimé et le canal " -"est fermé." -#: src/concurrency/channels/unbounded.md -#, fuzzy -msgid "You get an unbounded and asynchronous channel with `mpsc::channel()`:" -msgstr "Vous obtenez un canal illimité et asynchrone avec `mpsc::channel()` :" +#: src/unsafe-deep-dive/initialization/maybeuninit/zeroed-method.md +msgid "" +"A: Some types require their values to be non-zero or non-null. The classic case is " +"references, but this applies to many other types as well. Consider the `NonZeroUsize` " +"integer type and others in its family." +msgstr "" -#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md -msgid "\"Message {i}\"" +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md +msgid "MaybeUninit.write() vs assignment" msgstr "" -#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md -msgid "\"{thread_id:?}: sent Message {i}\"" +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md +msgid "// Initialize\n" msgstr "" -#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md -msgid "\"{thread_id:?}: done\"" +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md +msgid "// Overwrite\n" msgstr "" -#: src/concurrency/channels/unbounded.md src/concurrency/channels/bounded.md -msgid "\"Main: got {msg}\"" +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md +msgid "\"Hi again\"" msgstr "" -#: src/concurrency/channels/bounded.md -#, fuzzy -msgid "" -"With bounded (synchronous) channels, `send` can block the current thread:" +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md +msgid "// Assignment replaces the whole MaybeUninit value.\n" msgstr "" -"Les canaux bornés et synchrones font que \"send\" bloque le thread actuel :" -#: src/concurrency/channels/bounded.md -msgid "" -"Calling `send` will block the current thread until there is space in the " -"channel for the new message. The thread can be blocked indefinitely if there " -"is nobody who reads from the channel." +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md +msgid "\"Goodbye\"" msgstr "" -#: src/concurrency/channels/bounded.md -msgid "" -"A call to `send` will abort with an error (that is why it returns `Result`) " -"if the channel is closed. A channel is closed when the receiver is dropped." +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md +msgid "// Ensure inner value is dropped\n" msgstr "" -#: src/concurrency/channels/bounded.md +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md msgid "" -"A bounded channel with a size of zero is called a \"rendezvous channel\". " -"Every send will block the current thread until another thread calls `recv`." +"Replacing inner values can cause memory leaks because the drop semantics differ from most " +"types. `MaybeUninit` does not call the destructor on its `T`." msgstr "" -#: src/concurrency/send-sync.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md msgid "" -"How does Rust know to forbid shared access across threads? The answer is in " -"two traits:" +"`MaybeUninit::write()` uses `ptr::write`: it initializes the memory in place without " +"reading or dropping the old contents. That is exactly what you want when the memory might " +"be uninitialized, but it also means you will leak if there was already a live value there." msgstr "" -"Comment Rust sait-il interdire l'accès partagé à travers le thread? La " -"réponse est en deux traits :" -#: src/concurrency/send-sync.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md msgid "" -"[`Send`](https://doc.rust-lang.org/std/marker/trait.Send.html): a type `T` " -"is `Send` if it is safe to move a `T` across a thread boundary." +"Assignment, e.g. `buf = MaybeUninit::new(value)`, replaces the whole `MaybeUninit`. The " +"old `MaybeUninit` is moved and then dropped, but `MaybeUninit` has no destructor for `T`, " +"so the inner value is not dropped. If the old slot held an initialized value, it is " +"leaked just like with `write()`." msgstr "" -"[`Send`](https://doc.rust-lang.org/std/marker/trait.Send.html) : un type `T` " -"est `Send` s'il est sûr de déplacer un `T` à travers un thread frontière." -#: src/concurrency/send-sync.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/maybeuninit/write-vs-assignment.md msgid "" -"[`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync.html): a type `T` " -"is `Sync` if it is safe to move a `&T` across a thread boundary." +"If you need normal drop behavior, you need to tell Rust that the value is initialized " +"with `assume_init` or one of the related methods." msgstr "" -"[`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync.html) : un type `T` " -"est `Sync` s'il est sûr de déplacer un `&T` à travers un thread frontière." -#: src/concurrency/send-sync.md -#, fuzzy -msgid "" -"`Send` and `Sync` are [unsafe traits](../unsafe/unsafe-traits.md). The " -"compiler will automatically derive them for your types as long as they only " -"contain `Send` and `Sync` types. You can also implement them manually when " -"you know it is valid." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "How to Initialize Memory" msgstr "" -"`Send` et `Sync` sont des \\[caractéristiques non sécurisées\\] [3](../" -"unsafe/unsafe-traits.md). Le compilateur les dérivera automatiquement pour " -"vos types tant qu'ils ne contiennent que les types `Send` et `Sync`. Vous " -"pouvez également les implémenter manuellement lorsque vous sachez qu'il est " -"valide." -#: src/concurrency/send-sync.md -#, fuzzy -msgid "" -"One can think of these traits as markers that the type has certain thread-" -"safety properties." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "Steps:" msgstr "" -"On peut considérer ces traits comme des marqueurs indiquant que le type " -"possède certaines propriétés de sécurité des threads." -#: src/concurrency/send-sync.md -#, fuzzy -msgid "They can be used in the generic constraints as normal traits." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "Create `MaybeUninit`" msgstr "" -"Ils peuvent être utilisés dans les contraintes génériques comme des traits " -"normaux." -#: src/concurrency/send-sync/send.md -#, fuzzy -msgid "" -"A type `T` is [`Send`](https://doc.rust-lang.org/std/marker/trait.Send.html) " -"if it is safe to move a `T` value to another thread." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "Write a value to it" msgstr "" -"Un type `T` est [`Send`](https://doc.rust-lang.org/std/marker/trait.Send." -"html) s'il est sûr de déplacer une valeur `T` vers un autre thread." -#: src/concurrency/send-sync/send.md -#, fuzzy -msgid "" -"The effect of moving ownership to another thread is that _destructors_ will " -"run in that thread. So the question is when you can allocate a value in one " -"thread and deallocate it in another." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "Notify Rust that the memory is initialized" msgstr "" -"L'effet du déplacement de la propriété vers un autre thread est que " -"_destructors_ s'exécutera dans ce fil. La question est donc de savoir quand " -"vous pouvez allouer une valeur dans un thread et le désallouer dans un autre." -#: src/concurrency/send-sync/send.md -msgid "" -"As an example, a connection to the SQLite library must only be accessed from " -"a single thread." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "// Step 1: Create MaybeUninit\n" msgstr "" -#: src/concurrency/send-sync/sync.md -#, fuzzy -msgid "" -"A type `T` is [`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync.html) " -"if it is safe to access a `T` value from multiple threads at the same time." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "// Step 2: Write a valid value to the memory\n" msgstr "" -"Un type `T` est [`Sync`](https://doc.rust-lang.org/std/marker/trait.Sync." -"html) s'il est sûr d'accéder à une valeur `T` à partir de plusieurs fils en " -"même temps." -#: src/concurrency/send-sync/sync.md -#, fuzzy -msgid "More precisely, the definition is:" -msgstr "Plus précisément, la définition est :" +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "// Step 3: Inform the type system that the memory location is valid\n" +msgstr "" -#: src/concurrency/send-sync/sync.md -#, fuzzy -msgid "`T` is `Sync` if and only if `&T` is `Send`" -msgstr "`T` est `Sync` si et seulement si `&T` est `Envoyer`" +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "\"{init}\"" +msgstr "" -#: src/concurrency/send-sync/sync.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md msgid "" -"This statement is essentially a shorthand way of saying that if a type is " -"thread-safe for shared use, it is also thread-safe to pass references of it " -"across threads." +"To work with uninitialized memory, follow this general workflow: create, write, confirm." msgstr "" -"Cette déclaration est essentiellement une manière abrégée de dire que si un " -"type est thread-safe pour une utilisation partagée, il est également thread-" -"safe pour en passer des références à travers les threads." -#: src/concurrency/send-sync/sync.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md msgid "" -"This is because if a type is Sync it means that it can be shared across " -"multiple threads without the risk of data races or other synchronization " -"issues, so it is safe to move it to another thread. A reference to the type " -"is also safe to move to another thread, because the data it references can " -"be accessed from any thread safely." +"Create `MaybeUninit`. The `::uninit()` constructor is the most general-purpose one, " +"but there are others which perform a write as well." msgstr "" -"En effet, si un type est Sync, cela signifie qu'il peut être partagé sur " -"plusieurs threads sans risque de courses de données ou d'autres problèmes de " -"synchronisation, il est donc sûr de le déplacer vers un autre thread. Une " -"référence au type peut également être déplacée en toute sécurité vers un " -"autre thread, car les données auxquelles elle fait référence sont " -"accessibles à partir de n'importe quel thread en toute sécurité." - -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "`Send + Sync`" -msgstr "`Envoyer + Synchroniser`" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "Most types you come across are `Send + Sync`:" -msgstr "La plupart des types que vous rencontrez sont `Send + Sync` :" - -#: src/concurrency/send-sync/examples.md -msgid "`i8`, `f32`, `bool`, `char`, `&str`, ..." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "" +"Write a value of T. Notice that this is available from safe Rust. Staying in safe Rust is " +"useful because you must ensure that the value you write is valid." msgstr "" -#: src/concurrency/send-sync/examples.md -msgid "`(T1, T2)`, `[T; N]`, `&[T]`, `struct { x: T }`, ..." +#: src/unsafe-deep-dive/initialization/how-to-initialize-memory.md +msgid "" +"Confirm to the type system that the memory is now initialized with the `.assume_init()` " +"method." msgstr "" -#: src/concurrency/send-sync/examples.md -msgid "`String`, `Option`, `Vec`, `Box`, ..." +#: src/unsafe-deep-dive/initialization/partial-initialization.md +msgid "Partial Initialization" msgstr "" -#: src/concurrency/send-sync/examples.md -msgid "`Arc`: Explicitly thread-safe via atomic reference count." +#: src/unsafe-deep-dive/initialization/partial-initialization.md +msgid "// let mut buf = [0u8; 2048];\n" msgstr "" -#: src/concurrency/send-sync/examples.md -msgid "`Mutex`: Explicitly thread-safe via internal locking." +#: src/unsafe-deep-dive/initialization/partial-initialization.md +#, fuzzy +msgid "b\"Hello, Rust!\"" +msgstr "Bonjour le monde!" + +#: src/unsafe-deep-dive/initialization/partial-initialization.md +msgid "// SAFETY: We initialized exactly 'len' bytes of `buf` with UTF-8 text\n" msgstr "" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "`mpsc::Sender`: As of 1.72.0." -msgstr "`mpsc::Expéditeur`" +#: src/unsafe-deep-dive/initialization/partial-initialization.md +msgid "This code simulates receiving data from some external source." +msgstr "" -#: src/concurrency/send-sync/examples.md -msgid "`AtomicBool`, `AtomicU8`, ...: Uses special atomic instructions." +#: src/unsafe-deep-dive/initialization/partial-initialization.md +msgid "" +"When reading bytes from an external source into a buffer, you typically don't know how " +"many bytes you'll receive. Using `MaybeUninit` lets you allocate the buffer once " +"without paying for a redundant initialization pass." msgstr "" -#: src/concurrency/send-sync/examples.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/partial-initialization.md msgid "" -"The generic types are typically `Send + Sync` when the type parameters are " -"`Send + Sync`." +"If we were to create the array with the standard syntax (`buf = [0u8; 2048]`), the whole " +"buffer would be flushed with zeroes. `MaybeUninit` tells the compiler to reserve " +"space, but not to touch the memory yet." msgstr "" -"Les types génériques sont généralement \"Send + Sync\" lorsque les " -"paramètres de type sont `Envoyer + Synchroniser`." -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "`Send + !Sync`" -msgstr "`Envoyer + !Sync`" +#: src/unsafe-deep-dive/initialization/partial-initialization.md +msgid "" +"Q: Which part of the code snippet is performing a similar role to `.assume_init()`? A: " +"The pointer cast and the implicit read." +msgstr "" -#: src/concurrency/send-sync/examples.md -#, fuzzy +#: src/unsafe-deep-dive/initialization/partial-initialization.md msgid "" -"These types can be moved to other threads, but they're not thread-safe. " -"Typically because of interior mutability:" +"We cannot call `assume_init()` on the whole array. That would be unsound because most " +"elements remain uninitialized. Instead, we cast the pointer from `*const MaybeUninit` " +"to `*const u8` and build a slice covering only the initialised portion." msgstr "" -"Ces types peuvent être déplacés vers d'autres threads, mais ils ne sont pas " -"thread-safe. Typiquement à cause de la mutabilité intérieure :" -#: src/concurrency/send-sync/examples.md +#: src/unsafe-deep-dive/pinning.md #, fuzzy -msgid "`mpsc::Receiver`" -msgstr "`mpsc::Récepteur`" +msgid "This segment of the course covers:" +msgstr "Cette page est destinée au formateur." -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "`Cell`" -msgstr "`Cellule`" +#: src/unsafe-deep-dive/pinning.md +msgid "What \"pinning\" is" +msgstr "" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "`RefCell`" -msgstr "`RefCell`" +#: src/unsafe-deep-dive/pinning.md +msgid "Why it is necessary" +msgstr "" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "`!Send + Sync`" -msgstr "` !Envoyer + Synchroniser`" +#: src/unsafe-deep-dive/pinning.md +msgid "How Rust implements it" +msgstr "" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "" -"These types are thread-safe, but they cannot be moved to another thread:" +#: src/unsafe-deep-dive/pinning.md +msgid "How it interacts with unsafe and FFI" msgstr "" -"Ces types sont thread-safe, mais ils ne peuvent pas être déplacés vers un " -"autre thread :" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "" -"`MutexGuard`: Uses OS level primitives which must be deallocated on " -"the thread which created them." +#: src/unsafe-deep-dive/pinning.md src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "This segment should take about 1 hour and 20 minutes. It contains:" msgstr "" -"`MutexGuard` : utilise des primitives au niveau du système d'exploitation " -"qui doivent être désallouées sur le fil qui les a créés." -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "`!Send + !Sync`" -msgstr "`!Envoyer + !Synchroniser`" +#: src/unsafe-deep-dive/pinning.md src/unsafe-deep-dive/pinning/definition-of-pin.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "Definition of Pin" +msgstr "" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "These types are not thread-safe and cannot be moved to other threads:" +#: src/unsafe-deep-dive/pinning.md src/unsafe-deep-dive/pinning/phantompinned.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "PhantomPinned" msgstr "" -"Ces types ne sont pas thread-safe et ne peuvent pas être déplacés vers " -"d'autres threads :" -#: src/concurrency/send-sync/examples.md -#, fuzzy -msgid "" -"`Rc`: each `Rc` has a reference to an `RcBox`, which contains a non-" -"atomic reference count." +#: src/unsafe-deep-dive/pinning.md src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "Pin and Drop" msgstr "" -"`Rc` : chaque `Rc` a une référence à un `RcBox`, qui contient un " -"comptage de référence non atomique." -#: src/concurrency/send-sync/examples.md -#, fuzzy +#: src/unsafe-deep-dive/pinning.md msgid "" -"`*const T`, `*mut T`: Rust assumes raw pointers may have special concurrency " -"considerations." +"\"Pinning, or holding a value's memory address in a fixed location,is one of the more " +"challenging concepts in Rust.\"" msgstr "" -"`*const T`, `*mut T` : Rust suppose que les pointeurs bruts peuvent avoir " -"des considérations de concurrence." -#: src/concurrency/shared_state.md -#, fuzzy +#: src/unsafe-deep-dive/pinning.md msgid "" -"Rust uses the type system to enforce synchronization of shared data. This is " -"primarily done via two types:" +"\"Normally only seen within async code, i.e. [`poll(self: Pin<&mut Self>)`](https://doc." +"rust-lang.org/std/future/trait.Future.html#tymethod.poll), pinning has wider " +"applicability.\"" msgstr "" -"Rust utilise le système de type pour appliquer la synchronisation des " -"données partagées. C'est se fait principalement via deux types:" -#: src/concurrency/shared_state.md -#, fuzzy +#: src/unsafe-deep-dive/pinning.md msgid "" -"[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html), atomic " -"reference counted `T`: handles sharing between threads and takes care to " -"deallocate `T` when the last reference is dropped," +"Some data structures that are difficult or impossible to write without the unsafe " +"keyword, including self-referential structs and intrusive data structures." msgstr "" -"[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html), référence " -"atomique comptée `T` : gère le partage entre les threads et prend soin de " -"désallouer 'T' lorsque la dernière référence est supprimée," -#: src/concurrency/shared_state.md -#, fuzzy +#: src/unsafe-deep-dive/pinning.md msgid "" -"[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html): ensures " -"mutually exclusive access to the `T` value." +"FFI with C++ is a prominent use case that's related to this. Rust must assume that any C+" +"+ with a reference might be a self-referential data structure." msgstr "" -"[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) : " -"garantit un accès mutuellement exclusif à la valeur `T`." -#: src/concurrency/shared_state/arc.md -#, fuzzy +#: src/unsafe-deep-dive/pinning.md msgid "" -"[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html) allows shared " -"read-only access via `Arc::clone`:" +"\"To understand this conflict in more detail, we'll first need to make sure that we have " +"a strong understanding of Rust's move semantics.\"" msgstr "" -"[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html) permet un " -"accès partagé en lecture seule via sa méthode `clone` :" -#: src/concurrency/shared_state/arc.md -msgid "\"{thread_id:?}: {v:?}\"" +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +msgid "A pinned type cannot change its memory address (move)" msgstr "" -#: src/concurrency/shared_state/arc.md src/concurrency/shared_state/example.md -msgid "\"v: {v:?}\"" +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +msgid "The pointed-to value cannot be moved by safe code" msgstr "" -#: src/concurrency/shared_state/arc.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-pinning-is.md msgid "" -"`Arc` stands for \"Atomic Reference Counted\", a thread safe version of `Rc` " -"that uses atomic operations." +"`Pin` makes use of the ownership system to control how the pinned value is accessed. " +"Rather than changing the language, Rust's ownership system is used to enforce pinning. " +"`Pin` owns its contents and nothing in its safe API triggers a move." msgstr "" -"`Arc` signifie \"Atomic Reference Counted\", une version thread-safe de `Rc` " -"qui utilise opérations." -#: src/concurrency/shared_state/arc.md -#, fuzzy -msgid "" -"`Arc` implements `Clone` whether or not `T` does. It implements `Send` " -"and `Sync` if and only if `T` implements them both." +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +msgid "This is explained in" msgstr "" -"`Arc` implémente `Clone` que `T` le fasse ou non. Il implémente `Send` et " -"`Sync` ssi `T` les met en œuvre tous les deux." -#: src/concurrency/shared_state/arc.md -#, fuzzy -msgid "" -"`Arc::clone()` has the cost of atomic operations that get executed, but " -"after that the use of the `T` is free." +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +msgid "Conceptually, pinning prevents the default movement behavior." msgstr "" -"`Arc::clone()` a le coût des opérations atomiques qui sont exécutées, mais " -"après cela, l'utilisation du 'T' est libre." -#: src/concurrency/shared_state/arc.md -#, fuzzy -msgid "" -"Beware of reference cycles, `Arc` does not use a garbage collector to detect " -"them." +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +msgid "This appears to be a change in the language itself." msgstr "" -"Méfiez-vous des cycles de référence, `Arc` n'utilise pas de ramasse-miettes " -"pour les détecter." - -#: src/concurrency/shared_state/arc.md -#, fuzzy -msgid "`std::sync::Weak` can help." -msgstr "`std::sync::Weak` peut aider." -#: src/concurrency/shared_state/mutex.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-pinning-is.md msgid "" -"[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) ensures " -"mutual exclusion _and_ allows mutable access to `T` behind a read-only " -"interface (another form of [interior mutability](../../borrowing/interior-" -"mutability)):" +"However, the `Pin` wrapper doesn't actually change anything fundamental about the " +"language." msgstr "" -"[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) garantit " -"l'exclusion mutuelle _et_ permet un accès mutable à `T` derrière une " -"interface en lecture seule :" -#: src/concurrency/shared_state/mutex.md -msgid "\"v: {:?}\"" +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +msgid "" +"`Pin` doesn't expose safe APIs that would allow a move. Thus, it can prevent bitwise copy." msgstr "" -#: src/concurrency/shared_state/mutex.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-pinning-is.md msgid "" -"Notice how we have a [`impl Sync for Mutex`](https://doc.rust-" -"lang.org/std/sync/struct.Mutex.html#impl-Sync-for-Mutex%3CT%3E) blanket " -"implementation." +"Unsafe APIs allow library authors to wrap types that do not implement `Unpin`, but they " +"must uphold the same guarantees." msgstr "" -"Remarquez comment nous avons une couverture [`impl Sync for " -"Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html#impl-Sync-" -"for-Mutex%3CT%3E) mise en œuvre." -#: src/concurrency/shared_state/mutex.md -#, fuzzy -msgid "" -"`Mutex` in Rust looks like a collection with just one element --- the " -"protected data." +#: src/unsafe-deep-dive/pinning/what-pinning-is.md +msgid "The documentation of `Pin` uses the term \"pointer types\"." msgstr "" -"`Mutex` dans Rust ressemble à une collection avec un seul élément - les " -"données protégées." -#: src/concurrency/shared_state/mutex.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-pinning-is.md msgid "" -"It is not possible to forget to acquire the mutex before accessing the " -"protected data." +"The term \"pointer type\" is much more broad than the pointer primitive type in the " +"language." msgstr "" -"Il n'est pas possible d'oublier d'acquérir le mutex avant d'accéder aux " -"données protégées." -#: src/concurrency/shared_state/mutex.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-pinning-is.md msgid "" -"You can get an `&mut T` from an `&Mutex` by taking the lock. The " -"`MutexGuard` ensures that the `&mut T` doesn't outlive the lock being held." +"A \"pointer type\" wraps every type that implements `Deref` with a target that implements " +"`Unpin`." msgstr "" -"Vous pouvez obtenir un `&mut T` à partir d'un `&Mutex` en prenant le " -"verrou. Le `MutexGuard` garantit que le `&mut T` ne survit pas au " -"verrouillage en cours." -#: src/concurrency/shared_state/mutex.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-pinning-is.md msgid "" -"`Mutex` implements both `Send` and `Sync` iff (if and only if) `T` " -"implements `Send`." +"Rust style note: This trait bound is enforced through trait bounds on the `::new()` " +"constructor, rather than on the type itself." msgstr "" -"`Mutex` implémente à la fois `Send` et `Sync` ssi `T` implémente `Send`." - -#: src/concurrency/shared_state/mutex.md -#, fuzzy -msgid "A read-write lock counterpart: `RwLock`." -msgstr "Un homologue de verrouillage en lecture-écriture - `RwLock`." -#: src/concurrency/shared_state/mutex.md +#: src/unsafe-deep-dive/pinning/what-a-move-is.md #, fuzzy -msgid "Why does `lock()` return a `Result`?" -msgstr "Pourquoi `lock()` renvoie-t-il un `Result` ?" +msgid "What a move is in Rust" +msgstr "Qu'est-ce que Rust ?" -#: src/concurrency/shared_state/mutex.md -#, fuzzy -msgid "" -"If the thread that held the `Mutex` panicked, the `Mutex` becomes " -"\"poisoned\" to signal that the data it protected might be in an " -"inconsistent state. Calling `lock()` on a poisoned mutex fails with a " -"[`PoisonError`](https://doc.rust-lang.org/std/sync/struct.PoisonError.html). " -"You can call `into_inner()` on the error to recover the data regardless." +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "Always a bitwise copy, even for types that do not implement `Copy`:" msgstr "" -"Si le thread qui contenait le `Mutex` a paniqué, le `Mutex` devient " -"\"empoisonné\" pour signaler que les données qu'il protège peuvent être dans " -"un état incohérent. Appel de `lock()` sur un mutex empoisonné échoue avec " -"une [`PoisonError`](https://doc.rust-lang.org/std/sync/struct.PoisonError." -"html). Vous pouvez appeler `into_inner()` sur l'erreur pour récupérer les " -"données indépendamment de." - -#: src/concurrency/shared_state/example.md -#, fuzzy -msgid "Let us see `Arc` and `Mutex` in action:" -msgstr "Voyons `Arc` et `Mutex` en action :" -#: src/concurrency/shared_state/example.md -msgid "// use std::sync::{Arc, Mutex};\n" +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "b'R'" msgstr "" -#: src/concurrency/shared_state/example.md -#, fuzzy -msgid "Possible solution:" -msgstr "Solution possible:" +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "b'U'" +msgstr "" -#: src/concurrency/shared_state/example.md -#, fuzzy -msgid "Notable parts:" -msgstr "Parties notables :" +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "b'S'" +msgstr "" -#: src/concurrency/shared_state/example.md -#, fuzzy -msgid "" -"`v` is wrapped in both `Arc` and `Mutex`, because their concerns are " -"orthogonal." +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "b'T'" msgstr "" -"`v` est enveloppé à la fois dans `Arc` et `Mutex`, car leurs préoccupations " -"sont orthogonales." -#: src/concurrency/shared_state/example.md +#: src/unsafe-deep-dive/pinning/what-a-move-is.md #, fuzzy msgid "" -"Wrapping a `Mutex` in an `Arc` is a common pattern to share mutable state " -"between threads." +"Generated [LLVM IR](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=6f587283e8e0ec02f1ea8e871fc9ac72) for calling " +"`move_and_expect()`:" msgstr "" -"Envelopper un `Mutex` dans un `Arc` est un modèle courant pour partager un " -"état mutable entre les threads." +"Testez le code ci-dessus sur [Rust Playground](https://play.rust-lang.org/?" +"version=stable&mode=debug&edition=2021&gist=3ce2ad13ea1302f6572cb15cd96becf0)." -#: src/concurrency/shared_state/example.md -#, fuzzy -msgid "" -"`v: Arc<_>` needs to be cloned as `v2` before it can be moved into another " -"thread. Note `move` was added to the lambda signature." +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "`memcpy` from variable `%b` to `%_12`" msgstr "" -"`v: Arc<_>` doit être cloné en tant que `v2` avant de pouvoir être déplacé " -"dans un autre thread. Remarque \"move\" a été ajouté à la signature lambda." -#: src/concurrency/shared_state/example.md -#, fuzzy -msgid "" -"Blocks are introduced to narrow the scope of the `LockGuard` as much as " -"possible." +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "Call to `move_and_inspect` with `%_12` (the copy)" msgstr "" -"Des blocs sont introduits pour réduire autant que possible la portée du " -"\"LockGuard\"." -#: src/exercises/concurrency/morning.md -#, fuzzy -msgid "Let us practice our new concurrency skills with" +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "Note that `DynamicBuffer` does not implement `Copy`." msgstr "" -"Mettons en pratique nos nouvelles compétences en matière de concurrence avec" -#: src/exercises/concurrency/morning.md -#, fuzzy -msgid "Dining philosophers: a classic problem in concurrency." -msgstr "Dîner des philosophes : un problème classique de la concurrence." +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "Implication: a value's memory address is not stable." +msgstr "" -#: src/exercises/concurrency/morning.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-a-move-is.md msgid "" -"Multi-threaded link checker: a larger project where you'll use Cargo to " -"download dependencies and then check links in parallel." +"To show movement as a bitwise copy, either [open the code in the playground](https://play." +"rust-lang.org/?" +"version=stable&mode=debug&edition=2024&gist=6f587283e8e0ec02f1ea8e871fc9ac72) and look at " +"the or [the Compiler Explorer](https://rust.godbolt.org/z/6o6nP7do4)." msgstr "" -"Vérificateur de liens multithread : un projet plus vaste dans lequel vous " -"utiliserez Cargo pour télécharger les dépendances puis vérifier les liens en " -"parallèle." -#: src/exercises/concurrency/dining-philosophers.md -#, fuzzy -msgid "The dining philosophers problem is a classic problem in concurrency:" +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "Optional for those who prefer assembly output:" msgstr "" -"Le problème du dîner des philosophes est un problème classique en " -"concurrence :" -#: src/exercises/concurrency/dining-philosophers.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-a-move-is.md msgid "" -"Five philosophers dine together at the same table. Each philosopher has " -"their own place at the table. There is a fork between each plate. The dish " -"served is a kind of spaghetti which has to be eaten with two forks. Each " -"philosopher can only alternately think and eat. Moreover, a philosopher can " -"only eat their spaghetti when they have both a left and right fork. Thus two " -"forks will only be available when their two nearest neighbors are thinking, " -"not eating. After an individual philosopher finishes eating, they will put " -"down both forks." +"The Compiler Explorer is useful for discussing the generated assembly and focus the " +"cursor assembly output in the `main` function on lines 128-136 (should be highlighted in " +"pink)." msgstr "" -"Cinq philosophes dînent ensemble à la même table. Chaque philosophe a son " -"propre place à table. Il y a une fourchette entre chaque assiette. Le plat " -"servi est une sorte de spaghetti qui se mange avec deux fourchettes. Chaque " -"philosophe peut seulement penser et manger alternativement. De plus, un " -"philosophe ne peut que manger leur des spaghettis lorsqu'ils ont à la fois " -"une fourchette gauche et droite. Ainsi deux fourches ne feront que être " -"disponible lorsque ses deux voisins les plus proches pensent, ne mangent " -"pas. Après un philosophe individuel finit de manger, ils poseront les deux " -"fourchettes." -#: src/exercises/concurrency/dining-philosophers.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/what-a-move-is.md +msgid "Relevant code generated output `move_and_inspect`:" +msgstr "" + +#: src/unsafe-deep-dive/pinning/definition-of-pin.md msgid "" -"You will need a local [Cargo installation](../../cargo/running-locally.md) " -"for this exercise. Copy the code below to a file called `src/main.rs`, fill " -"out the blanks, and test that `cargo run` does not deadlock:" +"`Pin` is a minimal wrapper around a _pointer type_, which is defined as a type that " +"implements `Deref`." msgstr "" -"Vous aurez besoin d'une [installation Cargo](../../cargo/running-locally.md) " -"locale pour cet exercice. Copiez le code ci-dessous dans un fichier appelé " -"`src/main.rs`, remplissez le vides, et testez que `cargo run` ne se bloque " -"pas :" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/dining-philosophers-async.md +#: src/unsafe-deep-dive/pinning/definition-of-pin.md msgid "" -"// left_fork: ...\n" -" // right_fork: ...\n" -" // thoughts: ...\n" +"However, `Pin::new()` only accepts types that dereference into a target that implements " +"`Unpin` (`Deref`). This allows `Pin` to rely on the type system to enforce " +"its guarantees." msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"Eureka! {} has a new idea!\"" +#: src/unsafe-deep-dive/pinning/definition-of-pin.md +msgid "" +"Types that do not implement `Unpin`, i.e., types that require pinning, must create a " +"`Pin` via the unsafe `Pin::new_unchecked()`." msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Pick up forks...\n" +#: src/unsafe-deep-dive/pinning/definition-of-pin.md +msgid "" +"Aside: Unlike other `new()`/`new_unchecked()` method pairs, `new` does not do any runtime " +"checking. The check is a zero-cost compile-time check." msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"{} is eating...\"" +#: src/unsafe-deep-dive/pinning/why-difficult.md +msgid "Why Pin is difficult to use" msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md +#: src/unsafe-deep-dive/pinning/why-difficult.md #, fuzzy -msgid "\"Socrates\"" -msgstr "caisses HAL" - -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"Hypatia\"" +msgid "`Pin` is \"just\" a type defined in the standard library" msgstr "" +"`Option` et `Result` sont largement utilisés, pas seulement dans la bibliothèque standard." -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"Plato\"" +#: src/unsafe-deep-dive/pinning/why-difficult.md +msgid "" +"This satisfied the needs of its original audience, the creators of async runtimes, " +"without needing to extending the core language" msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"Aristotle\"" +#: src/unsafe-deep-dive/pinning/why-difficult.md +msgid "" +"That audience could accept some of its ergonomic downsides, as users of `async` would " +"rarely interact with `Pin` directly" msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/solutions-morning.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"Pythagoras\"" +#: src/unsafe-deep-dive/pinning/why-difficult.md +msgid "\"You might wonder why Pin is so awkward to use. The answer is largely historical.\"" msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Create forks\n" +#: src/unsafe-deep-dive/pinning/why-difficult.md +msgid "" +"\"`Pin` offered a simpler implementation for the Rust project than alternatives\"." msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Create philosophers\n" +#: src/unsafe-deep-dive/pinning/why-difficult.md +msgid "" +"\"Pin was designed primarily for the ~100 people in the world who write async runtimes. " +"The Rust team chose a simpler (for the compiler) but less ergonomic design.\"" msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -msgid "// Make each of them think and eat 100 times\n" +#: src/unsafe-deep-dive/pinning/why-difficult.md +msgid "" +"\"More user-friendly proposals existed but were rejected as too complex for the primary " +"audience, who could handle the complexity.\"" msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Output their thoughts\n" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "Unpin trait" msgstr "" -#: src/exercises/concurrency/dining-philosophers.md -#, fuzzy -msgid "You can use the following `Cargo.toml`:" -msgstr "Vous pouvez utiliser le fichier `Cargo.toml` suivant :" - -#: src/exercises/concurrency/dining-philosophers.md -msgid "" -"```toml\n" -"[package]\n" -"name = \"dining-philosophers\"\n" -"version = \"0.1.0\"\n" -"edition = \"2021\"\n" -"```" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "`Unpin` type allows types to move freely, even when they're wrapped by a `Pin`" msgstr "" -#: src/exercises/concurrency/link-checker.md -#, fuzzy -msgid "" -"Let us use our new knowledge to create a multi-threaded link checker. It " -"should start at a webpage and check that links on the page are valid. It " -"should recursively check other pages on the same domain and keep doing this " -"until all pages have been validated." +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "Most types implement `Unpin`, because it is an \"`auto trait`\"" msgstr "" -"Utilisons nos nouvelles connaissances pour créer un vérificateur de liens " -"multi-thread. Cela devrait commencez par une page Web et vérifiez que les " -"liens sur la page sont valides. Cela devrait vérifier récursivement d'autres " -"pages sur le même domaine et continuer à le faire jusqu'à ce que tous les " -"pages ont été validées." -#: src/exercises/concurrency/link-checker.md -msgid "" -"For this, you will need an HTTP client such as [`reqwest`](https://docs.rs/" -"reqwest/). You will also need a way to find links, we can use [`scraper`]" -"(https://docs.rs/scraper/). Finally, we'll need some way of handling errors, " -"we will use [`thiserror`](https://docs.rs/thiserror/)." +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "`auto trait` behavior can be changed:" msgstr "" -#: src/exercises/concurrency/link-checker.md -#, fuzzy -msgid "Create a new Cargo project and `reqwest` it as a dependency with:" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "`!Unpin` types must never move" msgstr "" -"Pour cela, vous aurez besoin d'un client HTTP tel que [`reqwest`](https://" -"docs.rs/reqwest/). Créer un nouveau Projet Cargo et `reqwest` comme " -"dépendance avec :" -#: src/exercises/concurrency/link-checker.md -#, fuzzy -msgid "" -"If `cargo add` fails with `error: no such subcommand`, then please edit the " -"`Cargo.toml` file by hand. Add the dependencies listed below." +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "Types containing a `PhantomPinned` field do not implement `Unpin` by default" msgstr "" -"Si `cargo add` échoue avec `error: no such subcommand`, veuillez modifier le " -"Fichier `Cargo.toml` à la main. Ajoutez les dépendances répertoriées ci-" -"dessous." -#: src/exercises/concurrency/link-checker.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/unpin-trait.md msgid "" -"The `cargo add` calls will update the `Cargo.toml` file to look like this:" +"Explain that when a trait implements `Unpin`, the pinning behavior of `Pin` does not " +"get invoked. The value is free to move." msgstr "" -"Les appels `cargo add` mettront à jour le fichier `Cargo.toml` pour qu'il " -"ressemble à ceci :" -#: src/exercises/concurrency/link-checker.md +#: src/unsafe-deep-dive/pinning/unpin-trait.md msgid "" -"```toml\n" -"[package]\n" -"name = \"link-checker\"\n" -"version = \"0.1.0\"\n" -"edition = \"2021\"\n" -"publish = false\n" -"\n" -"[dependencies]\n" -"reqwest = { version = \"0.11.12\", features = [\"blocking\", \"rustls-" -"tls\"] }\n" -"scraper = \"0.13.0\"\n" -"thiserror = \"1.0.37\"\n" -"```" +"Explain that almost all types implement `Unpin`; automatically implemented by the " +"compiler." msgstr "" -#: src/exercises/concurrency/link-checker.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/unpin-trait.md msgid "" -"You can now download the start page. Try with a small site such as `https://" -"www.google.org/`." +"Types implementing `Unpin` are saying: 'I promise I have no self-references, so moving me " +"is always safe.'" msgstr "" -"Vous pouvez maintenant télécharger la page de démarrage. Essayez avec un " -"petit site comme `https://www.google.org/`." - -#: src/exercises/concurrency/link-checker.md -#, fuzzy -msgid "Your `src/main.rs` file should look something like this:" -msgstr "Votre fichier `src/main.rs` devrait ressembler à ceci :" -#: src/exercises/concurrency/link-checker.md -#: src/exercises/concurrency/solutions-morning.md -msgid "\"request error: {0}\"" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "Ask: What types might be `!Unpin`?" msgstr "" -#: src/exercises/concurrency/link-checker.md -#: src/exercises/concurrency/solutions-morning.md -msgid "\"bad http response: {0}\"" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "Compiler-generated futures" msgstr "" -#: src/exercises/concurrency/link-checker.md -#: src/exercises/concurrency/solutions-morning.md -msgid "\"Checking {:#}\"" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "Types containing a `PhantomPinned` field" msgstr "" -#: src/exercises/concurrency/link-checker.md -#: src/exercises/concurrency/solutions-morning.md -msgid "\"href\"" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "Some types wrapping C++ objects" msgstr "" -#: src/exercises/concurrency/link-checker.md -#: src/exercises/concurrency/solutions-morning.md -msgid "\"On {base_url:#}: ignored unparsable {href:?}: {err}\"" +#: src/unsafe-deep-dive/pinning/unpin-trait.md +msgid "`!Unpin` types cannot be moved once pinned" msgstr "" -#: src/exercises/concurrency/link-checker.md -#: src/exercises/concurrency/solutions-morning.md -msgid "\"https://www.google.org\"" +#: src/unsafe-deep-dive/pinning/phantompinned.md +#, fuzzy +msgid "Definition" +msgstr "Descriptif" + +#: src/unsafe-deep-dive/pinning/phantompinned.md +msgid "Usage" msgstr "" -#: src/exercises/concurrency/link-checker.md -msgid "\"Links: {links:#?}\"" +#: src/unsafe-deep-dive/pinning/phantompinned.md +msgid "`PhantomPinned` is a marker type." msgstr "" -#: src/exercises/concurrency/link-checker.md -msgid "\"Could not extract links: {err:#}\"" +#: src/unsafe-deep-dive/pinning/phantompinned.md +msgid "If a type contains a `PhantomPinned`, it will not implement `Unpin` by default." msgstr "" -#: src/exercises/concurrency/link-checker.md -#, fuzzy -msgid "Run the code in `src/main.rs` with" -msgstr "Exécutez le code dans `src/main.rs` avec" +#: src/unsafe-deep-dive/pinning/phantompinned.md +msgid "This has the effect of enforcing pinning when `DynamicBuffer` is wrapped by `Pin`." +msgstr "" -#: src/exercises/concurrency/link-checker.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md msgid "" -"Use threads to check the links in parallel: send the URLs to be checked to a " -"channel and let a few threads check the URLs in parallel." +"A \"self-referential buffer\" is a type that has a reference to one of its own fields:" msgstr "" -"Utilisez des threads pour vérifier les liens en parallèle : envoyez les URL " -"à vérifier à un channel et laissez quelques threads vérifier les URL en " -"parallèle." -#: src/exercises/concurrency/link-checker.md -#, fuzzy +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md msgid "" -"Extend this to recursively extract links from all pages on the `www.google." -"org` domain. Put an upper limit of 100 pages or so so that you don't end up " -"being blocked by the site." +"This kind of structure is not typical in Rust, because there's no way to update the " +"cursor's address when instances of `SelfReferentialBuffer` move." msgstr "" -"Étendez ceci pour extraire de manière récursive les liens de toutes les " -"pages du domaine \"www.google.org\". Fixez une limite supérieure de 100 " -"pages environ afin que vous ne finissez pas par être bloqué par le site." -#: src/exercises/concurrency/solutions-morning.md -#, fuzzy -msgid "Concurrency Morning Exercise" -msgstr "Jour 3 Exercice du matin" - -#: src/exercises/concurrency/solutions-morning.md -#, fuzzy -msgid "([back to exercise](dining-philosophers.md))" -msgstr "([retour à l'exercice](dining-philosophers.md))" - -#: src/exercises/concurrency/solutions-morning.md -msgid "\"{} is trying to eat\"" +#: src/unsafe-deep-dive/pinning/self-referential-buffer.md +msgid "" +"However, this kind of setup is more natural in other languages that provide garbage " +"collection, and also C++ that allows users to define their own behavior during moves and " +"copies." msgstr "" -#: src/exercises/concurrency/solutions-morning.md -msgid "" -"// To avoid a deadlock, we have to break the symmetry\n" -" // somewhere. This will swap the forks without deinitializing\n" -" // either of them.\n" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/cpp.md +msgid "Modelled in C++" msgstr "" -#: src/exercises/concurrency/solutions-morning.md -msgid "\"{thought}\"" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/cpp.md +msgid "" msgstr "" -#: src/exercises/concurrency/solutions-morning.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/cpp.md #, fuzzy -msgid "Link Checker" -msgstr "Vérificateur de liens à plusieurs threads" +msgid "" +msgstr "String" -#: src/exercises/concurrency/solutions-morning.md -#, fuzzy -msgid "([back to exercise](link-checker.md))" -msgstr "([retour à l'exercice](luhn.md))" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/cpp.md +msgid "Investigate on [Compiler Explorer](https://godbolt.org/z/ascME6aje)" +msgstr "" -#: src/exercises/concurrency/solutions-morning.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/cpp.md msgid "" -"/// Determine whether links within the given page should be extracted.\n" +"The `SelfReferentialBuffer` contains two members, `data` is a kilobyte of memory and " +"`cursor` is a pointer into the former." msgstr "" -#: src/exercises/concurrency/solutions-morning.md -msgid "" -"/// Mark the given page as visited, returning false if it had already\n" -" /// been visited.\n" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/cpp.md +msgid "Its move constructor ensures that cursor is updated to the new memory address." msgstr "" -#: src/exercises/concurrency/solutions-morning.md -msgid "// The sender got dropped. No more commands coming in.\n" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/cpp.md +msgid "This type can't be expressed easily in Rust." msgstr "" -#: src/exercises/concurrency/solutions-morning.md -msgid "\"Got crawling error: {:#}\"" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md +msgid "/// Raw pointers\n" msgstr "" -#: src/exercises/concurrency/solutions-morning.md -msgid "\"Bad URLs: {:#?}\"" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md +msgid "/// Integer offsets\n" msgstr "" -#: src/async.md -#, fuzzy -msgid "Async Rust" -msgstr "Pourquoi Rust ?" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md +msgid "/// Pinning\n" +msgstr "" -#: src/async.md -msgid "" -"\"Async\" is a concurrency model where multiple tasks are executed " -"concurrently by executing each task until it would block, then switching to " -"another task that is ready to make progress. The model allows running a " -"larger number of tasks on a limited number of threads. This is because the " -"per-task overhead is typically very low and operating systems provide " -"primitives for efficiently identifying I/O that is able to proceed." +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md +msgid "Original C++ class definition for reference" msgstr "" -#: src/async.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md msgid "" -"Rust's asynchronous operation is based on \"futures\", which represent work " -"that may be completed in the future. Futures are \"polled\" until they " -"signal that they are complete." +"The next few slides show three approaches to creating a Rust type with the same semantics " +"as the original C++." msgstr "" -#: src/async.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md msgid "" -"Futures are polled by an async runtime, and several different runtimes are " -"available." +"Using raw pointers: matches C++ very closely, but using the resulting type is extremely " +"hazardous" msgstr "" -#: src/async.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md msgid "" -"Python has a similar model in its `asyncio`. However, its `Future` type is " -"callback-based, and not polled. Async Python programs require a \"loop\", " -"similar to a runtime in Rust." +"Storing integer offsets: more natural in Rust, but references need to be created manually" msgstr "" -#: src/async.md -msgid "" -"JavaScript's `Promise` is similar, but again callback-based. The language " -"runtime implements the event loop, so many of the details of Promise " -"resolution are hidden." +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust.md +msgid "Pinning: allows raw pointers with fewer `unsafe` blocks" msgstr "" -#: src/async/async-await.md -msgid "" -"At a high level, async Rust code looks very much like \"normal\" sequential " -"code:" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +msgid "// Danger: must be called after every move\n" msgstr "" -#: src/async/async-await.md -msgid "\"Count is: {i}!\"" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-pin.md +msgid "\"cursor is out of bounds\"" msgstr "" -#: src/async/async-await.md -msgid "" -"Note that this is a simplified example to show the syntax. There is no long " -"running operation or any real concurrency in it!" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +msgid "Avoid spending too much time here." msgstr "" -#: src/async/async-await.md -msgid "What is the return type of an async call?" +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +#, fuzzy +msgid "Talking points:" +msgstr "Points clés:" + +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +msgid "" +"Emphasize that `unsafe` appears frequently. This is a hint that another design may be " +"more appropriate." msgstr "" -#: src/async/async-await.md -msgid "Use `let future: () = async_main(10);` in `main` to see the type." +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +msgid "`unsafe` blocks lack safety comments. Therefore, this code is unsound." msgstr "" -#: src/async/async-await.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md msgid "" -"The \"async\" keyword is syntactic sugar. The compiler replaces the return " -"type with a future." +"`unsafe` blocks are too broad. Good practice uses smaller `unsafe` blocks with specific " +"behavior, specific preconditions and specific safety comments." msgstr "" -#: src/async/async-await.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md +#, fuzzy +msgid "Questions:" +msgstr "Fonctions" + +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-raw-pointers.md msgid "" -"You cannot make `main` async, without additional instructions to the " -"compiler on how to use the returned future." +"Q: Should the `read()` and `write()` methods be marked as unsafe? \n" +"A: Yes, because `self.cursor` will be a null pointer unless written to." msgstr "" -#: src/async/async-await.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-offset.md +#, fuzzy +msgid "With Offset" +msgstr "Décalage" + +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-offset.md msgid "" -"You need an executor to run async code. `block_on` blocks the current thread " -"until the provided future has run to completion." +"In Rust, it's more idiomatic to use an offset variable and to create references on-demand." msgstr "" -#: src/async/async-await.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-pin.md msgid "" -"`.await` asynchronously waits for the completion of another operation. " -"Unlike `block_on`, `.await` doesn't block the current thread." +"Pinning allows Rust programmers to create a type which is much more similar to C++ " +"classes." +msgstr "" + +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-pin.md +msgid "/// A self-referential buffer that cannot be moved.\n" msgstr "" -#: src/async/async-await.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-pin.md msgid "" -"`.await` can only be used inside an `async` function (or block; these are " -"introduced later)." +"Note that the function signatures have now changed. For example, `::new()` returns " +"`Pin>` rather than `Self`. This incurs a heap allocation because `Pin` " +"must work with a pointer type like `Box`." msgstr "" -#: src/async/futures.md +#: src/unsafe-deep-dive/pinning/self-referential-buffer/rust-pin.md msgid "" -"[`Future`](https://doc.rust-lang.org/std/future/trait.Future.html) is a " -"trait, implemented by objects that represent an operation that may not be " -"complete yet. A future can be polled, and `poll` returns a [`Poll`](https://" -"doc.rust-lang.org/std/task/enum.Poll.html)." +"In `::new()`, we use `Pin::get_unchecked_mut()` to get a mutable reference to the buffer " +"_after_ it has been pinned. This is `unsafe` because we are breaking the pinning " +"guarantee for a moment to initialize the `cursor`. We must make sure not to move the " +"`SelfReferentialBuffer` after this point. The safety contract of `Pin` is that once a " +"value is pinned, its memory location is fixed until it is dropped." msgstr "" -#: src/async/futures.md +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +msgid "Pin\\ and Drop" +msgstr "" + +#: src/unsafe-deep-dive/pinning/pin-and-drop.md msgid "" -"An async function returns an `impl Future`. It's also possible (but " -"uncommon) to implement `Future` for your own types. For example, the " -"`JoinHandle` returned from `tokio::spawn` implements `Future` to allow " -"joining to it." +"A key challenge with pinned, `!Unpin` types is implementing the `Drop` trait. The `drop` " +"method takes `&mut self`, which allows moving the value. However, pinned values must not " +"be moved." msgstr "" -#: src/async/futures.md +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +#, fuzzy +msgid "An Incorrect `Drop` Implementation" +msgstr "Mise en œuvre des services" + +#: src/unsafe-deep-dive/pinning/pin-and-drop.md msgid "" -"The `.await` keyword, applied to a Future, causes the current async function " -"to pause until that Future is ready, and then evaluates to its output." +"It's easy to accidentally move a value inside `drop`. Operations like assignment, `ptr::" +"read`, and `mem::replace` can silently break the pinning guarantee." msgstr "" -#: src/async/futures.md +#: src/unsafe-deep-dive/pinning/pin-and-drop.md msgid "" -"The `Future` and `Poll` types are implemented exactly as shown; click the " -"links to show the implementations in the docs." +"// BAD: `ptr::read` moves `self.data` out of `self`.\n" +" // When `_dupe` is dropped at the end of the function, it's a double free!\n" msgstr "" -#: src/async/futures.md +#: src/unsafe-deep-dive/pinning/pin-and-drop.md msgid "" -"We will not get to `Pin` and `Context`, as we will focus on writing async " -"code, rather than building new async primitives. Briefly:" +"Pinned types make guarantees about memory stability. Operations like `ptr::read` and " +"`mem::replace` can silently break these guarantees by moving or duplicating data, " +"invalidating internal pointers without the type system's knowledge." msgstr "" -#: src/async/futures.md +#: src/unsafe-deep-dive/pinning/pin-and-drop.md msgid "" -"`Context` allows a Future to schedule itself to be polled again when an " -"event occurs." +"In this `drop()` method, `_dupe` is a bitwise copy of `self.data`. At the end of the " +"method, it will be dropped along with `self`. This double drop is undefined behavior." msgstr "" -#: src/async/futures.md +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +#, fuzzy +msgid "A Correct `Drop` Implementation" +msgstr "Mise en œuvre des services" + +#: src/unsafe-deep-dive/pinning/pin-and-drop.md msgid "" -"`Pin` ensures that the Future isn't moved in memory, so that pointers into " -"that future remain valid. This is required to allow references to remain " -"valid after an `.await`." +"To implement `Drop` correctly for a `!Unpin` type, you must ensure that the value is not " +"moved. A common pattern is to create a helper function that operates on `Pin<&mut T>`." msgstr "" -#: src/async/runtimes.md -msgid "" -"A _runtime_ provides support for performing operations asynchronously (a " -"_reactor_) and is responsible for executing futures (an _executor_). Rust " -"does not have a \"built-in\" runtime, but several options are available:" +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +msgid "// SAFETY: `this` is pinned before we create the self-reference.\n" msgstr "" -#: src/async/runtimes.md -msgid "" -"[Tokio](https://tokio.rs/): performant, with a well-developed ecosystem of " -"functionality like [Hyper](https://hyper.rs/) for HTTP or [Tonic](https://" -"github.com/hyperium/tonic) for gRPC." +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +msgid "// This function can only be called on a pinned `SelfRef`.\n" msgstr "" -#: src/async/runtimes.md -msgid "" -"[async-std](https://async.rs/): aims to be a \"std for async\", and includes " -"a basic runtime in `async::task`." +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +msgid "// `self` is pinned, so we must not move out of it.\n" msgstr "" -#: src/async/runtimes.md -msgid "[smol](https://docs.rs/smol/latest/smol/): simple and lightweight" +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +msgid "\"dropping {}\"" msgstr "" -#: src/async/runtimes.md +#: src/unsafe-deep-dive/pinning/pin-and-drop.md msgid "" -"Several larger applications have their own runtimes. For example, [Fuchsia]" -"(https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/src/lib/fuchsia-" -"async/src/lib.rs) already has one." +"// We can safely call `drop_pinned` because `drop` is the last time\n" +" // the value is used. We use `new_unchecked` because we know `self`\n" +" // will not be moved again.\n" msgstr "" -#: src/async/runtimes.md -msgid "" -"Note that of the listed runtimes, only Tokio is supported in the Rust " -"playground. The playground also does not permit any I/O, so most interesting " -"async things can't run in the playground." +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +#, fuzzy +msgid "\"Hello, \"" +msgstr "Bonjour le monde!" + +#: src/unsafe-deep-dive/pinning/pin-and-drop.md +msgid "// `Drop` runs without moving the pinned value\n" msgstr "" -#: src/async/runtimes.md -msgid "" -"Futures are \"inert\" in that they do not do anything (not even start an I/O " -"operation) unless there is an executor polling them. This differs from JS " -"Promises, for example, which will run to completion even if they are never " -"used." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "Worked Example: Implementing `Drop` for `!Unpin` types" msgstr "" -#: src/async/runtimes/tokio.md -msgid "Tokio provides:" +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "// SAFETY: Safe because we are reading bytes from a String\n" msgstr "" -#: src/async/runtimes/tokio.md -msgid "A multi-threaded runtime for executing asynchronous code." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +#, fuzzy +msgid "\"Rust 🦀\"" +msgstr "Rustdoc" + +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "\"Batch: {:?}\"" msgstr "" -#: src/async/runtimes/tokio.md -msgid "An asynchronous version of the standard library." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "" +"This example uses the `Drop` trait to add data for some post-processing, such as " +"telemetry or logging." msgstr "" -#: src/async/runtimes/tokio.md -msgid "A large ecosystem of libraries." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "" +"**The Safety comment is incorrect.** `ptr::read` creates a bitwise copy, leaving `self." +"data` in an invalid state. `self.data` will be dropped again at the end of the method, " +"which is a double free." msgstr "" -#: src/async/runtimes/tokio.md -msgid "\"Count in task: {i}!\"" +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "Ask the class to fix the code." msgstr "" -#: src/async/runtimes/tokio.md -msgid "\"Main task: {i}\"" +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "**Suggestion 0: Redesign**" msgstr "" -#: src/async/runtimes/tokio.md -msgid "With the `tokio::main` macro we can now make `main` async." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "Redesign the post-processing system to work without `Drop`." msgstr "" -#: src/async/runtimes/tokio.md -msgid "The `spawn` function creates a new, concurrent \"task\"." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "**Suggestion 1: Clone**" msgstr "" -#: src/async/runtimes/tokio.md -msgid "Note: `spawn` takes a `Future`, you don't call `.await` on `count_to`." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "Using `.clone()` is an obvious first choice, but it allocates memory." msgstr "" -#: src/async/runtimes/tokio.md -msgid "**Further exploration:**" +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "**Suggestion 2: ManuallyDrop**" msgstr "" -#: src/async/runtimes/tokio.md +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md msgid "" -"Why does `count_to` not (usually) get to 10? This is an example of async " -"cancellation. `tokio::spawn` returns a handle which can be awaited to wait " -"until it finishes." +"Wrapping `CustomString` in `ManuallyDrop` prevents the (second) automatic drop at the end " +"of the `Drop` impl." msgstr "" -#: src/async/runtimes/tokio.md -msgid "Try `count_to(10).await` instead of spawning." +#: src/unsafe-deep-dive/pinning/drop-and-not-unpin-worked-example.md +msgid "// SAFETY: self.data\n" msgstr "" -#: src/async/runtimes/tokio.md -msgid "Try awaiting the task returned from `tokio::spawn`." +#: src/unsafe-deep-dive/ffi/language-interop.md +msgid "Ideal scenario:" msgstr "" -#: src/async/tasks.md -msgid "Rust has a task system, which is a form of lightweight threading." +#: src/unsafe-deep-dive/ffi/language-interop.md src/unsafe-deep-dive/ffi/strategies.md +msgid "" +"```bob\n" +"╭────────────╮ ╭────────────╮\n" +"│ │ │ │\n" +"│ │ <--------------------------------------> │ │\n" +"│ │ │ │\n" +"╰────────────╯ ╰────────────╯\n" +" Rust \"C++\"\n" +"```" msgstr "" -#: src/async/tasks.md +#: src/unsafe-deep-dive/ffi/language-interop.md msgid "" -"A task has a single top-level future which the executor polls to make " -"progress. That future may have one or more nested futures that its `poll` " -"method polls, corresponding loosely to a call stack. Concurrency within a " -"task is possible by polling multiple child futures, such as racing a timer " -"and an I/O operation." +"This section of the course covers interacting with Rust and external languages via its " +"foreign-function interface (FFI), with a special focus on interoperability with C++." msgstr "" -#: src/async/tasks.md -msgid "\"127.0.0.1:0\"" +#: src/unsafe-deep-dive/ffi/language-interop.md +msgid "" +"Ideally, users of Rust and the external language (in this case C++) could call each " +"others’ methods directly." msgstr "" -#: src/async/tasks.md -msgid "\"listening on port {}\"" +#: src/unsafe-deep-dive/ffi/language-interop.md +msgid "This ideal scenario is very difficult to achieve:" msgstr "" -#: src/async/tasks.md -msgid "\"connection from {addr:?}\"" +#: src/unsafe-deep-dive/ffi/language-interop.md +msgid "" +"Different languages have different semantics and mapping between them implies trade-offs " +"Neither Rust nor C++ offer ABI stability[^1], making it difficult to build from a stable " +"foundation" msgstr "" -#: src/async/tasks.md -msgid "b\"Who are you?\\n\"" +#: src/unsafe-deep-dive/ffi/language-interop.md +msgid "Some C++ compiler vendors provide support for ABI stability within their toolchain." msgstr "" -#: src/async/tasks.md -msgid "\"socket error\"" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "Strategies of interop" msgstr "" -#: src/async/tasks.md -msgid "\"Thanks for dialing in, {name}!\\n\"" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "Sharing data structures and symbols directly is very difficult:" msgstr "" -#: src/async/tasks.md src/async/control-flow/join.md -msgid "" -"Copy this example into your prepared `src/main.rs` and run it from there." +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "FFI through the C ABI is much more feasible:" msgstr "" -#: src/async/tasks.md +#: src/unsafe-deep-dive/ffi/strategies.md src/unsafe-deep-dive/ffi/language-differences.md msgid "" -"Try connecting to it with a TCP connection tool like [nc](https://www.unix." -"com/man-page/linux/1/nc/) or [telnet](https://www.unix.com/man-page/linux/1/" -"telnet/)." +"````````bob\n" +"╭────────────╮ ╭───╮ ╭───╮ ╭────────────╮\n" +"│ │ │ │ │ │ │ │\n" +"│ │ <-----> │ │ <~~~~~~~> │ │ <------> │ │ \n" +"│ │ │ │ │ │ │ │\n" +"╰────────────╯ ╰───╯ ╰───╯ ╰────────────╯\n" +" Rust C C \"C++\"\n" +"````````" msgstr "" -#: src/async/tasks.md -msgid "" -"Ask students to visualize what the state of the example server would be with " -"a few connected clients. What tasks exist? What are their Futures?" -msgstr "" +#: src/unsafe-deep-dive/ffi/strategies.md +#, fuzzy +msgid "Other strategies:" +msgstr "Autres ressources" -#: src/async/tasks.md -msgid "" -"This is the first time we've seen an `async` block. This is similar to a " -"closure, but does not take any arguments. Its return value is a Future, " -"similar to an `async fn`." +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "Distributed system (RPC)" msgstr "" -#: src/async/tasks.md -msgid "" -"Refactor the async block into a function, and improve the error handling " -"using `?`." +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "Custom ABI (i.e. WebAssembly Interface Types)" msgstr "" -#: src/async/channels.md -msgid "" -"Several crates have support for asynchronous channels. For instance `tokio`:" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "_High-fidelity interop_" msgstr "" -#: src/async/channels.md -msgid "\"Received {count} pings so far.\"" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "The ideal scenario is currently experimental." msgstr "" -#: src/async/channels.md -msgid "\"ping_handler complete\"" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "" +"Two projects exploring this are [crubit](https://github.com/google/crubit) and [Zngur]" +"(https://hkalbasi.github.io/zngur/). The first provides glue code on each side for " +"enabling compatible types to work seamlessly across domains. The second relies on dynamic " +"dispatch and imports C++ objects into Rust as trait objects." msgstr "" -#: src/async/channels.md -msgid "\"Failed to send ping.\"" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "_Low-fidelity interop_ work through a C API" msgstr "" -#: src/async/channels.md -msgid "\"Sent {} pings so far.\"" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "" +"The typical strategy for interop is to use the C language as the interface. C is a lossy " +"codec. This strategy typically results in complicated code on both sides." msgstr "" -#: src/async/channels.md -msgid "\"Something went wrong in ping handler task.\"" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "_Other strategies_ are less viable in a zero cost environment." msgstr "" -#: src/async/channels.md -msgid "Change the channel size to `3` and see how it affects the execution." +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "_Distributed systems_ impose runtime costs." msgstr "" -#: src/async/channels.md +#: src/unsafe-deep-dive/ffi/strategies.md msgid "" -"Overall, the interface is similar to the `sync` channels as seen in the " -"[morning class](concurrency/channels.md)." +"They incur significant overhead as calling a method in a foreign library incurs a round " +"trip of serialization/transport/deserialization. Generally speaking, a transparent RPC is " +"not a good idea. There’s network in the middle." msgstr "" -#: src/async/channels.md -msgid "Try removing the `std::mem::drop` call. What happens? Why?" +#: src/unsafe-deep-dive/ffi/strategies.md +msgid "_Custom ABI_, such as wasm require a runtime or significant implementation cost." msgstr "" -#: src/async/channels.md +#: src/unsafe-deep-dive/ffi/language-differences.md msgid "" -"The [Flume](https://docs.rs/flume/latest/flume/) crate has channels that " -"implement both `sync` and `async` `send` and `recv`. This can be convenient " -"for complex applications with both IO and heavy CPU processing tasks." +"Using C as the lowest common denominator means that lots of the richness available to " +"Rust and C++ is lost." msgstr "" -#: src/async/channels.md +#: src/unsafe-deep-dive/ffi/language-differences.md msgid "" -"What makes working with `async` channels preferable is the ability to " -"combine them with other `future`s to combine them and create complex control " -"flow." +"Each translation has the potential for semantic loss, runtime overhead, and subtle bugs." msgstr "" -#: src/async/control-flow.md +#: src/unsafe-deep-dive/ffi/language-differences/representations.md #, fuzzy -msgid "Futures Control Flow" -msgstr "Flux de contrôle" +msgid "b\"Hello, C\\0\"" +msgstr "Bonjour le monde!" + +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +#, fuzzy +msgid "b\"Hello, C++\\0\"" +msgstr "Bonjour le monde!" -#: src/async/control-flow.md +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +#, fuzzy +msgid "b\"Hello, Rust\"" +msgstr "Bonjour le monde!" + +#: src/unsafe-deep-dive/ffi/language-differences/representations.md msgid "" -"Futures can be combined together to produce concurrent compute flow graphs. " -"We have already seen tasks, that function as independent threads of " -"execution." +"Each language has its own opinion about how to implement things, which can lead to " +"confusion and bugs. Consider three ways to represent text." msgstr "" -#: src/async/control-flow.md -msgid "[Join](control-flow/join.md)" +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +msgid "Show how to convert the raw representations to a Rust string slice:" msgstr "" -#: src/async/control-flow.md -msgid "[Select](control-flow/select.md)" +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +msgid "// C representation to Rust\n" msgstr "" -#: src/async/control-flow/join.md -msgid "" -"A join operation waits until all of a set of futures are ready, and returns " -"a collection of their results. This is similar to `Promise.all` in " -"JavaScript or `asyncio.gather` in Python." +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +msgid "\"{c}\"" msgstr "" -#: src/async/control-flow/join.md -msgid "\"https://google.com\"" +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +msgid "// C++ representation to Rust \n" msgstr "" -#: src/async/control-flow/join.md -msgid "\"https://httpbin.org/ip\"" +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +msgid "\"{cc}\"" msgstr "" -#: src/async/control-flow/join.md -msgid "\"https://play.rust-lang.org/\"" +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +msgid "// Rust representation (bytes) to string slice\n" msgstr "" -#: src/async/control-flow/join.md -msgid "\"BAD_URL\"" +#: src/unsafe-deep-dive/ffi/language-differences/representations.md +msgid "\"{rust}\"" msgstr "" -#: src/async/control-flow/join.md +#: src/unsafe-deep-dive/ffi/language-differences/representations.md msgid "" -"For multiple futures of disjoint types, you can use `std::future::join!` but " -"you must know how many futures you will have at compile time. This is " -"currently in the `futures` crate, soon to be stabilised in `std::future`." +"Aside: Rust has a c-prefixed string literal. It appends a null byte at the end, e.g. " +"`c\"Rust\" == b\"Rust\\0\"`." msgstr "" -#: src/async/control-flow/join.md -msgid "" -"The risk of `join` is that one of the futures may never resolve, this would " -"cause your program to stall." +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "/// Create a formatted time based on timestamp `t`.\n" msgstr "" -#: src/async/control-flow/join.md +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md msgid "" -"You can also combine `join_all` with `join!` for instance to join all " -"requests to an http service as well as a database query. Try adding a " -"`tokio::time::sleep` to the future, using `futures::join!`. This is not a " -"timeout (that requires `select!`, explained in the next chapter), but " -"demonstrates `join!`." +"// SAFETY: `seconds` is generated by the system clock and will not cause\n" +" // overflow\n" msgstr "" -#: src/async/control-flow/select.md -msgid "" -"A select operation waits until any of a set of futures is ready, and " -"responds to that future's result. In JavaScript, this is similar to `Promise." -"race`. In Python, it compares to `asyncio.wait(task_set, return_when=asyncio." -"FIRST_COMPLETED)`." +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "// SAFETY: ctime returns a pointer to a preallocated (non-null) buffer\n" msgstr "" -#: src/async/control-flow/select.md -msgid "" -"Similar to a match statement, the body of `select!` has a number of arms, " -"each of the form `pattern = future => statement`. When a `future` is ready, " -"its return value is destructured by the `pattern`. The `statement` is then " -"run with the resulting variables. The `statement` result becomes the result " -"of the `select!` macro." +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "// SAFETY: ctime uses valid UTF-8\n" msgstr "" -#: src/async/control-flow/select.md -msgid "\"Felix\"" +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "\"{t:?}\"" msgstr "" -#: src/async/control-flow/select.md -msgid "\"Failed to send cat.\"" +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "Some constructs that other languages allow cannot be expressed in the Rust language." msgstr "" -#: src/async/control-flow/select.md -msgid "\"Failed to send dog.\"" +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "" +"The `ctime` function modifies an internal buffer shared between calls. This cannot be " +"represented as Rust’s lifetimes." msgstr "" -#: src/async/control-flow/select.md -msgid "\"Failed to receive winner\"" +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "`'static` does not apply, as the semantics are different" msgstr "" -#: src/async/control-flow/select.md -msgid "\"Winner is {winner:?}\"" +#: src/unsafe-deep-dive/ffi/language-differences/semantics.md +msgid "`'a` does not apply, as the buffer outlives each call" msgstr "" -#: src/async/control-flow/select.md -msgid "" -"In this example, we have a race between a cat and a dog. " -"`first_animal_to_finish_race` listens to both channels and will pick " -"whichever arrives first. Since the dog takes 50ms, it wins against the cat " -"that take 500ms." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Concern" msgstr "" -#: src/async/control-flow/select.md -msgid "" -"You can use `oneshot` channels in this example as the channels are supposed " -"to receive only one `send`." -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +#, fuzzy +msgid "Rust" +msgstr "Rustdoc" -#: src/async/control-flow/select.md -msgid "" -"Try adding a deadline to the race, demonstrating selecting different sorts " -"of futures." -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +#, fuzzy +msgid "C" +msgstr "CR" -#: src/async/control-flow/select.md -msgid "" -"Note that `select!` drops unmatched branches, which cancels their futures. " -"It is easiest to use when every execution of `select!` creates new futures." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "**Errors**" msgstr "" -#: src/async/control-flow/select.md -msgid "" -"An alternative is to pass `&mut future` instead of the future itself, but " -"this can lead to issues, further discussed in the pinning slide." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "`Result`, `Option`" msgstr "" -#: src/async/pitfalls.md -msgid "Pitfalls of async/await" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Magic return values, out-parameters, global `errno`" msgstr "" -#: src/async/pitfalls.md -msgid "" -"Async / await provides convenient and efficient abstraction for concurrent " -"asynchronous programming. However, the async/await model in Rust also comes " -"with its share of pitfalls and footguns. We illustrate some of them in this " -"chapter:" -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#, fuzzy +msgid "**Strings**" +msgstr "Cordes" -#: src/async/pitfalls.md -msgid "[Blocking the Executor](pitfalls/blocking-executor.md)" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "`&str`/`String` (UTF-8, length-known)" msgstr "" -#: src/async/pitfalls.md -msgid "[Pin](pitfalls/pin.md)" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Null-terminated `char*`, encoding undefined" msgstr "" -#: src/async/pitfalls.md -msgid "[Async Traits](pitfalls/async-traits.md)" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "**Nullability**" msgstr "" -#: src/async/pitfalls.md -msgid "[Cancellation](pitfalls/cancellation.md)" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Explicit via `Option`" msgstr "" -#: src/async/pitfalls/blocking-executor.md -msgid "Blocking the executor" -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#, fuzzy +msgid "Any pointer may be null" +msgstr "Le pointeur doit être non nul." -#: src/async/pitfalls/blocking-executor.md -msgid "" -"Most async runtimes only allow IO tasks to run concurrently. This means that " -"CPU blocking tasks will block the executor and prevent other tasks from " -"being executed. An easy workaround is to use async equivalent methods where " -"possible." -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#, fuzzy +msgid "**Ownership**" +msgstr "Possession" -#: src/async/pitfalls/blocking-executor.md -msgid "\"future {id} slept for {duration_ms}ms, finished after {}ms\"" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Affine types, lifetimes" msgstr "" -#: src/async/pitfalls/blocking-executor.md -msgid "\"current_thread\"" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#, fuzzy +msgid "Conventions" +msgstr "Conversions implicites" + +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "**Callbacks**" msgstr "" -#: src/async/pitfalls/blocking-executor.md -msgid "" -"Run the code and see that the sleeps happen consecutively rather than " -"concurrently." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "`Fn`/`FnMut`/`FnOnce` closures" msgstr "" -#: src/async/pitfalls/blocking-executor.md -msgid "" -"The `\"current_thread\"` flavor puts all tasks on a single thread. This " -"makes the effect more obvious, but the bug is still present in the multi-" -"threaded flavor." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Function pointer + `void* userdata`" msgstr "" -#: src/async/pitfalls/blocking-executor.md -msgid "" -"Switch the `std::thread::sleep` to `tokio::time::sleep` and await its result." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +#, fuzzy +msgid "**Panics**" +msgstr "Paniques" + +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Stack unwinding (or abort)" msgstr "" -#: src/async/pitfalls/blocking-executor.md -msgid "" -"Another fix would be to `tokio::task::spawn_blocking` which spawns an actual " -"thread and transforms its handle into a future without blocking the executor." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Abort" msgstr "" -#: src/async/pitfalls/blocking-executor.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md msgid "" -"You should not think of tasks as OS threads. They do not map 1 to 1 and most " -"executors will allow many tasks to run on a single OS thread. This is " -"particularly problematic when interacting with other libraries via FFI, " -"where that library might depend on thread-local storage or map to specific " -"OS threads (e.g., CUDA). Prefer `tokio::task::spawn_blocking` in such " -"situations." +"Errors: Must convert `Result` to abide by C conventions; easy to forget to check errors " +"on C side." msgstr "" -#: src/async/pitfalls/blocking-executor.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md msgid "" -"Use sync mutexes with care. Holding a mutex over an `.await` may cause " -"another task to block, and that task may be running on the same thread." +"Strings: Conversion cost; null bytes in Rust strings cause truncation; UTF-8 validation " +"on ingress." msgstr "" -#: src/async/pitfalls/pin.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md msgid "" -"Async blocks and functions return types implementing the `Future` trait. The " -"type returned is the result of a compiler transformation which turns local " -"variables into data stored inside the future." +"Nullability: Every pointer from C must be checked to create an `Option>`, " +"implying unsafe blocks or runtime cost." msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"Some of those variables can hold pointers to other local variables. Because " -"of that, the future should never be moved to a different memory location, as " -"it would invalidate those pointers." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md +msgid "Ownership: Must document and enforce object lifetimes manually." msgstr "" -#: src/async/pitfalls/pin.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md msgid "" -"To prevent moving the future type in memory, it can only be polled through a " -"pinned pointer. `Pin` is a wrapper around a reference that disallows all " -"operations that would move the instance it points to into a different memory " -"location." +"Callbacks: Must decompose closures into fn pointer + context; lifetime of context is " +"manual." msgstr "" -#: src/async/pitfalls/pin.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-c.md msgid "" -"// A work item. In this case, just sleep for the given time and respond\n" -"// with a message on the `respond_on` channel.\n" +"Panics: Panic across FFI boundary is undefined behavior; must catch at boundary with " +"`catch_unwind`." msgstr "" -#: src/async/pitfalls/pin.md -msgid "// A worker which listens for work on a queue and performs it.\n" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "C++" msgstr "" -#: src/async/pitfalls/pin.md -msgid "// Pretend to work.\n" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "**Overloading**" msgstr "" -#: src/async/pitfalls/pin.md -msgid "\"failed to send response\"" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "Manual/ad-hoc" msgstr "" -#: src/async/pitfalls/pin.md -msgid "// TODO: report number of iterations every 100ms\n" -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +#, fuzzy +msgid "Automatic" +msgstr "`statique`" -#: src/async/pitfalls/pin.md -msgid "// A requester which requests work and waits for it to complete.\n" -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +#, fuzzy +msgid "**Exceptions**" +msgstr "Exceptions" -#: src/async/pitfalls/pin.md -msgid "\"failed to send on work queue\"" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "\\-" msgstr "" -#: src/async/pitfalls/pin.md -msgid "\"failed waiting for response\"" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "Stack unwinding" msgstr "" -#: src/async/pitfalls/pin.md -msgid "\"work result for iteration {i}: {resp}\"" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +#, fuzzy +msgid "**Destructors**" +msgstr "Déstructuration des énumérations" + +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "Manual cleanup" msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"You may recognize this as an example of the actor pattern. Actors typically " -"call `select!` in a loop." +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "Automatic via destructors (RAII)" msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"This serves as a summation of a few of the previous lessons, so take your " -"time with it." +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "**Non-POD types**" msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"Naively add a `_ = sleep(Duration::from_millis(100)) => { println!(..) }` to " -"the `select!`. This will never execute. Why?" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "Objects with constructors, vtables, virtual bases" msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"Instead, add a `timeout_fut` containing that future outside of the `loop`:" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "**Templates**" msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"This still doesn't work. Follow the compiler errors, adding `&mut` to the " -"`timeout_fut` in the `select!` to work around the move, then using `Box::" -"pin`:" +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "Compile-time code generation" msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"This compiles, but once the timeout expires it is `Poll::Ready` on every " -"iteration (a fused future would help with this). Update to reset " -"`timeout_fut` every time it expires." +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "C++ includes a number of features that don't exist in C with an FFI impact:" msgstr "" -#: src/async/pitfalls/pin.md -msgid "" -"Box allocates on the heap. In some cases, `std::pin::pin!` (only recently " -"stabilized, with older code often using `tokio::pin!`) is also an option, " -"but that is difficult to use for a future that is reassigned." +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md +msgid "Overloading: Overloads become impossible to express because of name mangling" msgstr "" -#: src/async/pitfalls/pin.md +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md msgid "" -"Another alternative is to not use `pin` at all but spawn another task that " -"will send to a `oneshot` channel every 100ms." +"Exceptions: Must catch exceptions at the FFI boundary and convert them to error codes, as " +"escaping exceptions in `extern \"C\"` functions constitute undefined behavior" msgstr "" -#: src/async/pitfalls/pin.md +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md msgid "" -"Data that contains pointers to itself is called self-referential. Normally, " -"the Rust borrow checker would prevent self-referential data from being " -"moved, as the references cannot outlive the data they point to. However, the " -"code transformation for async blocks and functions is not verified by the " -"borrow checker." +"Destructors: C callers won't run destructors; must expose explicit `*_destroy()` functions" msgstr "" -#: src/async/pitfalls/pin.md +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md msgid "" -"`Pin` is a wrapper around a reference. An object cannot be moved from its " -"place using a pinned pointer. However, it can still be moved through an " -"unpinned pointer." +"Non-POD types: Must use opaque pointers across the FFI boundary as pass by value does not " +"make sense" msgstr "" -#: src/async/pitfalls/pin.md +#: src/unsafe-deep-dive/ffi/language-differences/cpp-and-c.md msgid "" -"The `poll` method of the `Future` trait uses `Pin<&mut Self>` instead of " -"`&mut Self` to refer to the instance. That's why it can only be called on a " -"pinned pointer." +"Templates: Cannot expose directly; must instantiate explicitly and wrap each " +"specialization" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"Async methods in traits are were stabilized only recently, in the 1.75 " -"release. This required support for using return-position `impl Trait` (RPIT) " -"in traits, as the desugaring for `async fn` includes `-> impl Future`." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "**Trivial relocatability**" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"However, even with the native support today there are some pitfalls around " -"`async fn` and RPIT in traits:" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "All moves are `memcpy`" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"Return-position impl Trait captures all in-scope lifetimes (so some patterns " -"of borrowing cannot be expressed)" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Self-referential types, move constructors can have side effects" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"Traits whose methods use return-position `impl trait` or `async` are not " -"`dyn` compatible." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "**Destruction safety**" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"If we do need `dyn` support, the crate [async_trait](https://docs.rs/async-" -"trait/latest/async_trait/) provides a workaround through a macro, with some " -"caveats:" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "`Drop::drop()` on original location only" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "\"running all sleepers..\"" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Destructor may run on moved-from objects" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "\"slept for {}ms\"" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +#, fuzzy +msgid "**Exception safety**" +msgstr "Exceptions" + +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Panics (abort or unwind)" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"`async_trait` is easy to use, but note that it's using heap allocations to " -"achieve this. This heap allocation has performance overhead." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +#, fuzzy +msgid "Exceptions (unwind)" +msgstr "Exceptions" + +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "**ABI stability**" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"The challenges in language support for `async trait` are deep Rust and " -"probably not worth describing in-depth. Niko Matsakis did a good job of " -"explaining them in [this post](https://smallcultfollowing.com/babysteps/" -"blog/2019/10/26/async-fn-in-traits-are-hard/) if you are interested in " -"digging deeper." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Explicitly unstable" msgstr "" -#: src/async/pitfalls/async-traits.md -msgid "" -"Try creating a new sleeper struct that will sleep for a random amount of " -"time and adding it to the Vec." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Vendor-specific" msgstr "" -#: src/async/pitfalls/cancellation.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md msgid "" -"Dropping a future implies it can never be polled again. This is called " -"_cancellation_ and it can occur at any `await` point. Care is needed to " -"ensure the system works correctly even when futures are cancelled. For " -"example, it shouldn't deadlock or lose data." +"Even if it were possible to avoid interop via C, there are still some areas of the " +"languages that impact FFI:" msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "\"not UTF-8\"" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "_Trivial relocatability_" msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "\"hi\\nthere\\n\"" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Cannot safely move C++ objects on the Rust side; must pin or keep in C++ heap." msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "\"tick!\"" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "" +"In Rust, object movement, which occurs during assignment or by being passed by value, " +"always copies values bit by bit." msgstr "" -#: src/async/pitfalls/cancellation.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md msgid "" -"The compiler doesn't help with cancellation-safety. You need to read API " -"documentation and consider what state your `async fn` holds." +"C++ allows users to define their own semantics by allowing them to overload the " +"assignment operator and create move and copy constructors." msgstr "" -#: src/async/pitfalls/cancellation.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md msgid "" -"Unlike `panic` and `?`, cancellation is part of normal control flow (vs " -"error-handling)." +"This impacts interop because self-referential types become natural in high-performance C+" +"+. Custom constructors can uphold safety invariants even when the object moves its " +"position in memory." msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "The example loses parts of the string." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Objects with the same semantics are impossible to define in Rust." msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "" -"Whenever the `tick()` branch finishes first, `next()` and its `buf` are " -"dropped." -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +#, fuzzy +msgid "_Destruction safety_" +msgstr "Déstructuration des énumérations" -#: src/async/pitfalls/cancellation.md +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md msgid "" -"`LinesReader` can be made cancellation-safe by making `buf` part of the " -"struct:" +"Moved-from C++ object semantics don't map; must prevent Rust from \"moving\" C++ types." msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "// prefix buf and bytes with self.\n" -msgstr "" +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +#, fuzzy +msgid "_Exception safety_" +msgstr "Exceptions" -#: src/async/pitfalls/cancellation.md -msgid "" -"[`Interval::tick`](https://docs.rs/tokio/latest/tokio/time/struct.Interval." -"html#method.tick) is cancellation-safe because it keeps track of whether a " -"tick has been 'delivered'." +#: src/unsafe-deep-dive/ffi/language-differences/rust-and-cpp.md +msgid "Neither can cross into the other safely; both must catch at the boundary." msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "" -"[`AsyncReadExt::read`](https://docs.rs/tokio/latest/tokio/io/trait." -"AsyncReadExt.html#method.read) is cancellation-safe because it either " -"returns or doesn't read data." +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Wrapping `abs(3)`" msgstr "" -#: src/async/pitfalls/cancellation.md -msgid "" -"[`AsyncBufReadExt::read_line`](https://docs.rs/tokio/latest/tokio/io/trait." -"AsyncBufReadExt.html#method.read_line) is similar to the example and _isn't_ " -"cancellation-safe. See its documentation for details and alternatives." +#: src/unsafe-deep-dive/ffi/abs.md +msgid "In this slide, we’re establishing a pattern for writing wrappers." msgstr "" -#: src/exercises/concurrency/afternoon.md +#: src/unsafe-deep-dive/ffi/abs.md msgid "" -"To practice your Async Rust skills, we have again two exercises for you:" +"Find the external definition of a function’s signature Write a matching function in Rust " +"within an `extern` block Confirm which safety invariants need to be upheld Decide whether " +"it’s possible to mark the function as safe" msgstr "" -#: src/exercises/concurrency/afternoon.md -msgid "" -"Dining philosophers: we already saw this problem in the morning. This time " -"you are going to implement it with Async Rust." +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Note that this doesn’t work _yet_." msgstr "" -#: src/exercises/concurrency/afternoon.md -msgid "" -"A Broadcast Chat Application: this is a larger project that allows you " -"experiment with more advanced Async Rust features." +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Add the extern block:" msgstr "" -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy -msgid "Dining Philosophers --- Async" -msgstr "Dîner des philosophes - Asynchrone" - -#: src/exercises/concurrency/dining-philosophers-async.md +#: src/unsafe-deep-dive/ffi/abs.md msgid "" -"See [dining philosophers](dining-philosophers.md) for a description of the " -"problem." +"Explain that many POSIX functions are available in Rust because Cargo links against the C " +"standard library (libc) by default, which brings its symbols into the program’s scope." msgstr "" -#: src/exercises/concurrency/dining-philosophers-async.md +#: src/unsafe-deep-dive/ffi/abs.md #, fuzzy msgid "" -"As before, you will need a local [Cargo installation](../../cargo/running-" -"locally.md) for this exercise. Copy the code below to a file called `src/" -"main.rs`, fill out the blanks, and test that `cargo run` does not deadlock:" -msgstr "" -"Vous aurez besoin d'une [installation Cargo](../../cargo/running-locally.md) " -"locale pour cet exercice. Copiez le code ci-dessous dans un fichier appelé " -"`src/main.rs`, remplissez le vides, et testez que `cargo run` ne se bloque " -"pas :" +"Show `man 3 abs` in the terminal or [a webpage](https://www.man7.org/linux/man-pages/man3/" +"abs.3.html)." +msgstr "[`closedir(3)`](https://man7.org/linux/man-pages/man3/closedir.3.html)" -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Keep trying until we have both forks\n" +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Explain that our function signature must match its definition: `int abs(int j);`." msgstr "" -#: src/exercises/concurrency/dining-philosophers-async.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Make them think and eat\n" +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Update the code block to use the C types." msgstr "" -#: src/exercises/concurrency/dining-philosophers-async.md +#: src/unsafe-deep-dive/ffi/abs.md msgid "" -"Since this time you are using Async Rust, you'll need a `tokio` dependency. " -"You can use the following `Cargo.toml`:" +"Discuss rationale: using `ffi::c_int` increases the portability of our code. When the " +"standard library is compiled for the target platform, the platform can determine the " +"widths. According to the C standard, a `c_int` may be defined as an `i16` rather than the " +"much more common `i32`." msgstr "" -#: src/exercises/concurrency/dining-philosophers-async.md +#: src/unsafe-deep-dive/ffi/abs.md msgid "" -"```toml\n" -"[package]\n" -"name = \"dining-philosophers-async-dine\"\n" -"version = \"0.1.0\"\n" -"edition = \"2021\"\n" -"\n" -"[dependencies]\n" -"tokio = { version = \"1.26.0\", features = [\"sync\", \"time\", \"macros\", " -"\"rt-multi-thread\"] }\n" -"```" +"(Optional) Show the [documentation for c_int](https://doc.rust-lang.org/std/ffi/type." +"c_int.html) to reveal that it is a type alias for `i32`." msgstr "" -#: src/exercises/concurrency/dining-philosophers-async.md -msgid "" -"Also note that this time you have to use the `Mutex` and the `mpsc` module " -"from the `tokio` crate." +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Attempt to compile to trigger “error: extern blocks must be unsafe” error message." msgstr "" -#: src/exercises/concurrency/dining-philosophers-async.md -msgid "Can you make your implementation single-threaded?" +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Add the unsafe keyword to the block:" msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/abs.md msgid "" -"In this exercise, we want to use our new knowledge to implement a broadcast " -"chat application. We have a chat server that the clients connect to and " -"publish their messages. The client reads user messages from the standard " -"input, and sends them to the server. The chat server broadcasts each message " -"that it receives to all the clients." +"Check that learners understand the significance of this change. We are required to uphold " +"type safety and other safety preconditions." msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "" -"For this, we use [a broadcast channel](https://docs.rs/tokio/latest/tokio/" -"sync/broadcast/fn.channel.html) on the server, and [`tokio_websockets`]" -"(https://docs.rs/tokio-websockets/) for the communication between the client " -"and the server." +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Recompile." msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "Create a new Cargo project and add the following dependencies:" +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Add safe keyword to the abs function:" msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "_Cargo.toml_:" +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Explain that the `safe fn` marks `abs` as safe to call without an `unsafe` block." msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "" -"```toml\n" -"[package]\n" -"name = \"chat-async\"\n" -"version = \"0.1.0\"\n" -"edition = \"2021\"\n" -"\n" -"[dependencies]\n" -"futures-util = { version = \"0.3.30\", features = [\"sink\"] }\n" -"http = \"1.1.0\"\n" -"tokio = { version = \"1.36.0\", features = [\"full\"] }\n" -"tokio-websockets = { version = \"0.7.0\", features = [\"client\", " -"\"fastrand\", \"server\", \"sha1_smol\"] }\n" -"```" +#: src/unsafe-deep-dive/ffi/abs.md +msgid "Completed program for reference:" msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "The required APIs" +#: src/unsafe-deep-dive/ffi/rand.md +msgid "Wrapping `srand(3)` and `rand(3)`" msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/rand.md msgid "" -"You are going to need the following functions from `tokio` and " -"[`tokio_websockets`](https://docs.rs/tokio-websockets/). Spend a few minutes " -"to familiarize yourself with the API." +"// unsafe extern \"C\" {\n" +"// /// Seed the rng\n" +"// fn srand(seed: std::ffi::c_uint);\n" msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/rand.md msgid "" -"[StreamExt::next()](https://docs.rs/futures-util/0.3.28/futures_util/stream/" -"trait.StreamExt.html#method.next) implemented by `WebSocketStream`: for " -"asynchronously reading messages from a Websocket Stream." +"// fn rand() -> std::ffi::c_int;\n" +"// }\n" +msgstr "" + +#: src/unsafe-deep-dive/ffi/rand.md +msgid "\"{a:?}\"" msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/rand.md msgid "" -"[SinkExt::send()](https://docs.rs/futures-util/0.3.28/futures_util/sink/" -"trait.SinkExt.html#method.send) implemented by `WebSocketStream`: for " -"asynchronously sending messages on a Websocket Stream." +"This slide attempts to demonstrate that it is very easy for wrappers to trigger undefined " +"behavior if they are written incorrectly. We’ll see how easy it is to trigger type safety " +"problems." msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/rand.md msgid "" -"[Lines::next_line()](https://docs.rs/tokio/latest/tokio/io/struct.Lines." -"html#method.next_line): for asynchronously reading user messages from the " -"standard input." +"Explain that `rand` and `srand` functions are provided by the C standard library (libc)." msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/rand.md msgid "" -"[Sender::subscribe()](https://docs.rs/tokio/latest/tokio/sync/broadcast/" -"struct.Sender.html#method.subscribe): for subscribing to a broadcast channel." +"Explain that the functions are exported by the libc crate, but we can also write an FFI " +"wrapper for them manually." msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "Two binaries" -msgstr "Deux binaires" +#: src/unsafe-deep-dive/ffi/rand.md +#, fuzzy +msgid "Show calling the functions from the exported." +msgstr "Appelez les fonctions Rust à partir d'autres langues." -#: src/exercises/concurrency/chat-app.md -msgid "" -"Normally in a Cargo project, you can have only one binary, and one `src/main." -"rs` file. In this project, we need two binaries. One for the client, and one " -"for the server. You could potentially make them two separate Cargo projects, " -"but we are going to put them in a single Cargo project with two binaries. " -"For this to work, the client and the server code should go under `src/bin` " -"(see the [documentation](https://doc.rust-lang.org/cargo/reference/cargo-" -"targets.html#binaries))." +#: src/unsafe-deep-dive/ffi/rand.md +msgid "Code compiles because libc is linked to Rust programs by default." +msgstr "" + +#: src/unsafe-deep-dive/ffi/rand.md +msgid "Explain that Rust will trust you if you use the wrong type(s)." +msgstr "" + +#: src/unsafe-deep-dive/ffi/rand.md +msgid "Modify `fn rand() -> std::ffi::c_int;` to return `char`." msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/rand.md msgid "" -"Copy the following server and client code into `src/bin/server.rs` and `src/" -"bin/client.rs`, respectively. Your task is to complete these files as " -"described below." +"Avoiding type safety issues is a reason for using tools for generating wrappers, rather " +"than doing it by hand." msgstr "" -#: src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md +#: src/unsafe-deep-dive/ffi/c-library-example.md #, fuzzy -msgid "_src/bin/server.rs_:" -msgstr "`src/main.rs` :" +msgid "C Library Example" +msgstr "Rust by Example" -#: src/exercises/concurrency/chat-app.md -msgid "// TODO: For a hint, see the description of the task below.\n" +#: src/unsafe-deep-dive/ffi/c-library-example.md +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "" msgstr "" -#: src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"127.0.0.1:2000\"" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "" msgstr "" -#: src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"listening on port 2000\"" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* Return `false` to indicate that no token was found. */" msgstr "" -#: src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"New connection from {addr:?}\"" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* TextAnalyst constructor */" msgstr "" -#: src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Wrap the raw TCP stream into a websocket.\n" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* TextAnalyst destructor */" msgstr "" -#: src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy -msgid "_src/bin/client.rs_:" -msgstr "`src/main.rs` :" - -#: src/exercises/concurrency/chat-app.md -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"ws://127.0.0.1:2000\"" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* Resets state to clear the current document */" msgstr "" -#: src/exercises/concurrency/chat-app.md -#, fuzzy -msgid "Running the binaries" -msgstr "Exécution du parcours" - -#: src/exercises/concurrency/chat-app.md -#, fuzzy -msgid "Run the server with:" -msgstr "Exécutez l'exemple avec :" - -#: src/exercises/concurrency/chat-app.md -#, fuzzy -msgid "and the client with:" -msgstr "Exécutez l'exemple avec :" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* Use custom tokenizer (defaults to whitespace) */" +msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "Implement the `handle_connection` function in `src/bin/server.rs`." +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* Apply `callback` to each token */" msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "" -"Hint: Use `tokio::select!` for concurrently performing two tasks in a " -"continuous loop. One task receives messages from the client and broadcasts " -"them. The other sends messages received by the server to the client." +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* Get human-readable error message */" msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "Complete the main function in `src/bin/client.rs`." +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "/* TEXT_ANALYSIS_H */" msgstr "" -#: src/exercises/concurrency/chat-app.md -msgid "" -"Hint: As before, use `tokio::select!` in a continuous loop for concurrently " -"performing two tasks: (1) reading user messages from standard input and " -"sending them to the server, and (2) receiving messages from the server, and " -"displaying them for the user." +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "C libraries will hide their implementation details with a `void*` argument." msgstr "" -#: src/exercises/concurrency/chat-app.md +#: src/unsafe-deep-dive/ffi/c-library-example.md msgid "" -"Optional: Once you are done, change the code to broadcast messages to all " -"clients, but the sender of the message." +"Consider this header file of a natural language processing library that hides the " +"`TextAnalyst` and `Analysis` types." msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy -msgid "Concurrency Afternoon Exercise" -msgstr "Exercices de l'après-midi du jour 1" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "This can be emulated in Rust with a type similar to this:" +msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md +#: src/unsafe-deep-dive/ffi/c-library-example.md #, fuzzy -msgid "([back to exercise](dining-philosophers-async.md))" -msgstr "([retour à l'exercice](dining-philosophers.md))" +msgid "Exercise: Ask learners to wrap this library." +msgstr "Une bibliothèque d'interface graphique" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "" -"// If we didn't get the left fork, drop the right fork if we\n" -" // have it and let other tasks make progress.\n" +#: src/unsafe-deep-dive/ffi/c-library-example.md +msgid "// ffi.rs\n" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "" -"// If we didn't get the right fork, drop the left fork and let\n" -" // other tasks make progress.\n" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "Example: String interning library" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// The locks are dropped here\n" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "C++ Header: interner.hpp" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// tx is dropped here, so we don't need to explicitly drop it later\n" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +#, fuzzy +msgid "" +msgstr "String" + +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"Here is a thought: {thought}\"" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "// Returns a pointer to the interned string (valid for lifetime of interner)\n" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy -msgid "([back to exercise](chat-app.md))" -msgstr "([retour à l'exercice](rtc.md))" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "C header file: interner.h" +msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"Welcome to chat! Type a message\"" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "// interner.h (C API for FFI)\n" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "" -"// A continuous loop for concurrently performing two tasks: (1) receiving\n" -" // messages from `ws_stream` and broadcasting them, and (2) receiving\n" -" // messages on `bcast_rx` and sending them to the client.\n" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "C++ implementation (interner.cpp)" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"From client {addr:?} {text:?}\"" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "\"interner.hpp\"" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "// Continuous loop for concurrently sending and receiving messages.\n" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "\"interner.h\"" msgstr "" -#: src/exercises/concurrency/solutions-afternoon.md -msgid "\"From server: {}\"" +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "" +"This is a larger example. Write a wrapper for the string interner. You will need to guide " +"learners on how to create an opaque pointer, either directly by explaining the code below " +"or asking learners to do further research." +msgstr "" + +#: src/unsafe-deep-dive/ffi/cpp-library-example.md +msgid "Once the raw wrapper is written, ask learners to create a safe wrapper." msgstr "" #: src/thanks.md msgid "" -"_Thank you for taking Comprehensive Rust 🦀!_ We hope you enjoyed it and " -"that it was useful." +"_Thank you for taking Comprehensive Rust 🦀!_ We hope you enjoyed it and that it was " +"useful." msgstr "" -"_Merci d'avoir pris Comprehensive Rust(le guide complet de Rust) 🦀!_ Nous " -"espérons que vous l'avez apprécié et qu'il était utile." +"_Merci d'avoir pris Comprehensive Rust(le guide complet de Rust) 🦀!_ Nous espérons que " +"vous l'avez apprécié et qu'il était utile." #: src/thanks.md #, fuzzy msgid "" -"We've had a lot of fun putting the course together. The course is not " -"perfect, so if you spotted any mistakes or have ideas for improvements, " -"please get in [contact with us on GitHub](https://github.com/google/" -"comprehensive-rust/discussions). We would love to hear from you." +"We have enjoyed putting the course together. The course is not perfect, so if you spotted " +"any mistakes or have ideas for improvements, please get in [contact with us on GitHub]" +"(https://github.com/google/comprehensive-rust/discussions). We would love to hear from " +"you." msgstr "" -"Nous nous sommes beaucoup amusés à préparer le cours. Le cours n'est pas " -"parfait, donc si vous avez repéré des erreurs ou avez des idées " -"d'améliorations, n'hésitez pas à nous contacter [contactez-nous au GitHub]" -"(https://github.com/google/comprehensive-rust/discussions). Nous aimerions " -"d'avoir de tes nouvelles." +"Nous nous sommes beaucoup amusés à préparer le cours. Le cours n'est pas parfait, donc si " +"vous avez repéré des erreurs ou avez des idées d'améliorations, n'hésitez pas à nous " +"contacter [contactez-nous au GitHub](https://github.com/google/comprehensive-rust/" +"discussions). Nous aimerions d'avoir de tes nouvelles." -#: src/glossary.md +#: src/thanks.md msgid "" -"The following is a glossary which aims to give a short definition of many " -"Rust terms. For translations, this also serves to connect the term back to " -"the English original." +"Thank you for reading the speaker notes! We hope they have been useful. If you find pages " +"without notes, please send us a PR and link it to [issue #1083](https://github.com/google/" +"comprehensive-rust/issues/1083). We are also very grateful for fixes and improvements to " +"the existing notes." msgstr "" #: src/glossary.md msgid "" -"allocate: \n" -"Dynamic memory allocation on [the heap](memory-management/stack-vs-heap.md)." +"The following is a glossary which aims to give a short definition of many Rust terms. For " +"translations, this also serves to connect the term back to the English original." msgstr "" +#. Please add the English term in italic after your translated term. Also, please keep the hard line breaks to ensure a nice formatting. #: src/glossary.md msgid "" -"argument: \n" -"Information that is passed into a function or method." +"allocate: \n" +"Dynamic memory allocation on [the heap](memory-management/review.md)." msgstr "" #: src/glossary.md msgid "" -"Bare-metal Rust: \n" -"Low-level Rust development, often deployed to a system without an operating " -"system. See [Bare-metal Rust](bare-metal.md)." +"array: \n" +"A fixed-size collection of elements of the same type, stored contiguously in memory. See " +"[Arrays](tuples-and-arrays/arrays.md)." msgstr "" #: src/glossary.md msgid "" -"block: \n" -"See [Blocks](control-flow/blocks.md) and _scope_." +"associated type: \n" +"A type associated with a specific trait. Useful for defining the relationship between " +"types." msgstr "" #: src/glossary.md msgid "" -"borrow: \n" -"See [Borrowing](ownership/borrowing.md)." +"Bare-metal Rust: \n" +"Low-level Rust development, often deployed to a system without an operating system. See " +"[Bare-metal Rust](bare-metal.md)." msgstr "" #: src/glossary.md msgid "" -"borrow checker: \n" -"The part of the Rust compiler which checks that all borrows are valid." +"block: \n" +"See [Blocks](control-flow-basics/blocks-and-scopes.md) and _scope_." msgstr "" #: src/glossary.md msgid "" -"brace: \n" -"`{` and `}`. Also called _curly brace_, they delimit _blocks_." +"borrow: \n" +"See [Borrowing](borrowing/shared.md)." msgstr "" #: src/glossary.md msgid "" -"build: \n" -"The process of converting source code into executable code or a usable " -"program." +"borrow checker: \n" +"The part of the Rust compiler which checks that all [borrows](borrowing/borrowck.md) are " +"valid." msgstr "" #: src/glossary.md msgid "" -"call: \n" -"To invoke or execute a function or method." +"brace: \n" +"`{` and `}`. Also called _curly brace_, they delimit [_blocks_](control-flow-basics/" +"blocks-and-scopes.md)." msgstr "" #: src/glossary.md @@ -20881,194 +35634,172 @@ msgid "" "Used to safely pass messages [between threads](concurrency/channels.md)." msgstr "" -#: src/glossary.md -msgid "" -"Comprehensive Rust 🦀: \n" -"The courses here are jointly called Comprehensive Rust 🦀." -msgstr "" - #: src/glossary.md msgid "" "concurrency: \n" -"The execution of multiple tasks or processes at the same time." -msgstr "" - -#: src/glossary.md -msgid "" -"Concurrency in Rust: \n" -"See [Concurrency in Rust](concurrency.md)." +"The execution of multiple tasks or processes at the same time. See [Welcome to " +"Concurrency in Rust](concurrency/welcome.md)." msgstr "" #: src/glossary.md msgid "" "constant: \n" -"A value that does not change during the execution of a program." +"A value that does not change during the execution of a program. See [const](user-defined-" +"types/const.md)." msgstr "" #: src/glossary.md msgid "" "control flow: \n" -"The order in which the individual statements or instructions are executed in " -"a program." +"The order in which the individual statements or instructions are executed in a program. " +"See [Control Flow Basics](control-flow-basics.md)." msgstr "" #: src/glossary.md msgid "" "crash: \n" -"An unexpected and unhandled failure or termination of a program." +"An unexpected and unhandled failure or termination of a program. See [panic](error-" +"handling/panics.md)." msgstr "" #: src/glossary.md msgid "" "enumeration: \n" -"A data type that holds one of several named constants, possibly with an " -"associated tuple or struct." +"A data type that holds one of several named constants, possibly with an associated tuple " +"or struct. See [enum](user-defined-types/enums.md)." msgstr "" #: src/glossary.md msgid "" "error: \n" -"An unexpected condition or result that deviates from the expected behavior." +"An unexpected condition or result that deviates from the expected behavior. See [Error " +"Handling](error-handling.md)." msgstr "" #: src/glossary.md msgid "" "error handling: \n" -"The process of managing and responding to errors that occur during program " -"execution." -msgstr "" - -#: src/glossary.md -msgid "" -"exercise: \n" -"A task or problem designed to practice and test programming skills." +"The process of managing and responding to [errors](error-handling.md) that occur during " +"program execution." msgstr "" #: src/glossary.md msgid "" "function: \n" -"A reusable block of code that performs a specific task." +"A reusable block of code that performs a specific task. See [Functions](control-flow-" +"basics/functions.md)." msgstr "" #: src/glossary.md msgid "" "garbage collector: \n" -"A mechanism that automatically frees up memory occupied by objects that are " -"no longer in use." +"A mechanism that automatically frees up memory occupied by objects that are no longer in " +"use. See [Approaches to Memory Management](memory-management/approaches.md)." msgstr "" #: src/glossary.md msgid "" "generics: \n" -"A feature that allows writing code with placeholders for types, enabling " -"code reuse with different data types." +"A feature that allows writing code with placeholders for types, enabling code reuse with " +"different data types. See [Generics](generics.md)." msgstr "" #: src/glossary.md msgid "" "immutable: \n" -"Unable to be changed after creation." +"Unable to be changed after creation. See [Variables](types-and-values/variables.md)." msgstr "" #: src/glossary.md msgid "" "integration test: \n" -"A type of test that verifies the interactions between different parts or " -"components of a system." -msgstr "" - -#: src/glossary.md -msgid "" -"keyword: \n" -"A reserved word in a programming language that has a specific meaning and " -"cannot be used as an identifier." +"A type of test that verifies the interactions between different parts or components of a " +"system. See [Other Types of Tests](testing/other.md)." msgstr "" #: src/glossary.md msgid "" "library: \n" -"A collection of precompiled routines or code that can be used by programs." +"A collection of precompiled routines or code that can be used by programs. See [Modules]" +"(modules.md)." msgstr "" #: src/glossary.md msgid "" "macro: \n" -"Rust macros can be recognized by a `!` in the name. Macros are used when " -"normal functions are not enough. A typical example is `format!`, which takes " -"a variable number of arguments, which isn't supported by Rust functions." +"Rust [macros](control-flow-basics/macros.md) can be recognized by a `!` in the name. " +"Macros are used when normal functions are not enough. A typical example is `format!`, " +"which takes a variable number of arguments, which isn't supported by Rust functions." msgstr "" #: src/glossary.md msgid "" "`main` function: \n" -"Rust programs start executing with the `main` function." +"Rust programs start executing with the [`main` function](types-and-values/hello-world.md)." msgstr "" #: src/glossary.md msgid "" "match: \n" -"A control flow construct in Rust that allows for pattern matching on the " -"value of an expression." +"A control flow construct in Rust that allows for [pattern matching](pattern-matching.md) " +"on the value of an expression." msgstr "" #: src/glossary.md msgid "" "memory leak: \n" -"A situation where a program fails to release memory that is no longer " -"needed, leading to a gradual increase in memory usage." +"A situation where a program fails to release memory that is no longer needed, leading to " +"a gradual increase in memory usage. See [Approaches to Memory Management](memory-" +"management/approaches.md)." msgstr "" #: src/glossary.md msgid "" "method: \n" -"A function associated with an object or a type in Rust." +"A function associated with an object or a type in Rust. See [Methods](methods-and-traits/" +"methods.md)." msgstr "" #: src/glossary.md msgid "" "module: \n" -"A namespace that contains definitions, such as functions, types, or traits, " -"to organize code in Rust." +"A namespace that contains definitions, such as functions, types, or traits, to organize " +"code in Rust. See [Modules](modules.md)." msgstr "" #: src/glossary.md msgid "" "move: \n" -"The transfer of ownership of a value from one variable to another in Rust." +"The transfer of ownership of a value from one variable to another in Rust. See [Move " +"Semantics](memory-management/move.md)." msgstr "" #: src/glossary.md msgid "" "mutable: \n" -"A property in Rust that allows variables to be modified after they have been " -"declared." +"A property in Rust that allows [variables](types-and-values/variables.md) to be modified " +"after they have been declared." msgstr "" #: src/glossary.md msgid "" "ownership: \n" -"The concept in Rust that defines which part of the code is responsible for " -"managing the memory associated with a value." +"The concept in Rust that defines which part of the code is responsible for managing the " +"memory associated with a value. See [Ownership](memory-management/ownership.md)." msgstr "" #: src/glossary.md msgid "" "panic: \n" -"An unrecoverable error condition in Rust that results in the termination of " -"the program." -msgstr "" - -#: src/glossary.md -msgid "" -"parameter: \n" -"A value that is passed into a function or method when it is called." +"An unrecoverable error condition in Rust that results in the termination of the program. " +"See [Panics](error-handling/panics.md)." msgstr "" #: src/glossary.md msgid "" "pattern: \n" -"A combination of values, literals, or structures that can be matched against " -"an expression in Rust." +"A combination of values, literals, or structures that can be matched against an " +"expression in Rust. See [Pattern Matching](pattern-matching.md)." msgstr "" #: src/glossary.md @@ -21077,196 +35808,180 @@ msgid "" "The data or information carried by a message, event, or data structure." msgstr "" -#: src/glossary.md -msgid "" -"program: \n" -"A set of instructions that a computer can execute to perform a specific task " -"or solve a particular problem." -msgstr "" - -#: src/glossary.md -msgid "" -"programming language: \n" -"A formal system used to communicate instructions to a computer, such as Rust." -msgstr "" - #: src/glossary.md msgid "" "receiver: \n" -"The first parameter in a Rust method that represents the instance on which " -"the method is called." +"The first parameter in a Rust [method](methods-and-traits/methods.md) that represents the " +"instance on which the method is called." msgstr "" #: src/glossary.md msgid "" -"reference counting: \n" -"A memory management technique in which the number of references to an object " -"is tracked, and the object is deallocated when the count reaches zero." +"reference: \n" +"A non-owning pointer to a value that borrows it without transferring ownership. " +"References can be [shared (immutable)](references/shared.md) or [exclusive (mutable)]" +"(references/exclusive.md)." msgstr "" #: src/glossary.md msgid "" -"return: \n" -"A keyword in Rust used to indicate the value to be returned from a function." +"reference counting: \n" +"A memory management technique in which the number of references to an object is tracked, " +"and the object is deallocated when the count reaches zero. See [Rc](smart-pointers/rc.md)." msgstr "" #: src/glossary.md msgid "" "Rust: \n" -"A systems programming language that focuses on safety, performance, and " -"concurrency." -msgstr "" - -#: src/glossary.md -msgid "" -"Rust Fundamentals: \n" -"Days 1 to 4 of this course." +"A systems programming language that focuses on safety, performance, and concurrency. See " +"[What is Rust?](hello-world/what-is-rust.md)." msgstr "" #: src/glossary.md msgid "" -"Rust in Android: \n" -"See [Rust in Android](android.md)." -msgstr "" - -#: src/glossary.md -msgid "" -"Rust in Chromium: \n" -"See [Rust in Chromium](chromium.md)." +"safe: \n" +"Refers to code that adheres to Rust's ownership and borrowing rules, preventing memory-" +"related errors. See [Unsafe Rust](unsafe-rust.md)." msgstr "" #: src/glossary.md msgid "" -"safe: \n" -"Refers to code that adheres to Rust's ownership and borrowing rules, " -"preventing memory-related errors." +"slice: \n" +"A dynamically-sized view into a contiguous sequence, such as an array or vector. Unlike " +"arrays, slices have a size determined at runtime. See [Slices](references/slices.md)." msgstr "" #: src/glossary.md msgid "" "scope: \n" -"The region of a program where a variable is valid and can be used." +"The region of a program where a variable is valid and can be used. See [Blocks and Scopes]" +"(control-flow-basics/blocks-and-scopes.md)." msgstr "" #: src/glossary.md msgid "" "standard library: \n" -"A collection of modules providing essential functionality in Rust." +"A collection of modules providing essential functionality in Rust. See [Standard Library]" +"(std-types/std.md)." msgstr "" #: src/glossary.md msgid "" "static: \n" -"A keyword in Rust used to define static variables or items with a `'static` " -"lifetime." +"A keyword in Rust used to define static variables or items with a `'static` lifetime. See " +"[static](user-defined-types/static.md)." msgstr "" #: src/glossary.md msgid "" "string: \n" -"A data type storing textual data. See [`String` vs `str`](basic-syntax/" -"string-slices.html) for more." +"A data type storing textual data. See [Strings](references/strings.md)." msgstr "" #: src/glossary.md msgid "" "struct: \n" -"A composite data type in Rust that groups together variables of different " -"types under a single name." +"A composite data type in Rust that groups together variables of different types under a " +"single name. See [Structs](user-defined-types/named-structs.md)." msgstr "" #: src/glossary.md msgid "" "test: \n" -"A Rust module containing functions that test the correctness of other " -"functions." +"A function that tests the correctness of other code. Rust has a built-in test runner. See " +"[Testing](testing.md)." msgstr "" #: src/glossary.md msgid "" "thread: \n" -"A separate sequence of execution in a program, allowing concurrent execution." +"A separate sequence of execution in a program, allowing concurrent execution. See " +"[Threads](concurrency/threads.md)." msgstr "" #: src/glossary.md msgid "" "thread safety: \n" -"The property of a program that ensures correct behavior in a multithreaded " -"environment." +"The property of a program that ensures correct behavior in a multithreaded environment. " +"See [Send and Sync](concurrency/send-sync.md)." msgstr "" #: src/glossary.md msgid "" "trait: \n" -"A collection of methods defined for an unknown type, providing a way to " -"achieve polymorphism in Rust." +"A collection of methods defined for an unknown type, providing a way to achieve " +"polymorphism in Rust. See [Traits](methods-and-traits/traits.md)." msgstr "" #: src/glossary.md msgid "" "trait bound: \n" -"An abstraction where you can require types to implement some traits of your " -"interest." +"An abstraction where you can require types to implement some traits of your interest. See " +"[Trait Bounds](generics/trait-bounds.md)." msgstr "" #: src/glossary.md msgid "" "tuple: \n" -"A composite data type that contains variables of different types. Tuple " -"fields have no names, and are accessed by their ordinal numbers." +"A composite data type that contains variables of different types. Tuple fields have no " +"names, and are accessed by their ordinal numbers. See [Tuples](tuples-and-arrays/tuples." +"md)." msgstr "" #: src/glossary.md msgid "" "type: \n" -"A classification that specifies which operations can be performed on values " -"of a particular kind in Rust." +"A classification that specifies which operations can be performed on values of a " +"particular kind in Rust. See [Types and Values](types-and-values.md)." msgstr "" #: src/glossary.md msgid "" "type inference: \n" -"The ability of the Rust compiler to deduce the type of a variable or " -"expression." +"The ability of the Rust compiler to deduce the type of a variable or expression. See " +"[Type Inference](types-and-values/inference.md)." msgstr "" #: src/glossary.md msgid "" "undefined behavior: \n" -"Actions or conditions in Rust that have no specified result, often leading " -"to unpredictable program behavior." +"Actions or conditions in Rust that have no specified result, often leading to " +"unpredictable program behavior. See [Unsafe Rust](unsafe-rust.md)." msgstr "" #: src/glossary.md msgid "" "union: \n" -"A data type that can hold values of different types but only one at a time." +"A data type that can hold values of different types but only one at a time. See [Unions]" +"(unsafe-rust/unions.md)." msgstr "" #: src/glossary.md msgid "" "unit test: \n" -"Rust comes with built-in support for running small unit tests and larger " -"integration tests. See [Unit Tests](testing/unit-tests.html)." +"Rust comes with built-in support for running small unit tests and larger integration " +"tests. See [Unit Tests](testing/unit-tests.md)." msgstr "" #: src/glossary.md msgid "" "unit type: \n" -"Type that holds no data, written as a tuple with no members." +"Type that holds no data, written as a tuple with no members. See speaker notes on " +"[Functions](control-flow-basics/functions.html)." msgstr "" #: src/glossary.md msgid "" "unsafe: \n" -"The subset of Rust which allows you to trigger _undefined behavior_. See " -"[Unsafe Rust](unsafe.html)." +"The subset of Rust which allows you to trigger _undefined behavior_. See [Unsafe Rust]" +"(unsafe-rust/unsafe.md)." msgstr "" #: src/glossary.md msgid "" "variable: \n" -"A memory location storing data. Variables are valid in a _scope_." +"A memory location storing data. Variables are valid in a _scope_. See [Variables](types-" +"and-values/variables.md)." msgstr "" #: src/other-resources.md @@ -21275,12 +35990,10 @@ msgstr "Autres ressources Rust" #: src/other-resources.md #, fuzzy -msgid "" -"The Rust community has created a wealth of high-quality and free resources " -"online." +msgid "The Rust community has created a wealth of high-quality and free resources online." msgstr "" -"La communauté Rust a créé une multitude de ressources gratuites et de haute " -"qualité en ligne." +"La communauté Rust a créé une multitude de ressources gratuites et de haute qualité en " +"ligne." #: src/other-resources.md #, fuzzy @@ -21291,49 +36004,50 @@ msgstr "Documents officiels" #, fuzzy msgid "The Rust project hosts many resources. These cover Rust in general:" msgstr "" -"Le projet Rust héberge de nombreuses ressources. Celles-ci couvrent Rust en " -"général :" +"Le projet Rust héberge de nombreuses ressources. Celles-ci couvrent Rust en général :" #: src/other-resources.md #, fuzzy msgid "" -"[The Rust Programming Language](https://doc.rust-lang.org/book/): the " -"canonical free book about Rust. Covers the language in detail and includes a " -"few projects for people to build." +"[The Rust Programming Language](https://doc.rust-lang.org/book/): the canonical free book " +"about Rust. Covers the language in detail and includes a few projects for people to build." msgstr "" -"[Le langage de programmation Rust](https://doc.rust-lang.org/book/) : le " -"livre canonique gratuit sur Rust. Couvre la langue en détail et comprend un " -"peu de projets à construire." +"[Le langage de programmation Rust](https://doc.rust-lang.org/book/) : le livre canonique " +"gratuit sur Rust. Couvre la langue en détail et comprend un peu de projets à construire." #: src/other-resources.md msgid "" -"[Rust By Example](https://doc.rust-lang.org/rust-by-example/): covers the " -"Rust syntax via a series of examples which showcase different constructs. " -"Sometimes includes small exercises where you are asked to expand on the code " -"in the examples." +"[Rust By Example](https://doc.rust-lang.org/rust-by-example/): covers the Rust syntax via " +"a series of examples which showcase different constructs. Sometimes includes small " +"exercises where you are asked to expand on the code in the examples." msgstr "" -"[Rust By Example](https://doc.rust-lang.org/rust-by-example/) : couvre la " -"syntaxe de Rust via une série d'exemples qui présentent différentes " -"constructions. Parfois comprend de petits exercices où l'on vous demande de " -"développer le code de l'exemple." +"[Rust By Example](https://doc.rust-lang.org/rust-by-example/) : couvre la syntaxe de Rust " +"via une série d'exemples qui présentent différentes constructions. Parfois comprend de " +"petits exercices où l'on vous demande de développer le code de l'exemple." #: src/other-resources.md #, fuzzy msgid "" -"[Rust Standard Library](https://doc.rust-lang.org/std/): full documentation " -"of the standard library for Rust." +"[Rust Standard Library](https://doc.rust-lang.org/std/): full documentation of the " +"standard library for Rust." msgstr "" -"[Bibliothèque standard Rust](https://doc.rust-lang.org/std/) : documentation " -"complète de la bibliothèque standard de Rust." +"[Bibliothèque standard Rust](https://doc.rust-lang.org/std/) : documentation complète de " +"la bibliothèque standard de Rust." #: src/other-resources.md #, fuzzy msgid "" -"[The Rust Reference](https://doc.rust-lang.org/reference/): an incomplete " -"book which describes the Rust grammar and memory model." +"[The Rust Reference](https://doc.rust-lang.org/reference/): an incomplete book which " +"describes the Rust grammar and memory model." +msgstr "" +"[The Rust Reference](https://doc.rust-lang.org/reference/) : un livre incomplet qui " +"décrit la grammaire et le modèle de mémoire de Rust." + +#: src/other-resources.md +msgid "" +"[Rust API Guidelines](https://rust-lang.github.io/api-guidelines/): recommendations on " +"how to design APIs." msgstr "" -"[The Rust Reference](https://doc.rust-lang.org/reference/) : un livre " -"incomplet qui décrit la grammaire et le modèle de mémoire de Rust." #: src/other-resources.md #, fuzzy @@ -21342,34 +36056,30 @@ msgstr "Des guides plus spécialisés hébergés sur le site officiel de Rust :" #: src/other-resources.md msgid "" -"[The Rustonomicon](https://doc.rust-lang.org/nomicon/): covers unsafe Rust, " -"including working with raw pointers and interfacing with other languages " -"(FFI)." +"[The Rustonomicon](https://doc.rust-lang.org/nomicon/): covers unsafe Rust, including " +"working with raw pointers and interfacing with other languages (FFI)." msgstr "" -"[The Rustonomicon](https://doc.rust-lang.org/nomicon/) : couvre le Rust non " -"securisé (_unsafe_), y compris les pointeurs nus et l'interfaçage avec " -"d'autres langages (FFI)." +"[The Rustonomicon](https://doc.rust-lang.org/nomicon/) : couvre le Rust non securisé " +"(_unsafe_), y compris les pointeurs nus et l'interfaçage avec d'autres langages (FFI)." #: src/other-resources.md msgid "" -"[Asynchronous Programming in Rust](https://rust-lang.github.io/async-book/): " -"covers the new asynchronous programming model which was introduced after the " -"Rust Book was written." +"[Asynchronous Programming in Rust](https://rust-lang.github.io/async-book/): covers the " +"new asynchronous programming model which was introduced after the Rust Book was written." msgstr "" -"[Programmation asynchrone avec Rust](https://rust-lang.github.io/async-" -"book/) : couvre le nouveau modèle de programmation asynchrone qui a été " -"introduit après la publication du livre Rust." +"[Programmation asynchrone avec Rust](https://rust-lang.github.io/async-book/) : couvre le " +"nouveau modèle de programmation asynchrone qui a été introduit après la publication du " +"livre Rust." #: src/other-resources.md #, fuzzy msgid "" -"[The Embedded Rust Book](https://doc.rust-lang.org/stable/embedded-book/): " -"an introduction to using Rust on embedded devices without an operating " -"system." +"[The Embedded Rust Book](https://doc.rust-lang.org/stable/embedded-book/): an " +"introduction to using Rust on embedded devices without an operating system." msgstr "" -"[The Embedded Rust Book](https://doc.rust-lang.org/stable/embedded-book/) : " -"un introduction à l'utilisation de Rust sur des appareils embarqués sans " -"système d'exploitation." +"[The Embedded Rust Book](https://doc.rust-lang.org/stable/embedded-book/) : un " +"introduction à l'utilisation de Rust sur des appareils embarqués sans système " +"d'exploitation." #: src/other-resources.md #, fuzzy @@ -21384,145 +36094,121 @@ msgstr "Une petite sélection d'autres guides et tutoriels pour Rust :" #: src/other-resources.md #, fuzzy msgid "" -"[Learn Rust the Dangerous Way](http://cliffle.com/p/dangerust/): covers Rust " -"from the perspective of low-level C programmers." +"[Learn Rust the Dangerous Way](http://cliffle.com/p/dangerust/): covers Rust from the " +"perspective of low-level C programmers." msgstr "" -"[Learn Rust the Dangerous Way](http://cliffle.com/p/dangerust/) : couvre " -"Rust du point de vue des programmeurs C de bas niveau." +"[Learn Rust the Dangerous Way](http://cliffle.com/p/dangerust/) : couvre Rust du point de " +"vue des programmeurs C de bas niveau." #: src/other-resources.md +#, fuzzy msgid "" -"[Rust for Embedded C Programmers](https://docs.opentitan.org/doc/ug/" -"rust_for_c/): covers Rust from the perspective of developers who write " -"firmware in C." +"[Rust for Embedded C Programmers](https://opentitan.org/book/doc/rust_for_c_devs.html): " +"covers Rust from the perspective of developers who write firmware in C." msgstr "" -"\\[Rust pour Programmeurs C Embarqué\\] (https://docs.opentitan.org/doc/ug/" -"rust_for_c/) : couvre Rust du point de vue des développeurs qui écrivent des " -"firmwares en C." +"\\[Rust pour Programmeurs C Embarqué\\] (https://docs.opentitan.org/doc/ug/rust_for_c/) : " +"couvre Rust du point de vue des développeurs qui écrivent des firmwares en C." #: src/other-resources.md #, fuzzy msgid "" -"[Rust for professionals](https://overexact.com/rust-for-professionals/): " -"covers the syntax of Rust using side-by-side comparisons with other " -"languages such as C, C++, Java, JavaScript, and Python." +"[Rust for professionals](https://overexact.com/rust-for-professionals/): covers the " +"syntax of Rust using side-by-side comparisons with other languages such as C, C++, Java, " +"JavaScript, and Python." msgstr "" -"[Rust pour les professionnels](https://overexact.com/rust-for-" -"professionals/): couvre la syntaxe de Rust en utilisant des comparaisons " -"côte à côte avec d'autres langages tels que C, C++, Java, JavaScript et " -"Python." +"[Rust pour les professionnels](https://overexact.com/rust-for-professionals/): couvre la " +"syntaxe de Rust en utilisant des comparaisons côte à côte avec d'autres langages tels que " +"C, C++, Java, JavaScript et Python." #: src/other-resources.md #, fuzzy msgid "" -"[Rust on Exercism](https://exercism.org/tracks/rust): 100+ exercises to help " -"you learn Rust." +"[Rust on Exercism](https://exercism.org/tracks/rust): 100+ exercises to help you learn " +"Rust." msgstr "" -"[Rust on Exercism](https://exercism.org/tracks/rust) : plus de 100 exercices " -"pour vous aider vous apprenez Rust." +"[Rust on Exercism](https://exercism.org/tracks/rust) : plus de 100 exercices pour vous " +"aider vous apprenez Rust." #: src/other-resources.md msgid "" -"[Ferrous Teaching Material](https://ferrous-systems.github.io/teaching-" -"material/index.html): a series of small presentations covering both basic " -"and advanced part of the Rust language. Other topics such as WebAssembly, " -"and async/await are also covered." +"[Ferrous Teaching Material](https://ferrous-systems.github.io/teaching-material/index." +"html): a series of small presentations covering both basic and advanced part of the Rust " +"language. Other topics such as WebAssembly, and async/await are also covered." msgstr "" -"\\[Matériel de Ferrous Teaching\\] (https://ferrous-systems.github.io/" -"teaching-material/index.html) : un série de petites présentations couvrant à " -"la fois la partie de base et avancée de Rust. D'autres sujets tels que " -"WebAssembly et async/wait sont également couvert." +"\\[Matériel de Ferrous Teaching\\] (https://ferrous-systems.github.io/teaching-material/" +"index.html) : un série de petites présentations couvrant à la fois la partie de base et " +"avancée de Rust. D'autres sujets tels que WebAssembly et async/wait sont également " +"couvert." #: src/other-resources.md -#, fuzzy msgid "" -"[Beginner's Series to Rust](https://docs.microsoft.com/en-us/shows/beginners-" -"series-to-rust/) and [Take your first steps with Rust](https://docs." -"microsoft.com/en-us/learn/paths/rust-first-steps/): two Rust guides aimed at " -"new developers. The first is a set of 35 videos and the second is a set of " -"11 modules which covers Rust syntax and basic constructs." +"[Advanced testing for Rust applications](https://rust-exercises.com/advanced-testing/): a " +"self-paced workshop that goes beyond Rust's built-in testing framework. It covers " +"`googletest`, snapshot testing, mocking as well as how to write your own custom test " +"harness." msgstr "" -"[Série débutant à Rust](https://docs.microsoft.com/en-us/shows/beginners-" -"series-to-rust/) et [Faites vos premiers pas avec Rust](https://docs." -"microsoft.com/en-us/learn/paths/rust-first-steps/) : deux Guides Rust " -"destinés aux nouveaux développeurs. Le premier est un ensemble de 35 vidéos " -"et le le second est un ensemble de 11 modules qui couvre la syntaxe Rust et " -"les constructions de base." #: src/other-resources.md #, fuzzy msgid "" -"[Learn Rust With Entirely Too Many Linked Lists](https://rust-unofficial." -"github.io/too-many-lists/): in-depth exploration of Rust's memory management " -"rules, through implementing a few different types of list structures." +"[Beginner's Series to Rust](https://docs.microsoft.com/en-us/shows/beginners-series-to-" +"rust/) and [Take your first steps with Rust](https://docs.microsoft.com/en-us/learn/paths/" +"rust-first-steps/): two Rust guides aimed at new developers. The first is a set of 35 " +"videos and the second is a set of 11 modules which covers Rust syntax and basic " +"constructs." msgstr "" -"\\[Apprenez Rust avec trop de liens Listes\\] (https://rust-unofficial." -"github.io/too-many-lists/) : en profondeur exploration des règles de gestion " -"de la mémoire de Rust, en implémentant quelques différents types de " -"structures de liste." +"[Série débutant à Rust](https://docs.microsoft.com/en-us/shows/beginners-series-to-rust/) " +"et [Faites vos premiers pas avec Rust](https://docs.microsoft.com/en-us/learn/paths/rust-" +"first-steps/) : deux Guides Rust destinés aux nouveaux développeurs. Le premier est un " +"ensemble de 35 vidéos et le le second est un ensemble de 11 modules qui couvre la syntaxe " +"Rust et les constructions de base." #: src/other-resources.md #, fuzzy msgid "" -"Please see the [Little Book of Rust Books](https://lborb.github.io/book/) " -"for even more Rust books." +"[Learn Rust With Entirely Too Many Linked Lists](https://rust-unofficial.github.io/too-" +"many-lists/): in-depth exploration of Rust's memory management rules, through " +"implementing a few different types of list structures." msgstr "" -"Veuillez consulter le [Little Book of Rust Books](https://lborb.github.io/" -"book/) pour encore plus de livres Rust." +"\\[Apprenez Rust avec trop de liens Listes\\] (https://rust-unofficial.github.io/too-many-" +"lists/) : en profondeur exploration des règles de gestion de la mémoire de Rust, en " +"implémentant quelques différents types de structures de liste." -#: src/credits.md -#, fuzzy +#: src/other-resources.md msgid "" -"The material here builds on top of the many great sources of Rust " -"documentation. See the page on [other resources](other-resources.md) for a " -"full list of useful resources." +"[The Little Book of Rust Macros](https://danielkeep.github.io/tlborm/): covers many " +"details on Rust macros with practical examples." msgstr "" -"Le matériel ici s'appuie sur les nombreuses sources de documentation de " -"Rust. Voir la page sur \\[autres ressources\\] (other-resources.md) pour une " -"liste complète des ressources utiles ressources." -#: src/credits.md +#: src/other-resources.md #, fuzzy msgid "" -"The material of Comprehensive Rust is licensed under the terms of the Apache " -"2.0 license, please see [`LICENSE`](https://github.com/google/comprehensive-" -"rust/blob/main/LICENSE) for details." +"Please see the [Little Book of Rust Books](https://lborb.github.io/book/) for even more " +"Rust books." msgstr "" -"Le matériel de Comprehensive Rust(le guide complet de Rust) est sous licence " -"sous les termes de la licence d'Apache 2.0, veuillez consulter [`LICENSE`]" -"(../LICENSE) pour plus de détails." - -#: src/credits.md -msgid "Rust by Example" -msgstr "Rust by Example" +"Veuillez consulter le [Little Book of Rust Books](https://lborb.github.io/book/) pour " +"encore plus de livres Rust." #: src/credits.md #, fuzzy msgid "" -"Some examples and exercises have been copied and adapted from [Rust by " -"Example](https://doc.rust-lang.org/rust-by-example/). Please see the " -"`third_party/rust-by-example/` directory for details, including the license " -"terms." +"The material here builds on top of the many great sources of Rust documentation. See the " +"page on [other resources](other-resources.md) for a full list of useful resources." msgstr "" -"Quelques exemples et exercices ont été copiés et adaptés de [Rust by Exemple]" -"(https://doc.rust-lang.org/rust-by-example/). Veuillez consulter le " -"Répertoire `third_party/rust-by-example/` pour plus de détails, y compris la " -"licence conditions." - -#: src/credits.md -msgid "Rust on Exercism" -msgstr "Rust sur Exercism" +"Le matériel ici s'appuie sur les nombreuses sources de documentation de Rust. Voir la " +"page sur \\[autres ressources\\] (other-resources.md) pour une liste complète des " +"ressources utiles ressources." #: src/credits.md +#, fuzzy msgid "" -"Some exercises have been copied and adapted from [Rust on Exercism](https://" -"exercism.org/tracks/rust). Please see the `third_party/rust-on-exercism/` " -"directory for details, including the license terms." +"The material of Comprehensive Rust is licensed under the terms of the Apache 2.0 license, " +"please see [`LICENSE`](https://github.com/google/comprehensive-rust/blob/main/LICENSE) " +"for details." msgstr "" -"Certains exercices ont été copiés et adaptés de \\[Rust on Exercism\\] " -"(https://exercism.org/tracks/rust). Veuillez consulter le Répertoire " -"`third_party/rust-on-exercism/` pour plus de détails, y compris les " -"conditions de la licence." +"Le matériel de Comprehensive Rust(le guide complet de Rust) est sous licence sous les " +"termes de la licence d'Apache 2.0, veuillez consulter [`LICENSE`](../LICENSE) pour plus " +"de détails." #: src/credits.md #, fuzzy @@ -21532,10 +36218,507 @@ msgstr "\\## CXX" #: src/credits.md #, fuzzy msgid "" -"The [Interoperability with C++](android/interoperability/cpp.md) section " -"uses an image from [CXX](https://cxx.rs/). Please see the `third_party/cxx/` " -"directory for details, including the license terms." +"The [Interoperability with C++](android/interoperability/cpp.md) section uses an image " +"from [CXX](https://cxx.rs/). Please see the `third_party/cxx/` directory for details, " +"including the license terms." msgstr "" -"La section [Interopérabilité avec C++](android/interoperability/cpp.md) " -"utilise un image de [CXX](https://cxx.rs/). Veuillez consulter le répertoire " -"`third_party/cxx/` pour plus de détails, y compris les termes de la licence." +"La section [Interopérabilité avec C++](android/interoperability/cpp.md) utilise un image " +"de [CXX](https://cxx.rs/). Veuillez consulter le répertoire `third_party/cxx/` pour plus " +"de détails, y compris les termes de la licence." + +#~ msgid "Scopes and Shadowing" +#~ msgstr "Portée et masquage" + +#, fuzzy +#~ msgid "Slices: `&[T]`" +#~ msgstr "Tranches" + +#, fuzzy +#~ msgid "Lifetime Annotations" +#~ msgstr "Durées de vie dans les appels de fonction" + +#, fuzzy +#~ msgid "Struct Lifetimes" +#~ msgstr "Durées de vie" + +#, fuzzy +#~ msgid "`FromIterator`" +#~ msgstr "FromIterator" + +#~ msgid "Test Modules" +#~ msgstr "Modules de test" + +#, fuzzy +#~ msgid "`thiserror` and `anyhow`" +#~ msgstr "`De` et `Dans`" + +#~ msgid "Control Flow" +#~ msgstr "Flux de contrôle" + +#~ msgid "Arrow-Left" +#~ msgstr "Flèche vers la gauche" + +#~ msgid "Arrow-Right" +#~ msgstr "Flèche vers la droite" + +#~ msgid "Ctrl + Enter" +#~ msgstr "Ctrl + Entrée" + +#~ 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 "" +#~ "Sur Debian/Ubuntu, vous pouvez installer Cargo, les sources Rust (`rust-src`: " +#~ "compilateur et bibliothèques standards) et l'outil de [formatage Rust](https://github." +#~ "com/rust-lang/rustfmt) via `apt`. Veuillez noter toutefois que l'installation via " +#~ "`apt` ne vous procurera pas la dernière version de Rust, ce qui pourrait conduire à " +#~ "des problèmes de comportement indéterminé (undefined behavior). La ligne de commande à " +#~ "utiliser serait :" + +#~ msgid "You can use " +#~ msgstr "Vous pouvez utiliser " + +#, fuzzy +#~ msgid "Pattern matching: destructuring enums, structs, and arrays." +#~ msgstr "" +#~ "Filtrage par motif : déstructuration des énumérations, des structures et des tableaux." + +#~ msgid "Rust has hygienic macros, `println!` is an example of this." +#~ msgstr "Rust a des macros hygiéniques, `println!` en est un exemple." + +#, fuzzy +#~ msgid "" +#~ "Macros being 'hygienic' means they don't accidentally capture identifiers from the " +#~ "scope they are used in. Rust macros are actually only [partially hygienic](https://" +#~ "veykril.github.io/tlborm/decl-macros/minutiae/hygiene.html)." +#~ msgstr "" +#~ "Les macros étant \"hygiéniques\", elles ne capturent pas accidentellement les " +#~ "identifiants de la portée dans laquelle elles sont utilisées. Les macros Rust ne sont " +#~ "en fait que [partiellement hygiénique](https://veykril.github.io/tlborm/decl-macros/" +#~ "minutiae/hygiene.html)." + +#~ msgid "Blocks" +#~ msgstr "Blocs" + +#, fuzzy +#~ msgid "" +#~ "You can shadow variables, both those from outer scopes and variables from the same " +#~ "scope:" +#~ msgstr "" +#~ "Vous pouvez masquer des variables, à la fois celles des portées externes et celles des " +#~ "même périmètre :" + +#, fuzzy +#~ msgid "" +#~ "Shadowing is different from mutation, because after shadowing both variable's memory " +#~ "locations exist at the same time. Both are available under the same name, depending " +#~ "where you use it in the code." +#~ msgstr "" +#~ "Définition : l'occultation est différente de la mutation, car après l'occultation, les " +#~ "emplacements de mémoire des deux variables existent en même temps. Les deux sont " +#~ "disponibles sous le même nom, selon l'endroit où vous l'utilisez dans le code." + +#, fuzzy +#~ msgid "A shadowing variable can have a different type." +#~ msgstr "Une variable d'occultation peut avoir un type différent." + +#, fuzzy +#~ msgid "" +#~ "Shadowing looks obscure at first, but is convenient for holding on to values after `." +#~ "unwrap()`." +#~ msgstr "" +#~ "L'ombrage semble obscur au début, mais est pratique pour conserver les valeurs après `." +#~ "unwrap()`." + +#, fuzzy +#~ msgid "1" +#~ msgstr "12" + +#, fuzzy +#~ msgid "2" +#~ msgstr "12" + +#, fuzzy +#~ msgid "Hard-code both functions to operate on 3 × 3 matrices." +#~ msgstr "" +#~ "Codez en dur les deux fonctions pour qu'elles fonctionnent sur des matrices 3 × 3." + +#, fuzzy +#~ msgid "Rust will statically forbid dangling references:" +#~ msgstr "Rust interdira statiquement les références pendantes :" + +#, fuzzy +#~ 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` 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." +#~ msgstr "" +#~ "La question sur la modification de `a[3]` peut susciter une discussion intéressante, " +#~ "mais la réponse est que pour des raisons de sécurité de la mémoire vous ne pouvez pas " +#~ "le faire via `a` après avoir créé une tranche, mais vous pouvez lire les données de " +#~ "`a` et `s` en toute sécurité. Plus de détails seront expliqués dans la section " +#~ "Vérificateur d'emprunt." + +#, fuzzy +#~ 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 "" +#~ "Il n'est pas très courant d'avoir besoin d'une constante évaluée à l'exécution, mais " +#~ "c'est utile et plus sûr que d'utiliser un statique." + +#, fuzzy +#~ msgid "" +#~ "Now that we have seen a fair amount of Rust, today will focus on Rust's type system:" +#~ msgstr "" +#~ "Maintenant que nous avons vu une bonne quantité de Rust, nous allons continuer avec :" + +#, fuzzy +#~ msgid "The patterns can be simple values, similarly to `switch` in C and C++:" +#~ msgstr "" +#~ "Les modèles peuvent être des valeurs simples, de la même manière que `switch` en C et " +#~ "C++ :" + +#, fuzzy +#~ msgid "" +#~ "Match can be used as an expression. Just like `if`, each match arm must have the same " +#~ "type. The type is the last expression of the block, if any. In the example above, the " +#~ "type is `()`." +#~ msgstr "" +#~ "Comme `if let`, chaque bras de correspondance doit avoir le même type. Le type est le " +#~ "dernier expression du bloc, le cas échéant. Dans l'exemple ci-dessus, le type est `()`." + +#, fuzzy +#~ msgid "`..` can expand as much as it needs to be" +#~ msgstr "`..` peut s'étendre autant que nécessaire" + +#, fuzzy +#~ msgid "while-let" +#~ msgstr "expressions `while let`" + +#~ msgid "Niche Optimization" +#~ msgstr "Optimisation niche" + +#, fuzzy +#~ msgid "\"Optional box\"" +#~ msgstr "Exceptions" + +#, fuzzy +#~ msgid "Trait objects allow for values of different types, for instance in a collection:" +#~ msgstr "" +#~ "Les objets de trait autorisent des valeurs de différents types, par exemple dans une " +#~ "collection :" + +#, fuzzy +#~ msgid "" +#~ "You're working on implementing a health-monitoring system. As part of that, you need " +#~ "to keep track of users' health statistics." +#~ msgstr "" +#~ "Vous travaillez à la mise en place d'un système de surveillance de la santé. Dans le " +#~ "cadre de cela, vous besoin de suivre les statistiques de santé des utilisateurs." + +#, fuzzy +#~ msgid "" +#~ "You'll start with a stubbed function in an `impl` block as well as a `User` struct " +#~ "definition. Your goal is to implement the stubbed out method on the `User` `struct` " +#~ "defined in the `impl` block." +#~ msgstr "" +#~ "Vous commencerez avec quelques fonctions stub dans un bloc `impl` ainsi qu'un `User` " +#~ "définition de structure. Votre objectif est d'implémenter les méthodes tronquées sur " +#~ "le `User` `struct` défini dans le bloc `impl`." + +#, fuzzy +#~ msgid "" +#~ "Copy the code below to and fill in the missing method:" +#~ msgstr "" +#~ "Copiez le code ci-dessous sur et remplissez les champs " +#~ "manquants méthodes :" + +#~ msgid "Lifetimes in Function Calls" +#~ msgstr "Durées de vie dans les appels de fonction" + +#, fuzzy +#~ msgid "Today we will cover topics relating to building large-scale software in Rust:" +#~ msgstr "Aujourd'hui, nous aborderons quelques sujets plus avancés de Rust :" + +#, fuzzy +#~ msgid "Testing." +#~ msgstr "Tester" + +#, fuzzy +#~ msgid "Error handling: panics, `Result`, and the try operator `?`." +#~ msgstr "Gestion des erreurs : paniques, « Résultat » et l'opérateur d'essai « ? »." + +#~ msgid "FromIterator" +#~ msgstr "FromIterator" + +#, fuzzy +#~ msgid "Rust and Cargo come with a simple unit test framework:" +#~ msgstr "Rust et Cargo sont livrés avec un cadre de test unitaire simple :" + +#, fuzzy +#~ msgid "Unit tests are supported throughout your code." +#~ msgstr "Les tests unitaires sont pris en charge dans tout votre code." + +#, fuzzy +#~ msgid "Integration tests are supported via the `tests/` directory." +#~ msgstr "Les tests d'intégration sont pris en charge via le répertoire `tests/`." + +#~ msgid "Luhn Algorithm" +#~ msgstr "Algorithme de Luhn" + +#, fuzzy +#~ msgid "Rust will trigger a panic if a fatal error happens at runtime:" +#~ msgstr "" +#~ "Rust déclenchera une panique si une erreur fatale se produit lors de l'exécution :" + +#, fuzzy +#~ msgid "" +#~ "The [`thiserror`](https://docs.rs/thiserror/) and [`anyhow`](https://docs.rs/anyhow/) " +#~ "crates are widely used to simplify error handling." +#~ msgstr "" +#~ "La caisse [thiserror](https://docs.rs/thiserror/) est un moyen populaire de créer un " +#~ "error enum comme nous l'avons fait sur la page précédente :" + +#, fuzzy +#~ msgid "Actual error type inside of it can be extracted for examination if necessary." +#~ msgstr "Le type d'erreur réel à l'intérieur peut être extrait pour examen si nécessaire." + +#, fuzzy +#~ msgid "" +#~ "However, since data races can occur, it is unsafe to read and write mutable static " +#~ "variables:" +#~ msgstr "" +#~ "Cependant, étant donné que des courses de données peuvent se produire, il n'est pas " +#~ "sûr de lire et d'écrire mutable variables statiques :" + +#, fuzzy +#~ msgid "// Undefined behavior if abs misbehaves.\n" +#~ msgstr "Aucun comportement indéfini à l'exécution :" + +#~ msgid "" +#~ "We will attempt to call Rust from one of your own projects today. So try to find a " +#~ "little corner of your code base where we can move some lines of code to Rust. The " +#~ "fewer dependencies and \"exotic\" types the better. Something that parses some raw " +#~ "bytes would be ideal." +#~ msgstr "" +#~ "Nous allons essayer d'appeler Rust depuis l'un de vos propres projets aujourd'hui. " +#~ "Alors essayez de trouver un petit coin de votre code où nous pouvons déplacer quelques " +#~ "lignes de code vers Rust. Le moins il y a de dépendances et de types \"exotiques\", le " +#~ "mieux c'est. Quelque chose qui analyse quelques octets de donnée brute serait idéal." + +#, fuzzy +#~ msgid "_Generated trait_:" +#~ msgstr "Rust non sécurisé (_unsafe_)" + +#, fuzzy +#~ msgid "**birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl**:" +#~ msgstr "" +#~ "_service_anniversaire/aidl/com/exemple/serviceanniversaire/IBirthdayService.aidl_ :" + +#, fuzzy +#~ msgid "**birthday_service/src/client.rs**:" +#~ msgstr "_service_anniversaire/src/client.rs_ :" + +#, fuzzy +#~ msgid "**birthday_service/src/lib.rs**:" +#~ msgstr "_service_anniversaire/src/lib.rs_ :" + +#, fuzzy +#~ msgid "You can now auto-generate the bindings:" +#~ msgstr "Vous pouvez maintenant générer automatiquement les liaisons :" + +#, fuzzy +#~ msgid "" +#~ "This is a group exercise: We will look at one of the projects you work with and try to " +#~ "integrate some Rust into it. Some suggestions:" +#~ msgstr "" +#~ "Pour le dernier exercice, nous examinerons l'un des projets sur lesquels vous " +#~ "travaillez. Laissez-nous regroupez-vous et faites-le ensemble. Quelques suggestions:" + +#, fuzzy +#~ msgid "Call your AIDL service with a client written in Rust." +#~ msgstr "Appelez votre service AIDL avec un client écrit en Rust." + +#, fuzzy +#~ msgid "Move a function from your project to Rust and call it." +#~ msgstr "Déplacez une fonction de votre projet vers Rust et appelez-la." + +#, fuzzy +#~ msgid "" +#~ "No solution is provided here since this is open-ended: it relies on someone in the " +#~ "class having a piece of code which you can turn in to Rust on the fly." +#~ msgstr "" +#~ "Aucune solution n'est proposée ici car celle-ci est ouverte : elle repose sur " +#~ "quelqu'un en la classe ayant un morceau de code que vous pouvez remettre à Rust à la " +#~ "volée." + +#, fuzzy +#~ msgid "ADC" +#~ msgstr "ADC" + +#, fuzzy +#~ msgid "I2C, SPI, UART, CAN" +#~ msgstr "I2C, SPI, UART, PEUT" + +#, fuzzy +#~ msgid "RNG" +#~ msgstr "GNA" + +#, fuzzy +#~ msgid "Timers" +#~ msgstr "Minuteries" + +#, fuzzy +#~ msgid "Watchdogs" +#~ msgstr "Chiens de garde" + +#, fuzzy +#~ msgid "" +#~ "There is work in progress on an `async` version of `embedded-hal`, but it isn't stable " +#~ "yet." +#~ msgstr "" +#~ "Il y a des travaux en cours sur une version `async` de `embedded-hal`, mais ce n'est " +#~ "pas encore stable." + +#, fuzzy +#~ msgid "Use `pointer::read_volatile` and `pointer::write_volatile`." +#~ msgstr "Utilisez `pointer::read_volatile` et `pointer::write_volatile`." + +#, fuzzy +#~ msgid "Never hold a reference." +#~ msgstr "Ne détenez jamais une référence." + +#, fuzzy +#~ msgid "" +#~ "For now it only supports EL1, but support for other exception levels should be " +#~ "straightforward to add." +#~ msgstr "" +#~ "Pour l'instant, il ne prend en charge que EL1, mais la prise en charge d'autres " +#~ "niveaux d'exception devrait être simple à ajouter." + +#, fuzzy +#~ msgid "_src/pl011.rs_ (you shouldn't need to change this):" +#~ msgstr "`src/pl011.rs` (vous ne devriez pas avoir besoin de le modifier) :" + +#, fuzzy +#~ msgid "_entry.S_ (you shouldn't need to change this):" +#~ msgstr "`entry.S` (vous ne devriez pas avoir besoin de le modifier) :" + +#, fuzzy +#~ msgid "_exceptions.S_ (you shouldn't need to change this):" +#~ msgstr "`exceptions.S` (vous ne devriez pas avoir besoin de le modifier) :" + +#, fuzzy +#~ msgid "_idmap.S_ (you shouldn't need to change this):" +#~ msgstr "`idmap.S` (vous ne devriez pas avoir besoin de le modifier) :" + +#, fuzzy +#~ msgid "Threads are all daemon threads, the main thread does not wait for them." +#~ msgstr "Les threads sont tous des threads démons, le thread principal ne les attend pas." + +#, fuzzy +#~ msgid "" +#~ "`MutexGuard`: Uses OS level primitives which must be deallocated on the " +#~ "thread which created them." +#~ msgstr "" +#~ "`MutexGuard` : utilise des primitives au niveau du système d'exploitation qui " +#~ "doivent être désallouées sur le fil qui les a créés." + +#, fuzzy +#~ msgid "" +#~ "Rust uses the type system to enforce synchronization of shared data. This is primarily " +#~ "done via two types:" +#~ msgstr "" +#~ "Rust utilise le système de type pour appliquer la synchronisation des données " +#~ "partagées. C'est se fait principalement via deux types:" + +#, fuzzy +#~ msgid "" +#~ "[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html), atomic reference " +#~ "counted `T`: handles sharing between threads and takes care to deallocate `T` when the " +#~ "last reference is dropped," +#~ msgstr "" +#~ "[`Arc`](https://doc.rust-lang.org/std/sync/struct.Arc.html), référence atomique " +#~ "comptée `T` : gère le partage entre les threads et prend soin de désallouer 'T' " +#~ "lorsque la dernière référence est supprimée," + +#, fuzzy +#~ msgid "" +#~ "[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html): ensures mutually " +#~ "exclusive access to the `T` value." +#~ msgstr "" +#~ "[`Mutex`](https://doc.rust-lang.org/std/sync/struct.Mutex.html) : garantit un accès " +#~ "mutuellement exclusif à la valeur `T`." + +#, fuzzy +#~ msgid "Let us practice our new concurrency skills with" +#~ msgstr "Mettons en pratique nos nouvelles compétences en matière de concurrence avec" + +#, fuzzy +#~ msgid "Dining philosophers: a classic problem in concurrency." +#~ msgstr "Dîner des philosophes : un problème classique de la concurrence." + +#, fuzzy +#~ msgid "" +#~ "Multi-threaded link checker: a larger project where you'll use Cargo to download " +#~ "dependencies and then check links in parallel." +#~ msgstr "" +#~ "Vérificateur de liens multithread : un projet plus vaste dans lequel vous utiliserez " +#~ "Cargo pour télécharger les dépendances puis vérifier les liens en parallèle." + +#, fuzzy +#~ msgid "Concurrency Morning Exercise" +#~ msgstr "Jour 3 Exercice du matin" + +#, fuzzy +#~ msgid "([back to exercise](dining-philosophers.md))" +#~ msgstr "([retour à l'exercice](dining-philosophers.md))" + +#, fuzzy +#~ msgid "([back to exercise](link-checker.md))" +#~ msgstr "([retour à l'exercice](luhn.md))" + +#, fuzzy +#~ msgid "Async Rust" +#~ msgstr "Pourquoi Rust ?" + +#, fuzzy +#~ msgid "Futures Control Flow" +#~ msgstr "Flux de contrôle" + +#, fuzzy +#~ msgid "Concurrency Afternoon Exercise" +#~ msgstr "Exercices de l'après-midi du jour 1" + +#, fuzzy +#~ msgid "([back to exercise](dining-philosophers-async.md))" +#~ msgstr "([retour à l'exercice](dining-philosophers.md))" + +#, fuzzy +#~ msgid "([back to exercise](chat-app.md))" +#~ msgstr "([retour à l'exercice](rtc.md))" + +#, fuzzy +#~ msgid "" +#~ "Some examples and exercises have been copied and adapted from [Rust by Example]" +#~ "(https://doc.rust-lang.org/rust-by-example/). Please see the `third_party/rust-by-" +#~ "example/` directory for details, including the license terms." +#~ msgstr "" +#~ "Quelques exemples et exercices ont été copiés et adaptés de [Rust by Exemple](https://" +#~ "doc.rust-lang.org/rust-by-example/). Veuillez consulter le Répertoire `third_party/" +#~ "rust-by-example/` pour plus de détails, y compris la licence conditions." + +#~ msgid "Rust on Exercism" +#~ msgstr "Rust sur Exercism" + +#~ msgid "" +#~ "Some exercises have been copied and adapted from [Rust on Exercism](https://exercism." +#~ "org/tracks/rust). Please see the `third_party/rust-on-exercism/` directory for " +#~ "details, including the license terms." +#~ msgstr "" +#~ "Certains exercices ont été copiés et adaptés de \\[Rust on Exercism\\] (https://" +#~ "exercism.org/tracks/rust). Veuillez consulter le Répertoire `third_party/rust-on-" +#~ "exercism/` pour plus de détails, y compris les conditions de la licence."