Structs als Funktionsparameter
Teil des Abschnitts Logic & Flow der Rust-Journey von Coddy — Lektion 24 von 66.
Nachdem Sie nun wissen, wie man Structs erstellt und modifiziert, lassen Sie uns untersuchen, wie man sie mit Funktionen verwendet. Genau wie jeden anderen Datentyp in Rust können Sie Struct-Instanzen an Funktionen übergeben und sie von Funktionen zurückgeben.
Um ein Struct an eine Funktion zu übergeben, fügen Sie es einfach als Parameter in die Funktionsdefinition ein:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}Diese Funktion nimmt eine Rectangle-Struktur als Parameter entgegen und gibt einen i32-Wert zurück. Innerhalb der Funktion können Sie auf die Felder der Struktur mithilfe der Punktnotation zugreifen, genau wie an jeder anderen Stelle auch.
Sie können auch Structs von Funktionen zurückgeben, indem Sie den Struct-Typ als Rückgabetyp angeben:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}Die Verwendung von Structs mit Funktionen macht Ihren Code organisierter und aussagekräftiger. Anstatt mehrere einzelne Parameter zu übergeben, können Sie zusammengehörige Daten gruppieren und sie als eine einzige, gut definierte Einheit übergeben.
Aufgabe
EinfachSie erhalten vier Eingaben: die Breite eines Rechtecks (als Ganzzahl), die Höhe eines Rechtecks (als Ganzzahl), die Seitenlänge eines Quadrats (als Ganzzahl) und eine Auswahlzahl (1 oder 2). Definieren Sie ein Rectangle-Struct mit zwei Feldern: width: i32 und height: i32. Erstellen Sie zwei Funktionen: eine, die ein Rectangle entgegennimmt und dessen Fläche berechnet, und eine andere, die eine Seitenlänge entgegennimmt und ein Rectangle zurückgibt, das ein Quadrat darstellt. Berechnen und geben Sie basierend auf der Auswahl-Eingabe die entsprechende Fläche aus.
Anforderungen:
- Definieren Sie ein
Rectangle-Struct mit den Feldern:width: i32undheight: i32 - Erstellen Sie eine Funktion
calculate_area, die einRectangleals Parameter entgegennimmt und eini32(die Fläche) zurückgibt - Erstellen Sie eine Funktion
create_square, die eini32(Seitenlänge) als Parameter entgegennimmt und einRectanglemit gleicher Breite und Höhe zurückgibt - Lesen Sie die erste Eingabe und konvertieren Sie diese in ein
i32für die Breite des Rechtecks - Lesen Sie die zweite Eingabe und konvertieren Sie diese in ein
i32für die Höhe des Rechtecks - Erstellen Sie eine
Rectangle-Instanz mit diesen Dimensionen - Lesen Sie die dritte Eingabe und konvertieren Sie diese in ein
i32für die Seitenlänge des Quadrats - Lesen Sie die vierte Eingabe und konvertieren Sie diese in ein
i32für die Auswahl (1 oder 2) - Wenn die Auswahl 1 ist: Berechnen und geben Sie die Fläche des Rechtecks aus
- Wenn die Auswahl 2 ist: Erstellen Sie ein Quadrat mit
create_square, berechnen Sie dann dessen Fläche und geben Sie diese aus
Eingabe:
- Erste Zeile: Rechteckbreite als Ganzzahl (z. B.
8) - Zweite Zeile: Rechteckhöhe als Ganzzahl (z. B.
5) - Dritte Zeile: Quadratseitenlänge als Ganzzahl (z. B.
6) - Vierte Zeile: Auswahl als Ganzzahl, entweder 1 oder 2 (z. B.
1)
Ausgabe:
- Wenn die Auswahl 1 ist:
Rectangle area: [area] - Wenn die Auswahl 2 ist:
Square area: [area]
Spickzettel
Structs können als Parameter an Funktionen übergeben und von Funktionen zurückgegeben werden.
Um ein Struct an eine Funktion zu übergeben, geben Sie es als Parameter an:
fn calculate_area(rect: Rectangle) -> i32 {
rect.width * rect.height
}Um ein Struct von einer Funktion zurückzugeben, geben Sie den Struct-Typ als Rückgabetyp an:
fn create_square(size: i32) -> Rectangle {
Rectangle {
width: size,
height: size,
}
}Greifen Sie innerhalb von Funktionen mithilfe der Punktnotation auf Struct-Felder zu. Die Verwendung von Structs mit Funktionen ermöglicht es Ihnen, zusammengehörige Daten zu gruppieren, anstatt mehrere einzelne Parameter zu übergeben.
Probier es selbst
use std::io;
// TODO: Definiere hier das Rectangle-Struct
// TODO: Definiere hier die Funktion calculate_area
// TODO: Definiere hier die Funktion create_square
fn main() {
// Rechteckbreite einlesen
let mut width_input = String::new();
io::stdin().read_line(&mut width_input).expect("Failed to read line");
let width: i32 = width_input.trim().parse().expect("Invalid input");
// Rechteckhöhe einlesen
let mut height_input = String::new();
io::stdin().read_line(&mut height_input).expect("Failed to read line");
let height: i32 = height_input.trim().parse().expect("Invalid input");
// Quadratseitenlänge einlesen
let mut side_input = String::new();
io::stdin().read_line(&mut side_input).expect("Failed to read line");
let side: i32 = side_input.trim().parse().expect("Invalid input");
// Auswahl einlesen
let mut choice_input = String::new();
io::stdin().read_line(&mut choice_input).expect("Failed to read line");
let choice: i32 = choice_input.trim().parse().expect("Invalid input");
// TODO: Schreibe deinen Code unten
// Erstelle eine Rectangle-Instanz, prüfe die Auswahl und berechne die entsprechende Fläche
// Ergebnis basierend auf der Auswahl ausgeben
// Verwende: println!("Rectangle area: {}", area); oder println!("Square area: {}", area);
}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 Code