capypad
0 Tage Serie
rust / intermediate
Snippet

Assoziierte Typen in Traits

Assoziierte Typen ermöglichen es Ihnen, Platzhaltertypen innerhalb eines Traits zu definieren, die implementierende Typen angeben müssen. Im Gegensatz zu generischen Typparametern erzwingen assoziierte Typen einen einzelnen konkreten Typ pro Implementierung. Dieses Muster ist nützlich, wenn ein Trait eine Familie von Operationen repräsentiert, bei denen der Ausgabetyp von der Implementierung abhängt.

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
26
27
28
29
30
31
32
33
trait Operation {
type Output;
fn execute(&self, value: i32) -> Self::Output;
}
 
struct Double;
 
impl Operation for Double {
type Output = i64;
fn execute(&self, value: i32) -> Self::Output {
(value * 2) as i64
}
}
 
struct AddFive;
 
impl Operation for AddFive {
type Output = String;
fn execute(&self, value: i32) -> Self::Output {
format!("Result: {}", value + 5)
}
}
 
fn main() {
let ops: Vec<Box<dyn Operation<Output = i64>>> = vec![Box::new(Double)];
for op in ops {
println!("{}", op.execute(10));
}
}
Erklärung
1
trait Operation {
Definiert ein Trait mit einem assoziierten Typ Output
2
type Output;
Platzhaltertyp, den implementierende Structs angeben müssen
3
struct Double;
Eine konkrete Implementierung, die Output auf i64 setzt
4
type Output = i64;
Output-Typ ist explizit i64 für die Double-Implementierung
5
struct AddFive;
Andere Implementierung mit String als Output-Typ
6
type Output = String;
Unterschiedlicher Ausgabetyp pro Implementierung zeigt Flexibilität
7
Vec<Box<dyn Operation<Output = i64>>>
Homogene Sammlung erfordert übereinstimmende Output-Typen