Concepts de base de 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

Quelle est la principale différence entre l'utilisation de let et const pour déclarer une variable en Rust ?

  • `let` est obligatoire pour toutes les déclarations de variables, tandis que `const` est uniquement utilisé dans les fonctions.
  • `let` est utilisé pour déclarer des variables mutables, tandis que `const` est utilisé pour les constantes.
  • `let` et `const` peuvent être utilisés de manière interchangeable, mais `const` est préféré pour des raisons de style.
  • `let` est utilisé pour déclarer des variables modifiables, tandis que `const` est utilisé pour les constantes qui sont résolues au moment de la compilation. (correct)

Quel est le type de données approprié pour stocker un caractère Unicode en Rust ?

  • `u8`
  • `string`
  • `i32`
  • `char` (correct)

Quelle est la caractéristique principale du type isize en Rust ?

  • Sa taille dépend de l'architecture du processeur. (correct)
  • Il ne peut stocker que des valeurs positives.
  • Il est toujours de 32 bits.
  • Il est toujours de 64 bits.

Comment peut-on inférer le type d'une variable en Rust sans le spécifier explicitement ?

<p>En laissant le compilateur déduire le type à partir de la première affectation ou utilisation. (A)</p> Signup and view all the answers

Quel est le rôle du mot-clé static dans la déclaration d'une variable en Rust ?

<p>Il permet à la variable d'être utilisable dans tous les blocs de code. (A)</p> Signup and view all the answers

Quelle est la différence fondamentale entre un if let et un match en Rust ?

<p><code>if let</code> est utilisé pour tester un seul pattern, tandis que <code>match</code> peut gérer plusieurs patterns. (B)</p> Signup and view all the answers

Dans une boucle for name/value_element in collection, quel est le rôle de name?

<p>C'est le nom de la variable qui prendra la valeur de chaque élément de la collection. (D)</p> Signup and view all the answers

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

<p>Passer à l'itération suivante de la boucle. (C)</p> Signup and view all the answers

Quand est-il approprié d'utiliser const devant la déclaration d'une fonction en Rust ?

<p>Quand la fonction doit être inlinée et son résultat calculé à la compilation. (C)</p> Signup and view all the answers

Comment déclare-t-on une liste (tableau) mutable d'entiers en Rust avec une taille fixe de 5 éléments ?

<p><code>let mut nomVar: [i32; 5] = [1, 2, 3, 4, 5];</code> (A)</p> Signup and view all the answers

Quelle méthode est utilisée pour modifier la valeur d'un élément à la case n d'une liste nomVar en Rust ?

<p><code>nomVar[n] = nouvelle_valeur;</code> (A)</p> Signup and view all the answers

Comment déclare-t-on un tuple en Rust ?

<p><code>let nomTuple: (type1, type2, ...) = (valeur1, valeur2, ...);</code> (D)</p> Signup and view all the answers

Si on souhaite ignorer certaines valeurs d'un tuple lors de l'affectation, quel symbole doit-on utiliser ?

<p><code>_</code> (C)</p> Signup and view all the answers

En Rust, quelle est la différence entre une Shared Reference et une Exclusive Reference ?

<p>Une <code>Shared Reference</code> permet plusieurs références en lecture seule, tandis qu'une <code>Exclusive Reference</code> est une référence unique en écriture. (D)</p> Signup and view all the answers

Que se passe-t-il si on tente de créer une référence exclusive (&mut) sur une variable après avoir déclaré une référence read-only sur cette même variable?

<p>Le compilateur Rust génère une erreur car il ne peut y avoir qu'une seule référence exclusive. (B)</p> Signup and view all the answers

Comment déclare-t-on un slice en Rust à partir d'une collection ?

<p><code>let slice: &amp;[type_collection] = &amp;collection[i..n];</code> (B)</p> Signup and view all the answers

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

<p><code>&amp;str</code> est un slice de bytes encodés en UTF-8, tandis que <code>String</code> est une structure de données qui possède et gère la mémoire d'une chaîne UTF-8. (D)</p> Signup and view all the answers

Comment définit-on une structure (struct) en Rust ?

<p><code>struct Struct_name { attribute1: type1, attribute2: type2 };</code> (D)</p> Signup and view all the answers

Comment accède-t-on à un attribut d'une struct à l'intérieur d'une méthode de cette struct?

<p><code>self.attribute</code> (D)</p> Signup and view all the answers

Quel est le but de l'implémentation d'un bloc impl nomStruct {} en Rust ?

<p>Ajouter des méthodes à la struct. (D)</p> Signup and view all the answers

Quelle est la différence entre &self et &mut self dans la signature d'une méthode de struct en Rust ?

<p><code>&amp;self</code> prend une référence immutable à la struct, tandis que <code>&amp;mut self</code> prend une référence mutable. (C)</p> Signup and view all the answers

Comment définir un constructeur personnalisé pour une struct en Rust ?

<p>En implémentant une fonction nommée <code>new</code> qui retourne une instance de <code>Self</code>. (B)</p> Signup and view all the answers

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

<p>Une struct pour laquelle les noms des attributs ne sont pas importants. (B)</p> Signup and view all the answers

Comment récupérer le k-ième attribut d'une TupleStruct nommée ma_tuple en Rust ?

<p><code>ma_tuple.k</code> (C)</p> Signup and view all the answers

Quel est le rôle d'un Trait en Rust ?

<p>Permettre l'implémentation de multiples interfaces par une struct. (B)</p> Signup and view all the answers

Comment indiquer qu'une struct implémente un trait en Rust ?

<p><code>impl MonTrait for maStruct {}</code> (D)</p> Signup and view all the answers

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

<p>Un type de données dont les valeurs possibles sont limitées et définies au moment de sa création. (C)</p> Signup and view all the answers

Comment accéder à une valeur spécifique d'un enum en Rust ?

<p><code>EnumName::value</code> (D)</p> Signup and view all the answers

Quel est le but des Aliases en Rust ?

<p>Donner un nouveau nom à un type existant. (D)</p> Signup and view all the answers

Comment déclare-t-on un alias de type en Rust ?

<p><code>type NewName = ExistingType;</code> (C)</p> Signup and view all the answers

Quel est le principal avantage des fonctions génériques en Rust ?

<p>Elles permettent d'écrire du code qui fonctionne avec différents types sans duplication. (A)</p> Signup and view all the answers

Comment spécifie-t-on qu'un type générique T doit implémenter un trait spécifique en Rust ?

<p><code>fn nomfunc&lt;T: MonTrait&gt;(param: T) {}</code> (A)</p> Signup and view all the answers

Qu'est-ce que la vtable dans le contexte des fonctions dynamiques en Rust ?

<p>Une table de dispatch virtuel contenant les pointeurs vers les implémentations des méthodes d'un trait pour un type donné. (C)</p> Signup and view all the answers

Comment documenter du code en Rust de manière à ce que la documentation soit incluse dans la documentation générée par rustdoc ?

<p>En utilisant des commentaires de la forme <code>/// Ceci est un commentaire</code>. (D)</p> Signup and view all the answers

Quel est le rôle de l'énumération Option en Rust ?

<p>Représenter une valeur qui peut être soit présente, soit absente. (B)</p> Signup and view all the answers

Que se passe-t-il si on appelle la méthode unwrap() sur une valeur de type Option qui est None?

<p>Le programme panique et se termine. (C)</p> Signup and view all the answers

Quelle est la différence entre unwrap() et expect() pour gérer les valeurs Option en Rust ?

<p><code>expect()</code> permet de spécifier un message d'erreur personnalisé en cas de panique, tandis que <code>unwrap()</code> utilise un message par défaut. (D)</p> Signup and view all the answers

Quel est le rôle de l'énumération Result en Rust ?

<p>Représenter le résultat d'une opération qui peut réussir (<code>Ok</code>) ou échouer (<code>Err</code>). (D)</p> Signup and view all the answers

Quelle est la méthode utilisée pour ajouter une chaîne de caractères à la fin d'une String en Rust ?

<p><code>string.push_str(nouvelle_chaine)</code> (D)</p> Signup and view all the answers

Comment créer un nouveau vecteur (Vec) en Rust ?

<p><code>let mut v = vec![];</code> (C)</p> Signup and view all the answers

Quelle méthode est utilisée pour supprimer les éléments dupliqués d'un vecteur en Rust, en conservant uniquement la première occurrence?

<p><code>v.dedup()</code> (C)</p> Signup and view all the answers

Quel est le rôle d'une HashMap en Rust ?

<p>Associer des clés à des valeurs dans un dictionnaire. (A)</p> Signup and view all the answers

Comment insérer une nouvelle paire clé-valeur dans une HashMap en Rust ?

<p><code>hmap.insert(clé, valeur)</code> (C)</p> Signup and view all the answers

Comment vérifier si une HashMap contient une clé spécifique en Rust ?

<p><code>hmap.contains(clé)</code> (A)</p> Signup and view all the answers

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

Signup and view all the answers

Flashcards

Fonction main

Point d'entrée du programme Rust.

mut

Déclare une variable modifiable.

Entiers signés

i8, i16, i32, i64, i128, isize. Exemples : -10, 0, 1_000, 123_i64.

Entiers non signés

u8, u16, u32, u64, u128, usize. Exemples : 0, 123, 10_u16.

Signup and view all the flashcards

Nombres à virgule flottante

f32, f64. Exemples : 3.14, -10.0e20, 2_f32.

Signup and view all the flashcards

Valeurs scalaires Unicode

char. Exemples : 'a', 'α', '∞'.

Signup and view all the flashcards

Booléens

bool. Valeurs : true, false.

Signup and view all the flashcards

const

Pour définir une constante

Signup and view all the flashcards

Définition de fonction

fn nom_fonction (paramètre1 : type, ..., paramètreN : type) -> typeRetour { contenu }

Signup and view all the flashcards

Valeur de retour d'une fonction

Dernière valeur de la dernière ligne du block

Signup and view all the flashcards

Block

{...}

Signup and view all the flashcards

Variable static

Variable utilisable dans tous les blocs.

Signup and view all the flashcards

If predicat {}

Si une condition est vraie.

Signup and view all the flashcards

if let nomVar

Teste si une variable suit un motif.

Signup and view all the flashcards

Match nom_variable

Équivalent de switch.

Signup and view all the flashcards

typeEnum::attribute(value) => block

Spécifie un nom de variable à la place de value pour tester si l'attribut à une valeur et l'utiliser dans le bloc suivant.

Signup and view all the flashcards

Boucle while

while predicat {}

Signup and view all the flashcards

For name/value_element in collection {}

Pour chaque élément dans ... de ... à ..., faire

Signup and view all the flashcards

Boucle infinie

Loop {}

Signup and view all the flashcards

Continue

Continue;

Signup and view all the flashcards

Break

Break;

Signup and view all the flashcards

const (devant une fonction)

Déclare une fonction constante.

Signup and view all the flashcards

Macros

Fonction prenant un nombre indéfini de paramètres.

Signup and view all the flashcards

Liste

Let mut nomVar : [ type ; tailleListe ] = [ value1,... value_tailleListe ]

Signup and view all the flashcards

Tuple

Let nomTuple: (typeValeur1 ,..., typeValeurN) = (valeur1 ,..., valeur n )

Signup and view all the flashcards

Référence

Pointeur vers une donnée.

Signup and view all the flashcards

Shared reference

let nomRef: &type_var_a_referer = &nomVariable

Signup and view all the flashcards

Exclusive Reference

let nomRef = &mut var

Signup and view all the flashcards

Slices

Pointeur vers un ou plusieurs éléments d'une collection.

Signup and view all the flashcards

Struct

Struct Struct_name {}

Signup and view all the flashcards

impl nomStruct {}

Définit des méthodes pour un type.

Signup and view all the flashcards

trait nomTrait {}

Définit une interface implémentable par des types.

Signup and view all the flashcards

Enums

Type dont les valeurs possibles sont limitées.

Signup and view all the flashcards

Aliases

Il est possible de déclarer un nouveau nom de type. type name_type_1 = name_type_2

Signup and view all the flashcards

Generic Functions

Implémente des fonctions avec des types génériques.

Signup and view all the flashcards

Option

Type optionnel pouvant contenir une valeur ou être vide.

Signup and view all the flashcards

Result

Stocke le résultat d'une opération.

Signup and view all the flashcards

String

Liste de caractères encodés en UTF-8.

Signup and view all the flashcards

Vec

Permet de faire un vecteur.

Signup and view all the flashcards

Operators

Impl std::ops::Add for typename

Signup and view all the flashcards

Study Notes

Fonction Principale

  • La source d'information est google.github.io/comprehensive-rust/
  • Syntaxe: fn main() {}

Variables

  • Syntaxe: let mut nom_variable: type = valeur;
  • mut est requis si la variable doit être modifiée.

Types et Littéraux

  • Entiers signés : i8, i16, i32, i64, i128, isize avec des littéraux comme -10, 0, 1_000, 123_i64.
  • Entiers non signés : u8, u16, u32, u64, u128, usize avec des littéraux comme 0, 123, 10_u16.
  • Nombres à virgule flottante : f32, f64 avec des littéraux comme 3.14, -10.0e20, 2_f32.
  • Valeurs scalaires Unicode : char avec des littéraux comme 'a', 'α', '∞'.
  • Booléens : bool avec des littéraux true, false.
  • Largeur des types :
    • iN, uN et fN ont une largeur de N bits.
    • isize et usize ont la largeur d'un pointeur.
    • char a une largeur de 32 bits.
    • bool a une largeur de 8 bits.
  • Inférance de type : Le compilateur détermine le type d'une variable si non spécifié.
  • let peut être remplacé par const pour définir une constante.

Fonctions

  • Définition : fn nom_fonction (parameter1 : type ,…, parameterN : type ) -> typeRetour { contenu }
  • Pas besoin de return ; la dernière valeur utilisée est renvoyée.
  • Voir la section sur les blocs pour plus de détails.

Blocs

  • Définition : {…}
  • La valeur du bloc est la dernière valeur/variable du bloc:
    • {7} a une valeur de 7.
  • Un bloc terminé par un point-virgule a une valeur de ().
  • Une variable static peut être déclarée pour être utilisée dans tous les blocs.

Opérateurs Logiques

  • if predicat { … }: Exécute si predicat est vrai.
  • else if predicat { … }: Exécute si le predicat précédent est faux et predicat est vrai.
  • else { … }: Exécute si tous les predicat précédents sont faux.
  • if let nomVar: teste si une variable correspond à un pattern.

Correspondance de Motifs (Pattern Matching)

  • Syntaxe:
      Match nom_variable {
          Value1 => block1,
          Value2 => block2,
          Value3 => block3,
          _ => block Default
      }
    
  • Equivalent de switch.
  • Des opérateurs/conditions peuvent être ajoutés aux valeurs.
    • Value1 | value2 && value3 => block4
    • Value if predicate sur value => block5
  • Peut être utilisé avec des structures ou des énumérations pour tester leurs attributs.

Correspondance de structures (Struct Matching)

Match nom_struct {
    typeStruct{attribute1 : value1, attribute2 : value2,… attributeN : valueN} => block1,
    typeStruct{attribute1 : nomVar} => block2,
    typeStruct{attribute1,attribute2,.. } => block3
}
  • Teste si les attributs d'une structure correspondent à des valeurs spécifiques.

Correspondance d'Énumérations (Enum Matching)

  • Syntaxe: typeEnum::attribute(value) => block
  • Un nom de variable peut être spécifié à la place de value pour tester et utiliser la valeur de l'attribut.

Boucles

  • while predicat { }: Exécute la boucle tant que le predicat est vrai.
  • for name/value_element in collection { }: Boucle à travers chaque élément d'une collection.
  • Loop { }: Boucle infinie.
  • continue: Passe directement à l'itération suivante dans une boucle.
  • break: Quitte immédiatement une boucle.
  • Il est possible de nommer une boucle pour l'extraire avec break.

Fonctions Constantes

  • const devant la déclaration d'une fonction indique qu'elle ne peut utiliser que des variables constantes, est inline et son résultat est calculé à la compilation.

Macros

  • Définition :nomMacro !( param1,param2,…,paramN ) ;
  • Fonction pouvant prendre un nombre indéfini de paramètres.

Collections

  • Type liste et tuple

Listes

  • Syntaxe: Let mut nomVar : [ type ; tailleListe ] = [ value1,… value_tailleListe ]
  • NomVar[ n ] = Change la valeur à la case n
  • Syntaxe itération: élément in nomListe

Tuples

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

Références

  • Informations de référence

Référence Partagée

  • Lecture seule
  • Définition let mut nomRef: &type_var_a_referer = &nomVariable ;
  • Utiliser * nomRef pour récupérer la valeur stockée

Référence Exclusive

  • Permet de modifier la valeur
  • Définition: let nomRef = &mut var
  • Une seule référence exclusive par variable est autorisée.
  • Devient read-only si la variable est modifiée après sa déclaration.
  • Ne peut être null ou pointer vers une valeur hors du bloc.

Slices

  • Pointeur vers un ou plusieurs éléments d'une collection.
  • Définition Let slide: &[type_collection] = &collection [i.. n];
  • Pointe vers les éléments d'indice k appartenant à [i, n-1].
  • Type &str est un slice de bytes encodés en UTF-8 (&[u8]).
  • String est similaire à Vec avec T = u8.

Structures

  • Informations générales sur les structures.

Définition de Structure (Struct)

struct Struct_name {
    attribute1 : type1 ;
    attribute2 : type2 ;
};

Utilisation et Modification de Structure

  • Accéder à un attribut: Struct_Name.attribute
let mut var_name : struct_name{ attribute_1 : value,… , attribute_n : value }

Méthodes de Structure

impl nomStruct {
    fn nomFunc(&self parameter1 : type ,…, parameterN : type ) ->typeRetour{

    }
}
  • &self empêche la modification (lecture seule partagée) ; &mut self permet la modification (lecture/écriture exclusive).

Constructeurs de Structures

fn new ( parameter 1 : type1,… ) -> Self{
    Self {attribute1 : value,…, attributeN : valueN }
}
  • Nécessite une valeur pour chaque attribut.
  • Toujours finir par Self{…} pour retourner la structure.

TupleStruct

  • Structure dont les attributs n'ont pas de noms.
struct struct_name (type1,…,typeN);
``` Utilisation et Modification:

- Accéder à un attribut: `struct_name.k` (k est un index).

### Traits
- Permettent d'ajouter des interfaces à des structures.
- Traits implémentation
```rust
trait nomTrait {
    fn abstractFunc(&self,…) -> typeReturn;
}
  • La méthode est abstraite et doit être implémentée par une structure.
impl nomTrait for nomStruct{
    fn abstractFunc(&self,…) -> typeReturn {…}
}

Héritage et Association de Types

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

Traits Supportés

#[derive(trait1, …, traitN)]
Struct nomStruct {}

Énumérations (Enums)

  • Type avec des valeurs limitées définies à la création.
enum name {
    value1,
    …,
    valueN,
};

Utilisation

Enum_name ::value_k pour donner une valeur à une variable de ce type.

Alias

  • Déclaration d'un nouveau nom de type.
  • Syntaxe: type name_type_1 = name_type_2

Fonctions Génériques

  • Implémente des fonctions avec des types génériques (patrons).
fn nomfunc (param1 :type1 ,…, paramk : T,…, paramN : typeN) -> T {}
  • Les éléments de type T peuvent être de n'importe quel type.
  • Un type peut être retourné tant que la variable retournée est de ce type.
  • Utiliser <> après le nom de la fonction pour identifier un type inconnu.
  • Implémentation d'un trait:
fn nomfunc (param1 :type1 ,…, paramk : T,…, paramN : typeN) -> T {}

Implémentation Générique

  • Structures implémentant des types génériques.
struct Struct_name  {
    attribute1 : T ;
};

Traits Génériques Héritant de Traits Spécifiques

Impl nomType for Struct_name {

}
  • Utiliser des attributs héritant d'un trait spécifique, implémenter les méthodes pour notre struct.

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 des types/struct implémentant le type du paramètre en entrée.
fn generic (attribut1: &impl typeA){

}

Impl Trait Compilation

  • &impl permet à la compilation de créer une version pour chaque type implémentant typeA.
 fn generic (attribut1: &dyn typeA){

}

Dyn Trait Compilation

  • &dyn ne crée pas de différentes versions, mais recherche dynamiquement le bon type dans une vtable.
  • La variable passée en paramètre doit être un pointeur.

Documentation

  • Documenter le code avec les annotations suivantes :

  • /// commentaire

  • //! Inner doc comment

  • Le commentaire Doc inner documente un élément à l’intérieur d’un bloc, d’une structure ou d’une fonction.

  • Toute bibliothèque publiée dans Rust est automatiquement documentée sur docs.rs (outil rustdoc)

Bibliothèque Standard

  • Liens vers les traits STD
  • Informations générales sur la STD

Option

  • Utiliser std
let mut var1: Option<type> = var2;
  • Stocker une valeur ou rien du tout.
  • Utiliser pour les fonctions pouvant ne rien renvoyer (find(String s)).

Déballage de l'Option

  • Utiliser unwrap ou expect pour récupérer la valeur dans l'option.
var2.unwrap();
var2.expect(« message ») ;
  • unwrap panique si var2 est None.
  • expect panique aussi, mais renvoie un message d'erreur personnalisé.

Result

  • Permet de stocker le résultat d’une opération et d’indiquer si elle réussit ou non.
Result<TypeValeurRetourné, TypeErreur> = operation(…)
  • Contient deux attributs : Ok, Err. Si l’opération réussit, la valeur se trouve dans Ok

Obtention de la Valeur de Resut

storedResult = Result<TypeValeurRetourné, TypeErreur> = operation(…)
match storedResult{
    Ok(mut storedResult) => {…}
    Err(err) => {…}
}
  • err correspont au message d’erreur si l'opération échoue.

String

  • Liste de caractères encodée en UTF-8.
let mut var = String::new();
var.push_str(string)

String Functionality

  • Ajouter un autre string à la fin : var.push_str(string)
  • Ajouter un character : var.push(« c »)
  • Obtenir la longueur de la chained : var.len
  • Obtenir le nombre de caractères : var.count
  • Obtenir le nombre d’éléments maximal de la chaîne : var.capacity

Vecteur

  • Définition:
 let mut v1 = Vec::new();
  • Fonctions push, len et capacity
  • Garde que ceux qui répondent à la conditions : v1.retain( condition )
  • Suppression des doubles v1.dedup();

HashMap

let mut hmap = HashMap::new();
  • Dictiionaire associant une valeur à une clé

Inserter une nouvelle données

hmap.insert( Stringkey , Intvalue );
  • Contenu de la clé renvoie true si elle existe.
hmap.containskey( key ) ;
  • Nombre de clés hmap.len()

Récupération de la valeur associé à la clé

hmap.get( key )

Comparaisons

  • Surcharger != ou ==en implémentant le trait partialeq
impl PartialEq for typename{
   fn eq(&self, other: &Self) -> bool {
        self.attribute == other.attribute
    }
   fn ne(&self, other: &Self) -> bool {
        self.attribute != other.attribute
}
}

Surchargement des opérateurs de comparaison

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

Operators

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 }
        }
}

Conversion

  • Implémenter from () permet d’extraire une valeur d’un type vers un autre
let one = i16::from(true);
Implémenter from pour un type va implémenter  into pour un autre type.

Implémenter From pour un type revient à implémenter into pour l’autre type.
as permet d’utiliser une variable comme une variable d’un autre type :
var as type

Lecture et Écriture de Fichiers (Read and Write)

  • Lecture les données d'un fichier au format bytes
fn reading(reader: R) …{
    Let buf_reader = BufReader::new(reader);
}

Fonctions utiles à la lecture et l'écriture

  • Lire des bytes et permet aux types qu'on lisent implémentent la fonctions
fn writeSomething(writer: &mut W, toWrite: &str) -> … {
    writer.write_all(toWrite.as_bytes());
    }

Default

  • Trait représentant la valeur par défaut

Default trait exemple

impl Default for type1 {
 Fn default() -> type1{ valAttr1, valAttr2,… valAttrN }
}
  • Pour les valeurs par défaut utiliser nomType ::default()

Mémoire

  • Informations générales

Type d'allocation de la mémoire

  • Le stack et le heap

Stack

  • Varibales locales
  • Allocation très rapide
  • Limité
  • Cache localité

Heap

  • Allocation lente
  • En dehors des appels de fonctions
  • Allocation dynamique déterminée à l'exécution

Ownership

  • Chaque valeur ne peut avoir qu'un propriétaire
  • L'attributions par ""="" change leur propriété
  • Les accès causent une erreur

Copier, cloner

  • Pour faire une copie pour clonage : var2(var1.clone()) ;
  • Pour faire une copie par value
#[derive(Copy)]
struct nomStruct {…}

Drop trait

  • Déterminer le code à exécuter à la libération de la mémoire
impl Drop for nomStruct {
  fn drop(&mut self) {
}

Pointeurs

  • Informations générales sur les pointeurs

Les pointeurs de rust

Box

  • Direction d’allocation et structure de données
let var 1 = Box::new(value) ;

Trait

  • Box implémente le trait Deref, ce qui signifie que si une box contient une instance d’une structure, on peut appeler les méthodes de cette structure directement avec :
Let varBoxStruct = Box ::new( valueStruct )
VarBoxStruct::methodStruct()

On peut aussi utiliser Box pour des types non définis dans la STD ou le langage avec
des références dynamiques :
Box::new(nomStruct { attr1 : valAttr1, attr2 : valAttr2, … }),
Rc
  • Pointeurs partagés avec compteur
let var1 = Rc::new(value);
let var2 = Rc::clone(&var1);

Borrowing

  • Informations sur le borrowing

Assignations

  • fn func(val1: &type1, val2: &type2) -> … {…}
  • Limitations de la durée de vie lifeimeset les emprunts

Cell

  • Permet de créer un pointeur avec un getter/setter.
let cell = Cell::new(value);
cell.set(value);
dbg!(cell.get());
Cell ne peut être utilisé mut let cell = Cell::new(value);

RefCell

  • Utiliser la références exclusives.
let cell = RefCell::new(value);
let mut cell_ref = cell.borrow_mut();   
- cell_ref = value
  • Attention on ne peut avoir qu’une celle référence dans le même bloc.

Lifetimes

  • Toute dépendance nécessite une durée de vie
  • Détermimer des durées des vies inférieures au scopé générale

Linter

fn func  &'a type1
De même les structures ont besoin d'une durée de vie ou liftime
struct struct<'lifetime> {
 Attribute 1: &'lifetime type,
}

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
Introduction à Rust: variables et types
20 questions
Use Quizgecko on...
Browser
Browser