More Structs
This commit is contained in:
parent
b9430effb8
commit
ca199c667b
@ -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!
|
||||||
|
}
|
||||||
|
----
|
||||||
|
Loading…
Reference in New Issue
Block a user