Les slices comme paramètres de fonction
Fait partie de la section Logic & Flow du Journey Rust de Coddy — leçon 56 sur 66.
Lors de l'écriture de fonctions qui travaillent avec des chaînes de caractères, l'utilisation de &str comme type de paramètre au lieu de String rend vos fonctions beaucoup plus flexibles et utiles.
Une fonction qui prend un paramètre String ne peut accepter que des chaînes possédées (owned), ce qui limite la façon dont vous pouvez l'appeler :
fn print_message(text: String) {
println!("{}", text);
}
// Cela fonctionne, mais prend la possession (ownership)
let my_string = String::from("Hello");
print_message(my_string); // my_string n'est plus utilisable après celaCependant, une fonction qui prend &str peut accepter à la fois des références de String et des littéraux de chaîne, ce qui la rend beaucoup plus polyvalente :
fn print_message(text: &str) {
println!("{}", text);
}
// Maintenant, vous pouvez l'appeler avec l'un ou l'autre type
let my_string = String::from("Hello");
print_message(&my_string); // Passer une référence à String
print_message("World"); // Passer un littéral de chaîne directementCette flexibilité signifie que vos fonctions fonctionnent dans davantage de situations sans forcer les appelants à convertir leurs données ou à céder la propriété.
Défi
FacileVous recevrez deux entrées. La première entrée est un message texte, et la deuxième entrée est la longueur maximale autorisée pour le message. Créez une fonction appelée truncate_message qui prend une tranche de chaîne (&str) et une longueur maximale (usize) comme paramètres. Si la longueur du message dépasse le maximum, la fonction doit retourner une tranche du message jusqu'à la longueur maximale. Sinon, elle doit retourner le message entier. Affichez le résultat.
Exigences :
- Lire la première entrée (le message texte) et supprimer les espaces blancs (trim)
- Lire la deuxième entrée (la longueur maximale) et supprimer les espaces blancs (trim)
- Convertir (parse) la longueur maximale en
usize - Définir une fonction
truncate_messagequi prend deux paramètres :- Une tranche de chaîne
&strpour le message - Un
usizepour la longueur maximale
- Une tranche de chaîne
- À l'intérieur de la fonction, vérifier si la longueur du message est supérieure à la longueur maximale
- Si oui, retourner une tranche du message de l'index 0 à la longueur maximale en utilisant
&message[0..max_len] - Si non, retourner le message entier
- Appeler la fonction avec le message d'entrée et la longueur maximale
- Afficher le résultat retourné
Entrée :
- Première ligne : Un message texte (par exemple,
Hello World from Rust) - Deuxième ligne : La longueur maximale sous forme de nombre (par exemple,
11)
Sortie :
- Le message tronqué s'il dépasse la longueur maximale, ou le message complet sinon
Aide-mémoire
Utiliser &str comme type de paramètre rend les fonctions plus flexibles que l'utilisation de String, car elles peuvent accepter à la fois des références de chaînes et des littéraux de chaînes :
fn print_message(text: &str) {
println!("{}", text);
}
let my_string = String::from("Hello");
print_message(&my_string); // Passer une référence à String
print_message("World"); // Passer un littéral de chaîne directementPour retourner une tranche d'une chaîne jusqu'à une certaine longueur, utilisez la syntaxe de tranche :
&message[0..max_len]Essayez vous-même
use std::io;
// TODO: Définir la fonction truncate_message ici
fn main() {
// Lire le message texte
let mut message = String::new();
io::stdin().read_line(&mut message).expect("Failed to read line");
let message = message.trim();
// Lire la longueur maximale
let mut max_length_input = String::new();
io::stdin().read_line(&mut max_length_input).expect("Failed to read line");
let max_len: usize = max_length_input.trim().parse().expect("Invalid number");
// TODO: Appeler la fonction truncate_message et stocker le résultat
// TODO: Imprimer le résultat
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Structures de contrôle avancées
L'expression 'match'Filtrage de plusieurs valeursFiltrage d'intervallesL'expression 'if let'Les boucles en tant qu'expressionsRécapitulatif - Analyseur de commandes simple4Regrouper des données avec les structures
Qu'est-ce qu'une structure ?Aperçu des structuresAccéder aux champs d'une structureStructures mutablesLes structures comme paramètres de fonctionStructures tupleRécapitulatif - Créer une structure Book2Introduction aux vecteurs
Qu'est-ce qu'un vecteur ?Créer un vecteurAjouter des éléments avec pushAccéder aux éléments d'un vecteurItérer sur un vecteurItération mutableSupprimer des élémentsRécapitulatif - Suivi de score basique5Paires clé-valeur avec les Hash Maps
Qu'est-ce qu'une Hash Map ?Créer une Hash MapInsérer des paires clé-valeurAccéder aux valeursParcourir une Hash MapMettre à jour une valeurSupprimer une paireRécapitulatif - Compteur de mots8Projet : Inventaire d'articles simple
Configuration du projetAjouter un articleVérifier le stockVendre un articleAssembler le tout3Liste de tâches en ligne de commande
Configuration du projetAjouter une tâcheAfficher toutes les tâchesSupprimer une tâcheCode final6Gérer l'absence avec 'Option'
Qu'est-ce qu'une 'Option' ?Utiliser 'match' avec 'Option'is_some() et is_none()Déballer une 'Option'La méthode expectFournir une valeur par défaut : unwrap_orRécapitulatif - Trouver un élément9Slices de chaînes et plus encore
String vs. &strCréer des slices de chaînesLes slices comme paramètres de fonctionAutres types de slicesRécapitulatif - Trouver le premier mot