PR3-Rust-SS26/B-basics/10-funktionen.rs

79 lines
2.1 KiB
Rust

#[allow(dead_code)]
fn main() {
// Das ist die Main Funktion
// Diese Funktion wird beim Aufruf von rust-script und von cargo run ausgeführt
println!("{:?}", add(400, 20));
odd(67);
random_ausgabe();
// Durch STRUCTNAME::METHODENNAME() können die Funktionen aufgerufen werden, bspw ein Konstruktor um ein neues Struct zu erzeugen
let mut r = Rechteck::new(400.0, 20.0);
r.skalieren(4.0);
println!("{:?}", r.flaeche());
use Arbeit::*; // Use dafür, damit man nicht immer Arbeit:: schreiben muss
let person = Arbeitnehmer;
inspect(person);
}
// Das ist eine Funktion, die ein Integer zurückgibt, Parameter können in die Klammern geschrieben werden
// Der zurückgebende Typ wird nach einem -> geschrieben
fn add(a: i32, b: i32) -> i32 {
a + b // implizites return aka wenn der letzte Ausdruck einer Methode kein ; und kein return hat, wird dieses returnt
}
// Diese Funktion hat auch einen Rückgabewert, und zwar den Unit Typ "()"
fn odd(a: i32) -> () {
if a % 2 == 1 {
println!("Ist ungerade");
} else {
println!("Ist gerade");
}
}
// Man kann das -> auch weglassen, dann wird automatisch die Unit zurückgegeben
fn random_ausgabe() {
println!("Funktion ohne Parameter und \"ohne\" Rückgabewert");
}
struct Rechteck {
hoehe: f64,
breite: f64,
}
// Ein impl, damit der Struct nicht ohne Nutzen ist
impl Rechteck {
// Self (mit GROßEM S) == Klassenname in Java
fn new(breite: f64, hoehe: f64) -> Self {
Rechteck {
breite: breite,
hoehe: hoehe,
} // wieder implizit
}
// Aufruf durch referenz.flaeche
// self (mit KLEINEM s) == this in Java
fn flaeche(&self) -> f64 {
self.hoehe * self.breite // auch implizit
}
fn skalieren(&mut self, s: f64) {
self.hoehe *= s;
self.breite *= s;
}
}
enum Arbeit {
Arbeitnehmer,
Arbeitgeber,
Selbstaendiger,
}
fn inspect(person: Arbeit) {
match person {
Arbeit::Arbeitnehmer => println!("Grrr, Chefs"),
_ => println!("Grrr, Steuern"),
}
}