rust / intermediate
Snippet
Const Generics: Kompilierzeit Array-Dimensionen
Const Generics ermöglichen die Verwendung von Konstanten als Typparameter und ermöglichen so Typen, die zur Kompilierzeit parametrisiert sind. Im Gegensatz zu C++-Templates mit Nicht-Typ-Parametern validiert Rust alle const-generic Grenzen zur Kompilierzeit. Dies ist besonders leistungsstark für Zero-Cost Abstraktionen bei Array-Handhabung, vermeidet Heap-Allokationen und ermöglicht dem Compiler eine vollständige Optimierung des Codes. Das Matrix-Beispiel zeigt, wie man eine generische Struktur für Arrays fester Größe erstellt, bei der Dimensionen Teil der Typsignatur sind, was es unmöglich macht, zur Kompilierzeit mismatched Matrix-Operationen zu erstellen.
snippet.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use std::fmt::Display;struct Matrix<T, const ROWS: usize, const COLS: usize> {data: [[T; COLS]; ROWS],}impl<T: Default + Copy, const ROWS: usize, const COLS: usize> Matrix<T, ROWS, COLS> {fn new() -> Self {Self { data: [[T::default(); COLS]; ROWS] }}fn get(&self, row: usize, col: usize) -> Option<&T> {if row < ROWS && col < COLS {Some(&self.data[row][col])} else {None}}}fn main() {let mat: Matrix<i32, 3, 4> = Matrix::new();println!("{:?}", mat.get(1, 2));}
Erklärung
1
struct Matrix<T, const ROWS: usize, const COLS: usize>
Generische Struktur mit zwei const-generic Parametern für Dimensionen
2
data: [[T; COLS]; ROWS]
Verschachtelter Array-Typ: Array von ROWS Elementen, jedes ist [T; COLS]
3
fn get(&self, row: usize, col: usize) -> Option<&T>
Bounds-geprüfter Accessor, der Option zurückgibt um ungültige Indizes sicher zu behandeln