capypad
0 Tage Serie
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
rust
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