diff --git a/diaries/rust/05 - Structs.adoc b/diaries/rust/05 - Structs.adoc index f90b226..6c3fdb9 100644 --- a/diaries/rust/05 - Structs.adoc +++ b/diaries/rust/05 - Structs.adoc @@ -1,5 +1,5 @@ :experimental: -:docdatetime: 2022-07-05T17:31:22+02:00 +:docdatetime: 2022-07-05T17:45:24+02:00 = Structs @@ -117,7 +117,7 @@ Man kann sogar ein Statement da rein packen (also zum Beispiel `30 * x`) und bek Unser Struct soll jetzt auch eine Funktion auf sich selbst aufrufen können. Tatsächlich ist der sehr einfach und sehr OOPig. -Die folgenden Beispiele sollten relativ viel erklären. +Die folgenden Beispiele sollten relativ viel erklären: [source, Rust] ---- @@ -127,11 +127,15 @@ struct Rectangle { } impl Rectangle { + // Das ist eine Methode/"method" + // Erster Parameter ist &self (/&mut self) und wird aufgerufen wie folgt: // var.area(); fn area(&self) -> u32 { self.width * self.height } + // Das ist eine "associated function" + // Kein &self und aufgerufen wie folgt: // Rectangle::square(5); fn square(size: u32) -> Rectangle { Rectangle { @@ -152,6 +156,11 @@ impl Rectangle { fn same_area(first: &Rectangle, second: &Rectangle) -> bool { first.area() == second.area() } + + // Methoden können auch wie Felder heißen + fn width(&self) -> bool { + self.width > 0 + } } fn main() { @@ -169,3 +178,33 @@ fn main() { println!("{}", Rectangle::same_area(&rect1, &rect2)); // true } ---- + +=== `&mut self` + +Eine Methode kann auch `&mut self` als ersten Parameter haben. +Dann können auch Felder geschrieben werden. In diesem Fall werden Referenzen aber invalidiert! + +[source, Rust] +---- +struct Rectangle { + width: u32, + height: u32, +} + +impl Rectangle { + fn change_width(&mut self, width: u32) { + self.width = width; + } +} + +fn main() { + let mut rect1 = Rectangle { + width: 12, + height: 3, + }; + let ref1 = &rect1; + rect1.change_width(5); + + println!("{}", ref1.width); // <- geht nicht! +} +----