PR3-Rust-SS26/B-basics/2-konstanten.rs

42 lines
1.8 KiB
Rust

use std::sync::Mutex;
// Globale Konstanten, können außerhalb von Funktionen deklariert werden
const ANTWORT_AUF_ALLES: i32 = 42;
// Const sind echte Konstanten, die nicht verändert werden könne und auch nicht überschattet werden können
// Dies haben keinen festen Speicherplatz, sondern werden überall eingebettet, wo diese verwendet werden
// Sie können in jedem Scope definiert werden, auch in Funktionen wie Variablen
static mut PRAESENTIERER: &str = "Semih";
// Bei static ist es anders, diese existieren genau einmal im Speicher und haben somit eine feste Speicheradresse
// Können mit mut versehen werden, diese können dann verändert werden in unsafe Blöcken
// Dies sollte eher vermieden werden, um veränderbare static Konstanten zu erzeugen sollten Mutex verwendet werden
static COUNTER: Mutex<u32> = Mutex::new(0); // Nun ist es sicher dank Mutex
fn main() {
println!("x = {ANTWORT_AUF_ALLES}");
static x: i32 = 3;
// Da static mut unsafe ist, können sie nur in solchen unsafe Blöcken verändert und gelesen werden, anders nicht
unsafe {
println!("Aktueller Präsentierer ist: {PRAESENTIERER}");
PRAESENTIERER = "Lukas";
println!("Der nächste Präsentierer ist: {PRAESENTIERER}");
}
// Das hier in Advanced
{
// Hier erstellen wir eine veränderliche Variable, die wir dannn locken, dann unwrappen, und dann um eins erhöhen können
// Für die Basics ist das zu komplex zum erklären, wir nehmen das mal so hin
// Man muss es in dem Fall nicht nochmal unlocken, dass geschieht beim Verlassen des Blocks automatisch
let mut c = COUNTER.lock().unwrap();
println!("{c}");
*c += 1;
}
{
let c = COUNTER.lock().unwrap();
println!("{c}");
}
}