rust / intermediate
Snippet
Const Generics: Kompilierzeit-Generics
Const Generics ermöglichen es, Typen durch konstante Werte zu parametrisieren, nicht nur durch Typen. Dies ermöglicht array-basierte Datenstrukturen mit kompilierzeitbekannten Dimensionen. Der Compiler kann besser optimieren, da Array-Größen zum Kompilierzeitpunkt bekannt sind, was Stack-Allokation statt Heap ermöglicht.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
struct Matrix<T, const N: usize, const M: usize> {data: [[T; M]; N],}impl<T, const N: usize, const M: usize> Matrix<T, N, M> {fn new(value: T) -> Selfwhere T: Default + Copy {Matrix { data: [[value; M]; N] }}fn get(&self, i: usize, j: usize) -> Option<&T> {if i < N && j < M {Some(&self.data[i][j])} else {None}}}fn smallest<T: PartialOrd + Copy, const N: usize>(arr: &[T; N]) -> T {let mut smallest = arr[0];let mut i = 1;while i < N {if arr[i] < smallest {smallest = arr[i];}i += 1;}smallest}fn main() {let m: Matrix<i32, 2, 3> = Matrix::new(0);if let Some(val) = m.get(1, 2) {println!("Value at [1,2]: {}", val);}let arr = [3, 1, 4, 1, 5];println!("Smallest: {}", smallest(&arr)); // 1}
Erklärung
1
const N: usize, const M: usize
Const-Generic-Parameter für Matrix-Dimensionen
2
[[T; M]; N]
2D-Array mit N Zeilen von M-Element-Arrays
3
let arr = [3, 1, 4, 1, 5];
Kompilierzeit-Array-Größe mit const-generischer Funktion verwendet
4
smallest(&arr)
Array-Größe abgeleitet und als Kompilierzeitkonstante übergeben