diff --git a/diaries/rust/03 - Concepts.adoc b/diaries/rust/03 - Concepts.adoc index bb13543..b2b80ca 100644 --- a/diaries/rust/03 - Concepts.adoc +++ b/diaries/rust/03 - Concepts.adoc @@ -1,7 +1,7 @@ :experimental: -:docdatetime: 2022-06-14T14:33:52.489Z +:docdatetime: 2022-06-17T21:46:42.272Z -= Concepts += Konzepte https://doc.rust-lang.org/book/ch03-00-common-programming-concepts.html[Link zum Buch] @@ -191,3 +191,101 @@ x[0] = 16; // x = [16, 15, 15] Im Gegensatz zu C-Arrays wird allerdings vor dem Zugriff auf das Array ein Check durchgeführt. Während C also auch außerhalb des Arrays Speicher lesen kann (mindestens theoretisch), kommt es in Rust dann zu einem Compilerfehler oder einer Runtime-Panic. + +== Funktionen + +Sind wie normale Funktionen in C auch. Keyword ist `fn`. + +Beispiel: + +[source, Rust] +---- +fn calculate_sum(a: i32, b: i32) -> i64 { + // Statements können natürlich normal genutzt werden + let c: i64 = a + b + + // Wenn das letzte Statement kein ";" am Ende hat, ist es die Rückgabe + // Quasi "return c;" + // "let ...." returnt aber nichts + // Könnte aber auch einfach nur "a + b" sein. + c +} +---- + +== Kommentare + +Schon häufiger in den Beispielen - einfach `//`. +Es gibt auch noch spezielle Docstrings, aber das kommt später. + +== Kontrollfluss +=== `if` + +- ohne runde Klammern um die Bedingung +- _immer_ geschweifte Klammern, zumindest kein Beispiel ohne +- Geht auch als short-if bei `let x = if condition { 5 } else { 6 }` +- Bedingung *muss* ein bool sein! + +=== `loop` + +- Basically ein `while (true)` +- `break` und `continue` +- Können labels haben. Dann kann `break 'label` genutzt werden + +Beispiel für labels: + +[source, Rust] +---- +fn main() { + 'outer: loop { + let mut a = 1; + loop { + a += 1; + if a == 10 { + break 'outer; + } + } + } +} +---- + +==== Ergebnis aus der Loop + +`break` mit Wert ist Rückgabe. +Einfaches Beispiel: + +[source, Rust] +---- +fn main() { + let mut counter = 0; + + let result = loop { + counter += 1; + + if counter == 10 { + break counter * 2; + } + }; + + println!("{}", result); // 20 +} +---- + +=== `while` + +- nutzt auch keine runden Klammern +- sonst normal + +=== `for` + +Looped durch eine Collection (wie in Python). + +[source, Rust] +---- +fn main() { + let a = [10, 20, 30, 40, 50]; + + for element in a { + println!("{}", element); + } +} +---- \ No newline at end of file diff --git a/list.json b/list.json index 39b2dd5..01992a5 100644 --- a/list.json +++ b/list.json @@ -39,7 +39,7 @@ { "title": "00 - Hello World", "filename": "00 - Hello World"}, { "title": "01 - Cargo", "filename": "01 - Cargo"}, { "title": "02 - Higher-Lower-Game", "filename": "02 - Higher-Lower-Spiel"}, - { "title": "03 - Konzepte", "filename": "03 - Concepts"} + { "title": "03 - Cheatsheet", "filename": "03 - Concepts"} ] } ] \ No newline at end of file