More Structs

This commit is contained in:
Daniel Kluge 2022-07-05 17:45:24 +02:00
parent b9430effb8
commit ca199c667b

View File

@ -1,5 +1,5 @@
:experimental: :experimental:
:docdatetime: 2022-07-05T17:31:22+02:00 :docdatetime: 2022-07-05T17:45:24+02:00
= Structs = 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. Unser Struct soll jetzt auch eine Funktion auf sich selbst aufrufen können.
Tatsächlich ist der sehr einfach und sehr OOPig. 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] [source, Rust]
---- ----
@ -127,11 +127,15 @@ struct Rectangle {
} }
impl Rectangle { impl Rectangle {
// Das ist eine Methode/"method"
// Erster Parameter ist &self (/&mut self) und wird aufgerufen wie folgt:
// var.area(); // var.area();
fn area(&self) -> u32 { fn area(&self) -> u32 {
self.width * self.height self.width * self.height
} }
// Das ist eine "associated function"
// Kein &self und aufgerufen wie folgt:
// Rectangle::square(5); // Rectangle::square(5);
fn square(size: u32) -> Rectangle { fn square(size: u32) -> Rectangle {
Rectangle { Rectangle {
@ -152,6 +156,11 @@ impl Rectangle {
fn same_area(first: &Rectangle, second: &Rectangle) -> bool { fn same_area(first: &Rectangle, second: &Rectangle) -> bool {
first.area() == second.area() first.area() == second.area()
} }
// Methoden können auch wie Felder heißen
fn width(&self) -> bool {
self.width > 0
}
} }
fn main() { fn main() {
@ -169,3 +178,33 @@ fn main() {
println!("{}", Rectangle::same_area(&rect1, &rect2)); // true 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!
}
----