This shows you the differences between two versions of the page.
sde2:laboratoare:02_rust [2023/03/12 12:06] cristiana.andrei [Sujets] |
sde2:laboratoare:02_rust [2023/03/14 08:07] (current) cristiana.andrei [Exercises] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== TP 02 - Systems de fichiers et le type Result ====== | ====== TP 02 - Systems de fichiers et le type Result ====== | ||
+ | ===== Assignment ===== | ||
+ | <note warning> | ||
+ | Vous devez **accepter** le assignment d'ici et travailler avec ce repository: [[https://classroom.github.com/a/sNXCQSO0|Lab2]] | ||
+ | </note> | ||
===== Objectifs ===== | ===== Objectifs ===== | ||
Le but de ce TP est d'apprendre à utiliser | Le but de ce TP est d'apprendre à utiliser | ||
Line 115: | Line 118: | ||
} | } | ||
</code> | </code> | ||
+ | |||
+ | === Raccourcis: unwrap === | ||
+ | La méthode **unwrap** est une méthode raccourcie implémentée tout comme l'expression de correspondance que nous avons écrite ci-dessus. | ||
+ | Si la valeur Result est la variante Ok, unwrap renverra la valeur à l'intérieur de Ok. Si le résultat est la variante Err, unwrap appellera la panic! macro pour nous. Voici un exemple de déballage en action : | ||
+ | |||
+ | <code c> | ||
+ | use std::fs::File; | ||
+ | |||
+ | fn main() { | ||
+ | let greeting_file = File::open("hello.txt").unwrap(); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | De même, la méthode **expect** nous permet également de choisir la panic! Message d'erreur. Utiliser expect au lieu de déballer et fournir de bons messages d'erreur peut transmettre votre intention et faciliter la recherche de la source d'une panique. La syntaxe de expect ressemble à ceci : | ||
+ | |||
+ | <code c> | ||
+ | use std::fs::File; | ||
+ | |||
+ | fn main() { | ||
+ | let greeting_file = File::open("hello.txt") | ||
+ | .expect("hello.txt should be included in this project"); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === L'operateur '?' === | ||
+ | Le **?** placé après la définition d'une valeur de résultat pour fonctionner presque de la même manière que l'expression de //match// que nous avons définies pour gérer les valeurs de résultat dans l'exemple pour unwrap. | ||
+ | |||
+ | Si la valeur du résultat est un Ok, la valeur à l'intérieur de l'Ok sera renvoyée à partir de cette expression et le programme continuera. Si la valeur est une Err, l'Err sera renvoyée par toute la fonction comme si nous avions utilisé le mot-clé return afin que la valeur d'erreur soit propagée au code appelant. | ||
+ | |||
+ | <code c> | ||
+ | use std::fs::File; | ||
+ | use std::io::{self, Read}; | ||
+ | |||
+ | fn read_username_from_file() -> Result<String, io::Error> { | ||
+ | let mut username = String::new(); | ||
+ | |||
+ | File::open("hello.txt")?.read_to_string(&mut username)?; | ||
+ | |||
+ | Ok(username) | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | |||
+ | Dans le contexte ci-dessous, le ? à la fin de l'appel File::open renverra la valeur à l'intérieur d'un Ok à la variable username_file. Si une erreur se produit, le ? L'opérateur reviendra plus tôt de toute la fonction et donnera n'importe quelle valeur Err au code appelant. La même chose s'applique au ? à la fin de l'appel read_to_string. | ||
===== Sugestions ===== | ===== Sugestions ===== | ||
Line 153: | Line 200: | ||
* Linux permissions [[https://en.wikipedia.org/wiki/Chmod]] | * Linux permissions [[https://en.wikipedia.org/wiki/Chmod]] | ||
- | <hidden> | + | ===== Exercises ===== |
- | ===== Sujets ===== | + | - Écrivez un programme qui reçoit en paramètre un dossier. Imprimer le contenu du dossier. //Hint: [[https://doc.rust-lang.org/std/fs/fn.read_dir.html|read_dir]]// |
- | - Écrivez un programme qui reçoit en paramètre un dossier. Imprimer le contenu du dossier. | + | |
- Écrivez un programme qui reçoit en argument de ligne de commande un fichier et une tâche. Mettre en œuvre les tâches : | - Écrivez un programme qui reçoit en argument de ligne de commande un fichier et une tâche. Mettre en œuvre les tâches : | ||
- **print** - imprime le contenu du fichier et le file descriptor | - **print** - imprime le contenu du fichier et le file descriptor | ||
Line 164: | Line 210: | ||
- **mode_text** - affiche le mode (permissions) en text (rwx...) du fichier | - **mode_text** - affiche le mode (permissions) en text (rwx...) du fichier | ||
- **print_buffer** - imprimez le contenu du fichier à l'aide des fonctions open et read. | - **print_buffer** - imprimez le contenu du fichier à l'aide des fonctions open et read. | ||
- | </hidden> | + | <hidden> |
===== Solutions ===== | ===== Solutions ===== | ||
[[https://github.com/UPB-FILS-SdE2/Solutions/tree/main/tp3|Solutions]] | [[https://github.com/UPB-FILS-SdE2/Solutions/tree/main/tp3|Solutions]] | ||
+ | </hidden> |