Rust 1.41 ist großzügiger beim Implementieren von Traits
Neben entspannteren Regeln für Traits bringt die Programmiersprache Änderungen im Crate-Management.
by Rainald Menge-SonnentagDie Rust-Community hat Version 1.41 der Programmiersprache fertiggestellt. Nachdem das vorherige Release im Dezember einige umfangreichere Neuerungen mitgebracht hat, beschränkt sich das aktuelle auf wenige Anpassungen und verzichtet auf neue Sprachkonstrukte. Nennenswert sind der gelockerte Umgang mit implementierten Traits, bessere Pointer-Kompatibilität im Zusammenspiel mit C und ein angepasstes Format für die Cargo.lock-Datei.
Lokal oder nicht lokal? Manchmal egal!
Rust erlaubt das Erweitern von Typen um Methoden durch das Implementieren von Traits. Auf die Weise lassen sich unter anderem für generische Typen Promises für später definierte Methoden umsetzen. Bisher galt die sogenannte Orphan Rule (Waisenregel), die das Implementieren verbietet, wenn sowohl der Typ als auch das zu implementierende Trait extern sind. Der Name der Regel ergibt sich daher, dass in dem Fall beide Eltern nicht lokal vorhanden sind.
Die Orphan Rule soll sicherstellen, dass eingebundener fremder Code nicht zu Fehler im eigenen führt, wenn Traits beziehungsweise Typen doppelt verfügbar sind. Nach Ansicht der Rust-Entwickler war die Regel jedoch strenger als erforderlich. Sie verbietet unter anderem folgende Implementierung:
impl<T> From<BetterVec<T>> for Vec<T> {
// ...
}
Grund dafür ist, dass sowohl From
als auch Vec
in der Standard-Library von Rust definiert und somit extern sind. Rust 1.41 erlaubt diese Form der Anwendung jedoch, da das Trait From
durch einen loaklen Typ parametrisiert ist. Eine Beschreibung der Anpassung findet sich auf GitHub. Eine ausführliche Erläuterung ist unter dem Rust-RFC #2451 (Request for Comments) im Rust RFC Book zu finden.
Bessere Struktur im Frachtraum
Für den Paketmanager Cargo gibt es zwei Neuerungen in Rust 1.41. Zum einen aktualisiert er beim Ausführen von cargo install
Crates (Rust-Pakete), wenn sie bereits lokal vorhanden sind, aber das neu zu installierende Paket aktueller ist. Bisher war dafür der Parameter --force
zum neuen Installieren der Crates erforderlich.
Zum anderen bringt die Datei Cargo.lock
im aktuellen Release ein neues Format mit. Die Datei enthält Informationen über Dependencies und soll konsistente Build-Prozesse sicherstellen. Das bisherige Format konnte unter Umständen zu Merge-Konflikten führen, was das neue Format verhindern soll.
Zeigeraustausch mit C
Eine weitere Neuerung ist, dass die Pointer Box<T>
nun ABI-kompatibel (Application Binary Interface) zu Pointern in C sind, wenn T
eine feste Größe hat, also vom Type T: Sized
ist.
Dabei gelten weiterhin die Rust-spezifischen Einschränkungen für die Pointer: Sie dürfen nicht Null sein und müssen aneinandergereiht (aligned) sowie auf die Freigabe durch den Global Allocator vorbereitet sein. Die Rust-Entwickler raten zudem explizit davon ab, Box<T>
für Funktionen zu verwenden, die in C definiert sind und deren Aufruf in Rust erfolgt.
Weitere Details zu Rust 1.41, darunter einige Ergänzung der Standard-Library, finden sich im Rust-Blog. Auf der Tools-Seite findet sich ein Installationswerkzeug für Rust. Das Repository auf GitHub enthält zudem unter anderem den Sourcecode für den Compiler und die Standardbibliothek sowie eine Dokumentation. Der Blog-Beitrag weist erneut auf die Anfang des Jahres angekündigte reduzierte Unterstützung für 32-Bit-Apple-Plattformen hin. (rme)