Verständnis von @ in Rust: Bewährte Verfahren und Anwendungsfälle
Daniel Hayes
Full-Stack Engineer · Leapcell

Das @
-Symbol in Rust bietet eine leistungsstarke Funktion für Pattern Matching, die Variablenbindungen flexibler und ausdrucksstärker macht. Dieser Artikel führt anhand von Beispielen in die grundlegende Verwendung ein und befasst sich mit den Anwendungen in komplexen Szenarien, einschliesslich Leistungsüberlegungen und bewährten Verfahren.
Binden von Enum-Variantenwerten
Betrachten Sie eine Enum, die HTTP-Statuscodes darstellt:
#[derive(Debug)] enum HttpStatus { Ok, NotFound, Unauthorized, Unknown(u16), // Unknown status code } let status = HttpStatus::Unknown(501); match status { HttpStatus::Ok => println!("Anfrage erfolgreich"), code @ HttpStatus::Unknown(_) => { println!("Unbekannter Statuscode gefunden: {:?}", code); } _ => println!("Ein anderer Status"), }
In diesem Beispiel verwenden wir @
, um die übereinstimmende HttpStatus::Unknown
-Variante an die Variable code
zu binden, sodass wir sie in der Druckanweisung verwenden können.
Der Teil code @
bindet den gesamten übereinstimmenden Enum-Wert an die Variable code
, sodass wir später im Block auf code
verweisen können. Wenn status
eine Unknown
-Variante ist, wird der Druckvorgang unabhängig von ihrem internen Wert ausgeführt und code
angezeigt, der Unknown
und seinen zugehörigen Wert enthält.
Matchen von Bereichen und Binden von Werten
Das @
-Symbol ist auch nützlich, wenn Werte innerhalb eines Bereichs abgeglichen werden und der übereinstimmende Wert innerhalb des Zweigs verwendet werden muss:
let number = 9; match number { n @ 1..=10 => println!("Die Zahl {} liegt zwischen 1 und 10", n), _ => println!("Die Zahl liegt nicht im Bereich von 1 bis 10"), }
Dieses Beispiel zeigt, wie geprüft wird, ob eine Zahl im Bereich von 1 bis 10 liegt, und sie entsprechend ausgegeben wird.
Destrukturieren von Strukturen beim Binden der gesamten Struktur
Wenn Sie einen Teil einer Struktur destrukturieren und gleichzeitig einen Verweis auf die gesamte Struktur während des Pattern Matching beibehalten müssen, ist das @
-Symbol besonders nützlich:
#[derive(Debug)] struct Point { x: i32, y: i32, } let point = Point { x: 0, y: 7 }; match point { p @ Point { x, y: 0..=10 } => { println!("Punkt liegt im Bereich, x: {}, y: {}. Punkt: {:?}", x, p.y, p); } _ => println!("Punkt liegt außerhalb des Bereichs"), }
Hier gleicht Point { x, y: 0..=10 } @ p
nicht nur einen Punkt ab, bei dem y
zwischen 0 und 10 liegt, sondern ermöglicht uns auch, auf die gesamte Point
-Instanz über p
zu verweisen.
Verwenden von @
in Match Guards
Das @
-Symbol kann auch mit Match Guards (den Bedingungen nach if
) kombiniert werden, um eine komplexere Matching-Logik bereitzustellen:
let number = Some(42); match number { Some(n @ 40..=50) if n % 2 == 0 => println!("Die Zahl liegt im Bereich und ist gerade: {}", n), _ => println!("Die Zahl stimmt nicht überein"), }
In diesem Beispiel prüfen wir, ob number
im Bereich von 40 bis 50 liegt und gerade ist, und geben die Meldung nur aus, wenn beide Bedingungen erfüllt sind.
Fehlerbehandlung
Beim Umgang mit Operationen, die fehlschlagen könnten, kann das @
-Symbol helfen, die Fehlerbehandlungslogik zu vereinfachen:
let result: Result<i32, String> = Err("Fehler aufgetreten".to_string()); match result { Ok(number) => println!("Zahl: {}", number), Err(msg) @ err => println!("Fehler: {}", err), }
Hier verwenden wir @ err
, um die Fehlermeldung innerhalb der Err
-Variante direkt zu binden.
Leistungsüberlegungen
Die Verwendung des @
-Symbols in Rust führt in der Regel nicht zu einem signifikanten Leistungsmehraufwand, da der Rust-Compiler den Code optimiert, um unnötige Kopien zu minimieren. In Hochleistungs- oder ressourcenbeschränkten Anwendungen sollten Entwickler jedoch die Verwendung sorgfältig prüfen, insbesondere beim Pattern Matching großer Datenstrukturen.
Bewährte Verfahren und häufige Fehler
Bewährte Verfahren
- Verwenden Sie
@
nur, wenn Sie sowohl auf die gesamte Datenstruktur als auch auf ihre einzelnen Felder zugreifen müssen. - Vermeiden Sie die übermäßige Verwendung von
@
in tief verschachtelten Pattern Matches, um die Klarheit und Lesbarkeit des Codes zu erhalten.
Häufige Fehler
- Unnötige Verwendung von
@
, die zu redundantem Code führt. - Falscher Versuch,
@
auf nicht unterstützten Datentypen zu verwenden.
Wir sind Leapcell, Ihre Top-Wahl für das Hosten von Rust-Projekten.
Leapcell ist die Serverless-Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Language-Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt viele Projekte kostenlos bereit
- zahlen Sie nur für die Nutzung - keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 US-Dollar unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollständig automatisierte CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und Protokollierung für verwertbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein operativer Overhead - konzentrieren Sie sich einfach auf den Aufbau.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ