0 Tage Serie
rust / expert
Snippet

Erzwingung von Array-Dimension-Grenzen zur Kompilierzeit über Const-Generics

Zeigt die Kompilierzeit-Validierung mathematischer Dimensionen mittels Const-Generics. Ungültige Matrix-Multiplikationen schlagen beim Kompilieren fehl, was Laufzeitprüfungen überflüssig macht.

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
pub struct Matrix<const ROWS: usize, const COLS: usize> {
pub data: [[f64; COLS]; ROWS],
}
impl<const ROWS: usize, const COLS: usize> Matrix<ROWS, COLS> {
pub fn multiply<const OTHER_COLS: usize>(
&self,
other: &Matrix<COLS, OTHER_COLS>
) -> Matrix<ROWS, OTHER_COLS> {
let mut result_data = [[0.0; OTHER_COLS]; ROWS];
for r in 0..ROWS {
for c in 0..OTHER_COLS {
let mut sum = 0.0;
for i in 0..COLS {
sum += self.data[r][i] * other.data[i][c];
}
result_data[r][c] = sum;
}
}
Matrix { data: result_data }
}
}
Erklärung
1
pub struct Matrix<const ROWS: usize, const COLS: usize> {
Deklariert eine generische Matrixstruktur, die durch Kompilierzeit-Ganzzahlen parametrisiert ist.
2
other: &Matrix<COLS, OTHER_COLS>
Erzwingt, dass die Spaltenanzahl der ersten Matrix mit der Zeilenanzahl der zweiten übereinstimmt.
3
-> Matrix<ROWS, OTHER_COLS> {
Berechnet und gibt die genauen resultierenden Dimensionen zurück, die vom Typsystem validiert wurden.
4
let mut result_data = [[0.0; OTHER_COLS]; ROWS];
Initialisiert den Ausgabepuffer, der basierend auf Const-Parametern dynamisch im Stack-Frame zugewiesen wird.