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.