Rust Basics
Generische Typen
Erstellen Sie eine Struktur, bei der einer ihrer Werte jeden beliebigen Typ haben kann.
Option, Some & None
Der Option-Typ bedeutet, dass der Wert entweder vom Typ Some (es gibt etwas) oder None sein kann:
Du kannst Funktionen wie is_some()
oder is_none()
verwenden, um den Wert der Option zu überprüfen.
Makros
Makros sind mächtiger als Funktionen, da sie sich erweitern, um mehr Code zu erzeugen als der Code, den du manuell geschrieben hast. Zum Beispiel muss eine Funktionssignatur die Anzahl und den Typ der Parameter angeben, die die Funktion hat. Makros hingegen können eine variable Anzahl von Parametern entgegennehmen: Wir können println!("hello")
mit einem Argument aufrufen oder println!("hello {}", name)
mit zwei Argumenten. Außerdem werden Makros vor der Interpretation des Codes durch den Compiler erweitert, sodass ein Makro beispielsweise ein Trait für einen bestimmten Typ implementieren kann. Eine Funktion kann das nicht, da sie zur Laufzeit aufgerufen wird und ein Trait zur Kompilierungszeit implementiert werden muss.
Iterieren
In Rust gibt es verschiedene Möglichkeiten, um über eine Sammlung von Elementen zu iterieren. Das for
-Schleifenkonstrukt ist eine der häufigsten Methoden, um dies zu tun. Es kann verwendet werden, um über Arrays, Vektoren, Slices und andere Sammlungen zu iterieren.
Dieser Code iteriert über das Array numbers
und gibt jedes Element aus. Die iter()
-Methode wird auf dem Array aufgerufen, um einen Iterator zu erhalten, der über die Elemente des Arrays läuft.
Eine andere Möglichkeit, über eine Sammlung zu iterieren, besteht darin, die enumerate()
-Methode zu verwenden. Diese Methode gibt ein Tupel zurück, das den Index und das Element enthält.
Dieser Code gibt sowohl den Index als auch das Element jedes Elements im Array numbers
aus.
Es gibt auch andere Iteratormethoden wie map()
, filter()
und fold()
, die verwendet werden können, um Transformationen und Filterungen auf den Elementen einer Sammlung durchzuführen.
Dieser Code verdoppelt jedes Element im Array numbers
und speichert die verdoppelten Zahlen in einem Vektor. Der map()
-Operator wird verwendet, um die Verdopplung durchzuführen, und die collect()
-Methode wird verwendet, um die Ergebnisse in einem Vektor zu sammeln.
Die Iteration über eine Sammlung in Rust ist einfach und flexibel, und die verschiedenen Iteratormethoden bieten eine Vielzahl von Möglichkeiten zur Transformation und Filterung von Daten.
Rekursive Box
Eine rekursive Box ist eine Technik, bei der eine Box in einer Box verschachtelt wird, um eine Kette von Aktionen auszuführen. Dies wird oft verwendet, um komplexe Aufgaben zu automatisieren oder um wiederholte Aktionen auf mehreren Ebenen durchzuführen.
Die rekursive Box kann verwendet werden, um eine Reihe von Befehlen oder Aktionen auszuführen, indem sie sich selbst aufruft. Dies ermöglicht es, dass eine Aktion wiederholt ausgeführt wird, bis eine bestimmte Bedingung erfüllt ist oder ein bestimmtes Ergebnis erzielt wird.
Die rekursive Box kann auch verwendet werden, um eine Hierarchie von Aktionen zu erstellen, bei der jede Aktion eine andere Aktion aufruft. Dies ermöglicht es, komplexe Aufgaben in kleinere, leichter zu handhabende Schritte zu unterteilen.
Die Verwendung einer rekursiven Box erfordert ein gutes Verständnis der Programmierung und der Logik, um sicherzustellen, dass die rekursive Funktion ordnungsgemäß funktioniert und nicht in einer Endlosschleife stecken bleibt.
Es ist wichtig, die Abbruchbedingung sorgfältig zu definieren, um sicherzustellen, dass die rekursive Box nicht unendlich weiterläuft. Eine schlecht definierte Abbruchbedingung kann zu einem Absturz des Systems oder zu unerwünschten Ergebnissen führen.
Die rekursive Box ist eine leistungsstarke Technik, die in verschiedenen Bereichen der Softwareentwicklung und des Hackings eingesetzt werden kann. Sie ermöglicht die Automatisierung von Aufgaben und die effiziente Verarbeitung von Daten.
if
Die if
-Anweisung wird verwendet, um eine Bedingung zu überprüfen und Code auszuführen, wenn die Bedingung wahr ist. Der Code innerhalb der if
-Anweisung wird nur ausgeführt, wenn die Bedingung erfüllt ist.
Die Syntax für die if
-Anweisung in Rust ist wie folgt:
Hier ist ein Beispiel:
In diesem Beispiel wird der Code innerhalb der if
-Anweisung nur ausgeführt, wenn die Variable zahl
größer als 0 ist.
Übereinstimmung
Die match
-Anweisung in Rust ermöglicht es, einen Wert mit verschiedenen Mustern zu vergleichen und entsprechende Aktionen auszuführen, basierend auf dem übereinstimmenden Muster. Es ähnelt dem switch
-Statement in anderen Programmiersprachen.
Die Syntax für match
sieht folgendermaßen aus:
Hier sind einige wichtige Punkte zu beachten:
Jedes Muster kann entweder ein Wert, eine Variable oder ein Platzhalter sein.
Das
_
-Muster wird als Platzhalter verwendet, um alle anderen Fälle abzudecken, die nicht explizit angegeben sind.Die Aktionen für jedes Muster werden in geschweiften Klammern
{}
definiert.Nachdem eine Aktion ausgeführt wurde, wird die
match
-Anweisung beendet.
Die match
-Anweisung ist eine leistungsstarke Möglichkeit, verschiedene Fälle zu behandeln und den Code lesbarer zu machen. Es ist besonders nützlich, wenn Sie mit Enumerationen arbeiten, da Sie alle möglichen Varianten abdecken können.
Schleife (unendlich)
Eine unendliche Schleife ist eine Schleife, die ohne eine Bedingung, die sie beendet, immer wieder ausgeführt wird. Dies kann nützlich sein, um bestimmte Aufgaben kontinuierlich auszuführen, wie z.B. das Überwachen von Ereignissen oder das Warten auf bestimmte Bedingungen.
In Rust kann eine unendliche Schleife mit dem Schlüsselwort loop
erstellt werden. Der Code innerhalb der Schleife wird immer wieder ausgeführt, bis er explizit unterbrochen wird. Dies kann durch die Verwendung von break
erreicht werden, um die Schleife zu verlassen, oder durch die Verwendung von return
, um die Funktion zu verlassen, in der sich die Schleife befindet.
Hier ist ein Beispiel für eine unendliche Schleife in Rust:
Es ist wichtig, sicherzustellen, dass es eine Möglichkeit gibt, die Schleife zu beenden, da sonst das Programm in einer Endlosschleife stecken bleiben kann.
während
The while
statement is used in Rust to create a loop that continues executing as long as a certain condition is true. It is a control flow construct that allows you to repeat a block of code multiple times.
Die while
Anweisung wird in Rust verwendet, um eine Schleife zu erstellen, die so lange ausgeführt wird, wie eine bestimmte Bedingung wahr ist. Es handelt sich um eine Kontrollflusskonstruktion, die es ermöglicht, einen Codeblock mehrmals zu wiederholen.
für
Variables
Declaration
Mutable
Constants
Data Types
Integer
Unsigned Integer
Floating Point
Boolean
Character
String
Operators
Arithmetic
Comparison
Logical
Assignment
Control Flow
If-else
Loop
While
For
Functions
if let
Die if let
-Anweisung in Rust ermöglicht es, ein Muster mit einem Wert zu vergleichen und den Codeblock auszuführen, wenn das Muster übereinstimmt. Es ist eine verkürzte Schreibweise für das match
-Statement, das nur einen Fall abdeckt.
Die Syntax für if let
ist wie folgt:
Hier ist ein Beispiel, um das Konzept zu verdeutlichen:
In diesem Beispiel wird überprüft, ob value
den Wert Some
enthält. Wenn ja, wird der Wert in x
gebunden und der Codeblock innerhalb des if let
-Statements wird ausgeführt. In diesem Fall wird "Der Wert ist: 5" gedruckt.
Die if let
-Anweisung ist besonders nützlich, wenn Sie nur an einem bestimmten Fall interessiert sind und nicht alle möglichen Fälle abdecken müssen. Es kann den Code lesbarer machen, indem es unnötige Verzweigungen vermeidet.
while let
Die while let
-Schleife ist eine spezielle Art der while
-Schleife in Rust, die verwendet wird, um eine Schleife auszuführen, solange ein bestimmtes Pattern mit einem Wert übereinstimmt.
Die Syntax für die while let
-Schleife ist wie folgt:
Hier ist eine kurze Erklärung, wie die while let
-Schleife funktioniert:
Die
expression
wird ausgewertet.Wenn das Pattern mit dem Wert der
expression
übereinstimmt, wird der Code innerhalb der Schleife ausgeführt.Nachdem der Code ausgeführt wurde, wird die
expression
erneut ausgewertet.Wenn das Pattern immer noch mit dem Wert der
expression
übereinstimmt, wird der Code erneut ausgeführt.Dieser Vorgang wird wiederholt, bis das Pattern nicht mehr mit dem Wert der
expression
übereinstimmt.
Die while let
-Schleife ist besonders nützlich, wenn Sie eine Schleife ausführen möchten, solange ein bestimmtes Pattern mit einem Wert übereinstimmt, und Sie den Wert innerhalb der Schleife verwenden möchten.
Traits
Eine neue Methode für einen Typen erstellen
Tests
Tests sind ein wesentlicher Bestandteil der Softwareentwicklung. Sie dienen dazu, die Funktionalität und Korrektheit des Codes zu überprüfen. In Rust können Tests mit der #[test]
-Annotation geschrieben werden. Diese Annotation kennzeichnet eine Funktion als Testfunktion. Um die Tests auszuführen, kann das cargo test
-Kommando verwendet werden.
Einfacher Test
Ein einfacher Test in Rust könnte wie folgt aussehen:
In diesem Beispiel wird die Funktion test_addition
als Testfunktion markiert. Die assert_eq!
-Makro wird verwendet, um zu überprüfen, ob die Addition von 2 und 2 gleich 4 ergibt. Wenn der Test erfolgreich ist, wird keine Ausgabe erzeugt. Wenn der Test fehlschlägt, wird eine Fehlermeldung angezeigt.
Testergebnisse
Beim Ausführen von Tests gibt Rust Informationen über die Anzahl der Tests, die erfolgreich waren, die fehlgeschlagen sind und die übersprungen wurden. Diese Informationen werden in einer übersichtlichen Zusammenfassung angezeigt.
Testabdeckung
Rust bietet auch die Möglichkeit, die Testabdeckung zu überprüfen. Mit dem --coverage
-Flag kann das cargo test
-Kommando ausgeführt werden, um Informationen über den Prozentsatz des Codes anzuzeigen, der von den Tests abgedeckt wird.
Testorganisation
Um den Code besser zu organisieren, können Tests in separate Module gruppiert werden. Dies kann mit dem mod
-Schlüsselwort erreicht werden. Hier ist ein Beispiel:
In diesem Beispiel werden die Tests für die Addition und Subtraktion in einem separaten Modul namens math
gruppiert. Dies erleichtert die Organisation und Lesbarkeit des Codes.
Testfixtures
Manchmal ist es erforderlich, vor jedem Test bestimmte Vorbereitungen zu treffen. Dies kann mit Testfixtures erreicht werden. Testfixtures sind Funktionen, die vor oder nach jedem Test ausgeführt werden. Sie können verwendet werden, um beispielsweise Datenbankverbindungen herzustellen oder Testdaten zu initialisieren.
In diesem Beispiel wird die Funktion setup
vor jedem Test und die Funktion teardown
nach jedem Test ausgeführt. Dadurch können spezifische Vorbereitungen und Aufräumarbeiten durchgeführt werden, um sicherzustellen, dass die Tests in einer sauberen Umgebung ausgeführt werden.
Testparameter
Manchmal ist es nützlich, Tests mit verschiedenen Parametern auszuführen. Dies kann mit Testparametern erreicht werden. Testparameter sind Funktionen, die als Parameter an Testfunktionen übergeben werden. Dadurch können Tests mit verschiedenen Eingabewerten ausgeführt werden.
In diesem Beispiel wird die Funktion get_params
verwendet, um eine Liste von Parametern zurückzugeben. Die Testfunktion test_with_parameter
wird dann für jeden Parameter in der Liste ausgeführt. Dadurch können Tests mit verschiedenen Eingabewerten durchgeführt werden.
Threading
Arc
Ein Arc kann Clone verwenden, um weitere Referenzen auf das Objekt zu erstellen und sie an die Threads zu übergeben. Wenn der letzte Referenzzeiger auf einen Wert außerhalb des Gültigkeitsbereichs liegt, wird die Variable verworfen.
Threads
In diesem Fall übergeben wir dem Thread eine Variable, die er ändern kann.
Last updated