Introduction à Rust

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson
Download our mobile app to listen on the go
Get App

Questions and Answers

Dans Rust, quel mot-clé est utilisé pour déclarer une variable qui peut être modifiée après son initialisation?

  • `let`
  • `mut` (correct)
  • `static`
  • `const`

Parmi les types de données suivants, lequel n'est pas un type entier signé valide en Rust?

  • `u32` (correct)
  • `i128`
  • `i64`
  • `isize`

Quelle est la particularité du type isize en Rust?

  • Sa taille dépend de l'architecture du processeur. (correct)
  • Il est toujours non signé.
  • Il a une taille fixe de 32 bits.
  • Il est utilisé uniquement pour les nombres flottants.

Quel est le type de données utilisé en Rust pour représenter un caractère Unicode?

<p><code>char</code> (D)</p> Signup and view all the answers

Quelle est la largeur en bits du type bool en Rust?

<p>8 bits (C)</p> Signup and view all the answers

Comment peut-on déclarer une constante en Rust?

<p>Avec le mot-clé <code>const</code>. (B)</p> Signup and view all the answers

Dans une fonction Rust, quelle valeur est retournée si aucun mot-clé return n'est utilisé?

<p>La valeur de la dernière expression évaluée. (D)</p> Signup and view all the answers

Quelle est la signification de déclarer une variable static en Rust?

<p>La variable est utilisable dans tous les blocs de code. (B)</p> Signup and view all the answers

Quelle est la fonction de l'opérateur if let en Rust?

<p>Tester si une variable correspond à un certain pattern. (A)</p> Signup and view all the answers

Quel est le rôle du mot-clé match en Rust?

<p>Effectuer une correspondance de motifs (pattern matching). (D)</p> Signup and view all the answers

Comment peut-on itérer sur les éléments d'une collection en Rust?

<p>Avec la boucle <code>for name/value_element in collection</code>. (C)</p> Signup and view all the answers

Quelle est la fonction du mot-clé continue dans une boucle en Rust?

<p>Passer directement à l'itération suivante. (B)</p> Signup and view all the answers

Quelle est la particularité des fonctions déclarées avec le mot-clé const en Rust?

<p>Elles ne peuvent utiliser que des variables constantes et sont <code>inline</code>. (B)</p> Signup and view all the answers

Comment déclare-t-on une liste (tableau) mutable en Rust?

<p><code>let mut nomListe: [type; taille] = [valeur1, valeur2];</code> (A)</p> Signup and view all the answers

Quel est le type de données en Rust qui permet de stocker une séquence ordonnée d'éléments de types potentiellement différents?

<p>Tuple. (C)</p> Signup and view all the answers

Comment crée-t-on une référence mutable en Rust?

<p><code>let nomRef = &amp;mut var;</code> (A)</p> Signup and view all the answers

Qu'est-ce qu'un slice en Rust?

<p>Un pointeur vers une séquence contiguë d'éléments dans une collection. (B)</p> Signup and view all the answers

Quelle est la différence principale entre String et &str en Rust?

<p><code>String</code> est propriétaire de ses données, tandis que <code>&amp;str</code> est une vue empruntée (borrowed view). (B)</p> Signup and view all the answers

Comment accède-t-on à un attribut d'une structure (struct) en Rust, en utilisant une instance de cette structure?

<p>Avec l'opérateur <code>.</code> (point). (A)</p> Signup and view all the answers

Quel est le rôle du trait Default en Rust?

<p>Fournir une valeur par défaut pour un type. (D)</p> Signup and view all the answers

Flashcards

Fonction main

Point d'entrée du programme Rust.

mut

Mot-clé pour déclarer une variable modifiable.

Entiers signés (i8, i16, i32, i64, i128, isize)

Types numériques entiers signés.

Entiers non signés (u8, u16, u32, u64, u128, usize)

Types numériques entiers non signés.

Signup and view all the flashcards

Nombres à virgule flottante (f32, f64)

Types numériques à virgule flottante.

Signup and view all the flashcards

char

Type pour un seul caractère Unicode.

Signup and view all the flashcards

bool

Type pour les valeurs vrai ou faux.

Signup and view all the flashcards

const

Déclaration d'une constante.

Signup and view all the flashcards

Block

Structure de code qui renvoie la dernière valeur utilisée.

Signup and view all the flashcards

If

Opérateur conditionnel.

Signup and view all the flashcards

Match

Structure de contrôle pour tester plusieurs valeurs.

Signup and view all the flashcards

While

Boucle exécutée tant qu'une condition est vraie.

Signup and view all the flashcards

Loop

Boucle qui se répète indéfiniment.

Signup and view all the flashcards

Break

Mot-clé pour sortir d'une boucle.

Signup and view all the flashcards

Continue

Mot-clé pour passer à l'itération suivante d'une boucle.

Signup and view all the flashcards

Macros

Fonction pouvant prendre un nombre indéfini de paramètres.

Signup and view all the flashcards

Liste

Collection ordonnée d'éléments du même type.

Signup and view all the flashcards

Tuple

Type permettant de regrouper plusieurs valeurs de types différents.

Signup and view all the flashcards

Struct

Type de données structurées.

Signup and view all the flashcards

Enum

Type de données qui peut prendre plusieurs formes prédéfinies.

Signup and view all the flashcards

Study Notes

Notes Générales sur Rust

Fonction Principale

  • La fonction principale en Rust est définie comme suit: fn main() { }

Variables

  • Déclaration d'une variable mutable : Let mut nom_variable : type = valeur;
  • Le mot-clé mut est nécessaire pour permettre la modification de la variable.

Types de Données et Littéraux

  • Les types entiers signés incluent i8, i16, i32, i64, i128, et isize, avec des exemples de littéraux comme -10, 0, 1_000, et 123_i64.
  • Les types entiers non signés incluent u8, u16, u32, u64, u128, et usize, avec des littéraux comme 0, 123, et 10_u16.
  • Les nombres à virgule flottante sont f32 et f64, avec des littéraux comme 3.14, -10.0e20, et 2_f32.
  • Les valeurs scalaires Unicode utilisent le type char, représentées par des littéraux comme 'a', 'α', et '∞'.
  • Le type booléen est bool, avec les valeurs true et false.

Largeur des Types

  • Les types iN, uN, et fN ont une largeur de N bits.
  • isize et usize ont la largeur d'un pointeur.
  • char est un type de 32 bits de large.
  • bool est un type de 8 bits de large.

Inférence de Type

  • Si le type d'une variable n'est pas spécifié, le compilateur détermine le type en fonction de la première opération ou utilisation de la variable.

Fonctions

  • Définition de fonction : fn nom_fonction ( parameter1 : type ,..., parameterN : type ) -> typeRetour { contenu }
  • La dernière valeur utilisée dans une fonction est automatiquement renvoyée.

Blocs

  • Définition d'un bloc : {...}
  • La valeur d'un bloc est la dernière valeur ou variable à la fin du bloc.
  • Un bloc terminé par un point-virgule (;) a une valeur de ().
  • Le mot-clé static permet de déclarer une variable utilisable dans tous les blocs.

Opérateurs Logiques

  • If predicat { ... }: Exécute le bloc si le prédicat est vrai.
  • Else if predicat { ... }: Exécute le bloc si le prédicat est vrai, après qu'un if précédent ait échoué.
  • Else { ... }: Exécute le bloc si tous les if et else if précédents ont échoué.
  • if let nomVar ...: Permet de tester si une variable suit un certain motif.
  • Match nom_variable { Value1 => block1 Value2 => block2 Value3 => block3 _ => block Default }: Structure de contrôle équivalente à un switch.

Opérateurs et Conditions de Correspondance

  • Les opérateurs et conditions peuvent être ajoutés aux valeurs dans une instruction match.
  • Value1 | value2 && value3 => block4
  • Value if predicate sur value => block5

Correspondance sur Structures et Enums

  • Il est possible d'utiliser les correspondances sur des structures ou des enums et de tester les valeurs de certains de leurs attributs.
  • Match nom_struct { typeStruct{attribute1 : value1, attribute2 : value2, … attributeN : valueN} => block1

Enums

  • Écriture pour les enums: typeEnum::attribute(value) => block
  • Un nom de variable peut être spécifié à la place de value pour tester si l'attribut a une valeur et l'utiliser dans le bloc suivant.

Boucles

  • Boucle while:
    • while predicat { } exécute le code tant que le prédicat est vrai.
    • Il existe une variante de l'instruction if let while let.
  • Boucle for:
    • For name/value_element in collection { } itère sur chaque élément d'une collection.
  • Boucle Loop:
    • Loop { } répète le code indéfiniment.

Contrôle de Boucle

  • Continue: Passe directement à l'itération suivante dans une boucle.
  • Break: Quitte instantanément une boucle.

Macros

  • Définition d'une macro: nomMacro !( param1,param2,...,paramN ) ;

Collections

Listes

  • Déclaration d'une liste: Let mut nomVar : [ type ; tailleListe ] = [ value1,… value_tailleListe ]
  • Accès à un élément de liste: nomVar[ n ] = …
  • Itération à travers une liste: en écrivant élément in nomListe

Tuples

  • Déclaration d'un tuple: Let nomTuple : ( typeValeur1 , …, typeValeurN ) = ( valeur1 ,…, valeur n )
  • Association des variables aux éléments d'un tuple: let (var1, …, varN) = tuple;
  • Ignorer des valeurs dans un tuple: let (var1, _, var3, …, varN) = tuple.
  • Ignorer des valeurs au début ou à la fin d'un tuple: let (.., varN-1,VarN) = tuple

Références

  • URL: https://google.github.io/comprehensive-rust/references.html
  • Référence partagée (lecture seule):
    • let mut nomRef: &type_var_a_referer = &nomVariable ;
    • * nomRef permet de récupérer la valeur de la variable stockée dans la référence.
  • Référence exclusive:
    • let nomRef = &mut var
    • Permet de modifier la valeur de la variable.
  • Une référence ne peut pas être null, ni pointer sur une valeur n'appartenant pas au même block.

Slices

  • Déclaration d'un slice: Let slide: &[type_collection] = &collection [i.. n];
  • &str est un slice de bytes encodés en UTF-8 (&[u8])
  • String est similaire à un Vec avec T = u8

Structs

  • URL: https://google.github.io/comprehensive-rust/user-defined-types.html
  • Déclaration :
    • struct Struct_name {
          attribute1 : type1 ;
          attribute2 : type2 ;
      } ;
      
  • Utilisation/Modification :
    • Récupérer un attribut : Struct_Name.attribute
    • Créer un 'objet' d'une struct : let mut var_name : struct_name{ attribute_1 : value, … , attribute_n : value }

Implémentation de Méthodes pour une Struct

  • On peut implémenter une struct pour y ajouter des méthodes :

    
     impl nomStruct {
    
    fn nomFunc(&self parameter1 : type ,…, parameterN : type ) ->typeRetour {}
    
    //&self ne permet pas de modifier la struct (shared read only). Si on veut modifier son contenu (valeurs des attributs) on utilise &mut self (exclusive read/write)
     }
    
  • Pour accéder aux attributs de la struct on utilise le mot clé self : self.attribute

  • On peut également définir l’équivalent d’un constructeur :

    ```
    fn new ( parameter 1 : type1,…) -> Self{
         Self {attribute1 : value, ..., attributeN : valueN }
    //On doit donner une valeur à chaque attribut
    }
    ```
    
  • Type TupleStruct : struct struct_name (type1,…,typeN); avec l'accès aux attributs via struct_name.k, où k est l'index de l'attribut.

Traits

  • URL: https://google.github.io/comprehensive-rust/methods-and-traits/traits.html

  • Permet d’ajouter des interfaces implémentables par des structs :

    ```
    trait nomTrait {
         fn abstractFunc(&self,…) -> typeReturn;
    }
    
    impl nomTrait for nomStruct{
         fn abstractFunc(&self,…) -> typeReturn {…}
    }      
    ```
    
  • Héritage de traits: trait nomTrait : superTrait {…}

  • Association de types à un trait:

     ```
     trait nomTrait {
          type typeReturn ;
          fn abstractFunc(&self,…) -> typeReturn;
      }
      impl nomTrait for nomStruct{
          type typeReturn = type ;
          fn abstractFunc(&self,…) -> typeReturn {…}
      }
      ```
    

Macros

  • Certains traits supportés peuvent être associés à une struct via #[derive(trait1, …, traitN)] Struct nomStruct {}

Enums

  • Définition d'un Enum :
enum name {
               value1,
               …,
               valueN,
       } ;
  • Utilisation: Enum_name ::value_k donne la valeur numéro k d'une énumération.

Aliases

  • Déclaration: type name_type_1 = name_type_2

Fonctions Génériques

Implémentation Générique

 struct Struct_name  {
            attribute1 : T ;
            …
        } ;
`
- On peut les implémenter pour des traits génériques héritant de traits spécifiques :

Impl nomType for Struct_name { … }

- Traits génériques:

trait nomTrait { fn abstractFunc(…,T,…) -> typeReturn; }

impl nomTrait for nomStruct{
    fn abstractFunc(…,abstractFunc:Type,…) -> typeReturn {…}
}

### Fonctions Génériques et Dynamiques
- Permettent d’utiliser les comportements (méthodes) des types/struct implémentant le type d’un paramètre en entrée.
- Générique:

fn generic (attribut1: &impl typeA){ //... }

- Dynamique:

fn generic (attribut1: &dyn typeA){ //... }

- L'attribut `&dyn` ne crée pas différentes versions de la méthode, mais recherche dynamiquement le bon type dans une vtable contenant l’ensemble des types implémentant `typeA`.

### Documentation et Commentaires
- Types de commentaires :
    -   `/// commentaire`
    -   `//! Inner doc comment`
    -   `/* Inner doc comment */`
- URL:  https://google.github.io/comprehensive-rust/std-traits.html et https://google.github.io/comprehensive-rust/std-types.html

### Bibliothèque Standard (Standard Library)
- Rust est documentée automatiquement sur docs.rs (outil rustdoc)

### Option
-   `let mut var1: Option<type\> = var2;`
- Option permet de stocker dans `var1` la valeur de `var2` (si elle est du bon type) ou rien du tout.
- Extraction avec `unwrap` et `expect`:
    - `var2.unwrap() ;`
    - `var2.expect(« message ») ;`

### Result
- `Result<TypeValeurRetourné, TypeErreur> = operation(…)` permet de stocker le résultat d’une opération et indiquer si elle réussit ou non.
- Contient Ok et Err :
    ```
    storedResult = Result<TypeValeurRetourné, TypeErreur>= operation(…);

         match storedResult{
                Ok(mut storedResult) => {…}
                Err(err) => {…}
            }
    ```
- err correspond au message d’erreur retourné par l’opération si celle-ci à échouée.

### String
- Liste de caractère encodé en UTF-8
- Déclaration et ajout de string  :

let mut var = String::new(); var.push_str(string)

- Ajout d'un caractere: `var.push(« c »)`
- Taille de chaîne: `var.len`
- Nombre de caractères: `var.count`
- Le nombre d'éléments max de la chaîne est: `var.capacity`

### Vec
- Création d'un vecteur: `let mut v1 = Vec::new();`
- Opérations :
    -   `v1.retain( condition )` Garde uniquement les éléments respectant la condition.
    -   `v1.dedup() ;` Supprime les éléments en doubles.

### HashMap
- Création d'un HashMap : `let mut hmap = HashMap::new();`
- Insertion et vérification :
    -   `hmap.insert( Stringkey , Intvalue );`
    -   `hmap.containskey( key ) ;`
-  `hmap.len()` retourne Le nombre de clés dans le dictionnaire
-  `hmap.get( key )` Récupère la valeur associée à la clé key

### Comparaisons
- impl PartialEq for typename{
 fn eq(&self, other: &Self) -> bool {
    self.attribute == other.attribute

} fn ne(&self, other: &Self) -> bool { self.attribute != other.attribute }

- Pour les ordres (<, >) :

impl PartialOrd for typeName { fn partial_cmp(&self, other: &Self) -> Option<Ordering&gt { match self.attribute1.partial_cmp(&other.attribute1) { Some(Ordering::Equal) => self.attribute2.partial_cmp(&other. attribute2), Attribute1_ord => attribute1_ord, }


### Operators
- Pour implémenter les opérateurs avec `std::ops`:

impl std::ops::Add for typename { type Output = Self; fn add(self, other: Self) -> Self { Self { attr1: self.attr1 + other. attr1, attr2: self. attr2 + other. attr2 } }


### From / Into / As
- `from()` extrait une valeur d’un type vers une valeur d’un autre type.
- `Into` permet de cast lune valeur d’un type vers une valeur d’un autre type.
- `As` permet d’utiliser une variable comme une variable d’un autre type
- Read et BufRead permettent d’implémenter des fonctions permettant de lire des données sous format `u8` (bytes) tel que des fichiers ou juste des chaînes de caractères :

### Read and Write
-  Implémentation

fn reading(reader: R) …{ let buf_reader = BufReader::new(reader); … }

### Default
- `Default` est un trait permettant d’implémenter une valeur par défaut à un type :

impl Default for type1 { fn default() -> type1{ valAttr1, valAttr2,… valAttrN } }

### Memoire
- URL: https://google.github.io/comprehensive-rust/memory-management.html
- Types d’allocation mémoire en Rust :
    -   Allocation dans le `Stack` (pile) :
        -   Variables locales.
        -  Tailles des valeurs fixes et connues à la compilation.
    -  Allocation dans le `Heap` (tas) :
        -   Stockage de valeurs en dehors des appels de fonctions.
        -   Valeur de taille dynamique déterminée à l’exécution.
     ### Ownership
     -  Chaque variable dans un code possède une valeur dont elle est propriétaire, et un scope.
     -  Quand le scope arrive à sa fin (fin du block, fin de fonction), alors la variable est désallouée et sa valeur est supprimée de la mémoire.
### Pointeurs
- URL: https://google.github.io/comprehensive-rust/smart-pointers.html
- Différents types de pointeurs incluent `Box` (allocation sur le heap), `Rc` (reference counted shared pointer).

### Borrowing
URL: https://google.github.io/comprehensive-rust/borrowing.html
### Cell / RefCell
- Utilisé pour créer un pointeur avec un getter/setter sur la variable :
    -  Il existe cependant des contraintes sur les ‘emprunts’ de valeurs .
    - `Cell` ne peut être utilisé dans une variable déclarée comme mutable
### Lifetimes
- URL : https://google.github.io/comprehensive-rust/lifetimes.html
- La durée de vie de toute référence doit être inférieure à la durée de vie (scope) de la variable.

Studying That Suits You

Use AI to generate personalized quizzes and flashcards to suit your learning preferences.

Quiz Team

Related Documents

More Like This

Bases du langage Rust
20 questions
Concepts de base de Rust
38 questions

Concepts de base de Rust

ImportantJasper9535 avatar
ImportantJasper9535
Concepts de base de Rust
45 questions

Concepts de base de Rust

CleanestBananaTree avatar
CleanestBananaTree
Use Quizgecko on...
Browser
Browser