capypad
0 Tage Serie
rust / intermediate
Snippet

Struct-Methoden mit Impl

impl-Blöcke definieren Methoden auf Structs. &self borgt das Struct unveränderlich, &mut self borgt veränderlich, und kein self erzeugt eine assoziierte Funktion (Konstruktor). Self bezieht sich auf den implementierenden Typ. New ist eine Konvention für Konstruktoren, und square demonstriert ein statisches Fabrik-Methoden-Pattern.

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
34
35
struct Rectangle {
width: u32,
height: u32,
}
 
impl Rectangle {
fn new(width: u32, height: u32) -> Self {
Rectangle { width, height }
}
fn area(&self) -> u32 {
self.width * self.height
}
fn scale(&mut self, factor: u32) {
self.width *= factor;
self.height *= factor;
}
fn square(size: u32) -> Self {
Self { width: size, height: size }
}
}
 
fn main() {
let rect = Rectangle::new(10, 5);
println!("Area: {}", rect.area()); // 50
let sq = Rectangle::square(4);
println!("Square area: {}", sq.area()); // 16
let mut r = Rectangle::new(3, 3);
r.scale(2);
println!("Scaled: {}x{}", r.width, r.height); // 6x6
}
Erklärung
1
impl Rectangle { ... }
Implementierungsblock der Methoden an Rectangle-Struct anhängt
2
fn new(width: u32, height: u32) -> Self
Assoziierte Funktion (Konstruktor) gibt neue Rectangle-Instanz zurück
3
fn area(&self) -> u32
Methode die self unveränderlich borgt, Nur-Lese-Zugriff
4
fn scale(&mut self, factor: u32)
Methode die self veränderlich borgt, erlaubt Feldänderung
5
Self { width, height }
Self-Alias vermeidet Wiederholung des Struct-Namens im Konstruktor