Slices als Funktionsparameter
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 56 von 66.
Beim Schreiben von Funktionen, die mit Strings arbeiten, macht die Verwendung von &str als Parametertyp anstelle von String Ihre Funktionen viel flexibler und nützlicher.
Eine Funktion, die einen String-Parameter erwartet, kann nur Strings im Besitz (owned strings) akzeptieren, was die Art und Weise einschränkt, wie man sie aufrufen kann:
fn print_message(text: String) {
println!("{}", text);
}
// Dies funktioniert, übernimmt aber den Besitz
let my_string = String::from("Hello");
print_message(my_string); // my_string ist danach nicht mehr verwendbarEine Funktion, die &str entgegennimmt, kann jedoch sowohl String-Referenzen als auch String-Literale akzeptieren, was sie viel vielseitiger macht:
fn print_message(text: &str) {
println!("{}", text);
}
// Jetzt können Sie sie mit beiden Typen aufrufen
let my_string = String::from("Hello");
print_message(&my_string); // Eine Referenz auf String übergeben
print_message("World"); // Ein String-Literal direkt übergebenDiese Flexibilität bedeutet, dass Ihre Funktionen in mehr Situationen funktionieren, ohne die Aufrufer zu zwingen, ihre Daten zu konvertieren oder das Eigentum aufzugeben.
Aufgabe
EinfachSie erhalten zwei Eingaben. Die erste Eingabe ist eine Textnachricht und die zweite Eingabe ist die maximal zulässige Länge für die Nachricht. Erstellen Sie eine Funktion namens truncate_message, die einen String-Slice (&str) und eine maximale Länge (usize) als Parameter entgegennimmt. Wenn die Länge der Nachricht das Maximum überschreitet, soll die Funktion einen Slice der Nachricht bis zur maximalen Länge zurückgeben. Andernfalls soll sie die gesamte Nachricht zurückgeben. Geben Sie das Ergebnis aus.
Anforderungen:
- Lesen Sie die erste Eingabe (die Textnachricht) ein und entfernen Sie Leerzeichen am Anfang und Ende (trim)
- Lesen Sie die zweite Eingabe (die maximale Länge) ein und entfernen Sie Leerzeichen am Anfang und Ende (trim)
- Parsen Sie die maximale Länge in den Typ
usize - Definieren Sie eine Funktion
truncate_message, die zwei Parameter entgegennimmt:- Einen String-Slice
&strfür die Nachricht - Ein
usizefür die maximale Länge
- Einen String-Slice
- Prüfen Sie innerhalb der Funktion, ob die Länge der Nachricht größer als die maximale Länge ist
- Falls ja, geben Sie einen Slice der Nachricht von Index 0 bis zur maximalen Länge mit
&message[0..max_len]zurück - Falls nein, geben Sie die gesamte Nachricht zurück
- Rufen Sie die Funktion mit der eingegebenen Nachricht und der maximalen Länge auf
- Geben Sie das zurückgegebene Ergebnis aus
Eingabe:
- Erste Zeile: Eine Textnachricht (z. B.
Hello World from Rust) - Zweite Zeile: Maximale Länge als Zahl (z. B.
11)
Ausgabe:
- Die gekürzte Nachricht, falls sie die maximale Länge überschreitet, andernfalls die vollständige Nachricht
Spickzettel
Die Verwendung von &str als Parametertyp macht Funktionen flexibler als die Verwendung von String, da sie sowohl String-Referenzen als auch String-Literale akzeptieren können:
fn print_message(text: &str) {
println!("{}", text);
}
let my_string = String::from("Hello");
print_message(&my_string); // Übergibt eine Referenz auf einen String
print_message("World"); // Übergibt ein String-Literal direktUm einen Slice eines Strings bis zu einer bestimmten Länge zurückzugeben, verwenden Sie die Slice-Syntax:
&message[0..max_len]Probier es selbst
use std::io;
// TODO: Definiere hier die Funktion truncate_message
fn main() {
// Lies die Textnachricht ein
let mut message = String::new();
io::stdin().read_line(&mut message).expect("Failed to read line");
let message = message.trim();
// Lies die maximale Länge ein
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: Rufe die Funktion truncate_message auf und speichere das Ergebnis
// TODO: Gib das Ergebnis aus
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Fortgeschrittener Kontrollfluss
Der 'match'-AusdruckAbgleichen mehrerer WerteBereiche abgleichenDer 'if let'-AusdruckSchleifen als AusdrückeRückblick – Einfacher Befehls-Parser4Daten gruppieren mit Structs
Was ist ein Struct?Übersicht über StructsZugriff auf Struct-FelderVeränderbare StructsStructs als FunktionsparameterTupel-StructsZusammenfassung – Ein Buch-Struct erstellen2Einführung in Vektoren
Was ist ein Vektor?Einen Vektor erstellenElemente mit push hinzufügenZugriff auf Vektor-ElementeÜber einen Vektor iterierenVeränderliche IterationElemente entfernenZusammenfassung – Einfacher Score-Tracker5Schlüssel-Wert-Paare mit Hash Maps
Was ist eine Hash Map?Erstellen einer Hash MapEinfügen von Schlüssel-Wert-PaarenZugreifen auf WerteIterieren über eine Hash MapAktualisieren eines WertesEntfernen eines PaaresZusammenfassung – Wortzähler8Projekt: Einfaches Artikelinventar
Projekt-SetupEinen Artikel hinzufügenLagerbestand prüfenEinen Artikel verkaufenAlles zusammenfügen11Abschluss-Herausforderungen
Wiederholung - Einzigartige ElementeWiederholung - Benutzerprofil-ValidatorWiederholung - Noten-Zusammenfassung3Kommandozeilen-To-Do-Liste
Projekt-SetupEine Aufgabe hinzufügenAlle Aufgaben anzeigenEine Aufgabe entfernenFinaler Code6Umgang mit fehlenden Werten mit 'Option'
Was ist ein 'Option'?'match' mit 'Option' verwendenis_some() und is_none()Ein 'Option' entpackenDie 'expect'-MethodeStandardwert bereitstellen: unwrap_orRückblick – Ein Element finden9String-Slices und mehr
String vs. &strString-Slices erstellenSlices als FunktionsparameterWeitere SlicesRückblick – Das erste Wort finden