Slices als Funktionsparameter
Teil des Abschnitts Logik & Kontrollfluss 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
EinfachDu erhältst zwei Eingaben. Die erste Eingabe ist eine Textnachricht und die zweite Eingabe ist die maximal zulässige Länge der Nachricht. Erstelle 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 die maximale Länge überschreitet, soll die Funktion einen Slice der Nachricht bis zur maximalen Länge zurückgeben. Andernfalls soll sie die gesamte Nachricht zurückgeben. Gib das Ergebnis aus.
Anforderungen:
- Lies die erste Eingabe (die Textnachricht) ein und entferne die Leerzeichen
- Lies die zweite Eingabe (die maximale Länge) ein und entferne die Leerzeichen
- Wandle die maximale Länge in
usizeum - Definiere 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üfe innerhalb der Funktion, ob die Länge der Nachricht größer als die maximale Länge ist
- Wenn ja, gib einen Slice der Nachricht vom Index 0 bis zur maximalen Länge mit
&message[0..max_len]zurück - Wenn nein, gib die gesamte Nachricht zurück
- Rufe die Funktion mit der Eingabenachricht und der maximalen Länge auf
- Gib 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, wenn sie die maximale Länge überschreitet, andernfalls die vollständige Nachricht
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 Logik & Kontrollfluss
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Übe selbstständig: Online-Rust-Compiler