Control flow dari code pada rust terdapat 3 macam yaitu,
- Block if – else if – else
- Block loop, while, for
- Block match
Block if – else if – else
Syntax dasar dari block if-else
if expression {
//code goes here
}
if expression {
//code goes here
}else{
//code goes here
}
if expression {
//code goes here
} else if expression {
//code goes here
}else{
//code goes here
}
Contoh menggunakan if else block:
fn discount(num: u8) {
let amount = if num % 2 == 0{
50
} else{
10
};
println!("Nilai Diskon adalah {}", amount );
}
fn main() {
discount(10);
}
Block Loop
Perintah loop akan menjalankan block code sampai dilakukan perintah break (baik dari code atau dari keyboard).
Syntax dasar dari loop adalah
loop {
//code goes here
// if true
// break;
}
Berikut contoh code dimana kalimat Hello World akan terus dituliskan ke layar, sampai kita menekan Ctr + C.
fn main() {
loop{
println!("Hello world");
}
}
Untuk melakukan break melalui code, digunakan perintah break. Contoh code dibawah akan terus meminta input dari user, sampai dijawab dengan kata rust.
use std::io;
fn main() {
loop{
println!("Masukan kata sandi");
let mut word = String::new();
io::stdin().read_line(&mut word).expect("Failed read line");
if word.trim() == "rust"{
break;
}
}
println!("Kata sandi sudah dijawab");
}
Masukan kata sandi
sandi
Masukan kata sandi
rust
Kata sandi sudah dijawab
Block while
Syntax dasar dari while
while expression {
//code goes here
}
Kita akan tulis ulang code sandi diatas menggunakan while block.
use std::io;
fn main() {
let mut word = String::new();
while word.trim() != "rust" {
println!("Masukan kata sandi");
word = String::new();
io::stdin().read_line(&mut word).expect("Failed read line");
}
println!("Kata sandi sudah dijawab");
}
Block For
Syntax dasar dari for loop adalah
for item in collection {
//code goes here
}
Contoh for loop sebanyak 5 kali.
fn main() {
for i in 1..6{
println!("Loop ke {}", i);
}
}
Loop ke 1
Loop ke 2
Loop ke 3
Loop ke 4
Loop ke 5
Block match
Block match mirip dengan if-else atau switch-case, namun lebih baik karena menggunakan pattern matching dan exhaustiveness checking.
Berikut contohnya
fn main() {
let x = 3;
match x {
1 => println!("Satu"),
2 => println!("Dua"),
3 => println!("Tiga"),
_ => println!("Angka tidak terdeteksi"),
}
}
Yang dimaksud dengan exhaustiveness adalah, Rust akan memeriksa semua kemungkinan pattern. Berikut contoh code akan menyebabkan error karena kita tidak menyediakan semua kondisi.
fn main() {
let x = true;
let y = false;
match (x, y) {
(true, true) => println!("True All"),
(true, false) => println!("True or false"),
(false, true) => println!("True or false"),
}
}
Jika di compile, akan menampilkan error
$ cargo run
Compiling rustdasar v0.1.0 (F:\Project\rustdasar\rustdasar)
error[E0004]: non-exhaustive patterns: `(false, false)` not covered
--> src\main.rs:6:11
|
6 | match (x, y) {
| ^^^^^^ pattern `(false, false)` not covered
|
= help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms
= note: the matched value is of type `(bool, bool)`
For more information about this error, try `rustc --explain E0004`.
error: could not compile `rustdasar` due to previous error
Sampai disini kita sudah selesai mempelajari dasar-dasar penggunakan block control pada Rust.