capypad
0 Tage Serie
rust / intermediate
Snippet

Newtype Pattern: Typsichere Einheits-Wrapper

Das Newtype Pattern umschließt primitive Typen in Tuple-Structs um verschiedene Typen mit null Laufzeitkosten zu erstellen. Dies bietet Kompilierzeit-Einheitsprüfung—Rust weigert sich, Kilogramm zu akzeptieren wo Meter erwartet werden. Der Wrapper hat das gleiche Speicherlayout wie der innere Typ, wird aber vom Compiler als völlig anderer Typ behandelt. Dieses Pattern wird extensiv in Physik-Bibliotheken, Finanzanwendungen (Money-Typen) und überall dort verwendet, wo Typsicherheit über Primitive hinaus benötigt wird.

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
25
struct Meters(u64);
struct Seconds(u64);
struct Kilograms(u64);
 
impl Meters {
fn new(val: u64) -> Self { Meters(val) }
fn as_u64(&self) -> u64 { self.0 }
}
 
impl Seconds {
fn new(val: u64) -> Self { Seconds(val) }
fn as_u64(&self) -> u64 { self.0 }
}
 
fn calculate_speed(distance: Meters, time: Seconds) -> f64 {
if time.as_u64() == 0 { return 0.0; }
distance.as_u64() as f64 / time.as_u64() as f64
}
 
fn main() {
let distance = Meters::new(100);
let time = Seconds::new(10);
let speed = calculate_speed(distance, time);
println!("Speed: {} m/s", speed);
}
Erklärung
1
struct Meters(u64)
Tuple-Struct das u64 umschließt—vollständig distinkter Typ von u64 und anderen Wrappern
2
fn calculate_speed(distance: Meters, time: Seconds)
Funktionssignatur erzwingt korrekte Einheiten zur Kompilierzeit—Einheiten sind Teil des Typs