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
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()); // 50let sq = Rectangle::square(4);println!("Square area: {}", sq.area()); // 16let 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