Rust - Control Flow (Iteration/Repetition & keywords)
Tags: rust, beginners, programming, codenewbie
Published: 2021-07-01 03:25:30

Pada dasarnya, _iteration/repetition_ digunakan untuk mengulangi sebuah block kode, sesuai dengan kondisi yang diberikan.

> Semua materi merupakan rangkuman belajar.
>
> Untuk bacaan yang lebih langkap & update, dipersilahkan akses pada
> [The Book](https://doc.rust-lang.org/stable/book/ch03-05-control-flow.html)

Adapun _iteration/repetition_ meliputi

- `loop`
- `while`
- `for in`

Sekalian akan kita bahas beberapa keyword yang terdapat pada _control flow_

- `break`
- `continue`
- juga support _control flow_ label dengan `'label: `

### `loop`

Sederhananya,
`loop` adalah infinite loop/iteration/repetition,
atau apapun namanya,
yang merupakan pengulangan tanpa henti.

```rust
fn main() {
    loop {
        println!("tidur");
    }
}
```

Kode di atas, akan menampilkan kata tidur "tanpa" henti, nah kita dapat menghentikannya dengan paksa, tentu dengan `ctrl + c`.

Tapi apa di dalam program kita juga bisa menghentikannya?

Jawabannya bisa, dengan `break`.

```rust
fn main() {
    let mut piring_makan = 0;
    let harga = 15_000;

    let totalan = loop {
        piring_makan += 1;

        if piring_makan == 5 {
            break piring_makan * harga;
        }
    };

    println!("makan {} piring, masing-masing harganya {}, jumlahnya {}", piring_makan, harga, totalan);
}
```

- _loop_ tidak bisa ditempel kondisi, karenanya disebut infinite loop
- block kode yang diulangi berada dalam body, dibungkus `{ }`
- kita hanya dapat menghentikannya dari program dengan `break`.

  Tentu dengan kondisi kapan kita ingin menghentikannya.

- `break` bersifat sebagai expression, karenanya kita dapat mengembalikan nilai dari `loop`.

  Gunakan seperti halnya memakai `return` dalam _function_, perlu `;`

BTW, hasil code di atas adalah

```
makan 5 piring, masing-masing harganya 15000, jumlahnya 75000
```

### `while`

Alih alih menuliskan kondisi di dalam `loop`.
Lebih praktis menggunakan `while`.

Selain kode lebih pendek, juga lebih mudah dibaca.

```rust
fn main() {
    let mut istirahat_in_minutes = 60;

    while istirahat_in_minutes != 0 {
        println!("lanjuuut.... masih ada {} menit", istirahat_in_minutes);

        if istirahat_in_minutes == 50 {
            println!("udahan ah, banyak kerjaan");
            break;
        }

        istirahat_in_minutes -= 1;
    }

    println!("udahan bosque, kerja kerja");
}
```

- kondisi tidak perlu `( )`
- block kode yang diulangi berada dalam body, dibungkus `{ }`
- meski sudah dengan kondisi, kita tetap bisa menggunakan kondisi di dalamnya.

  Yah, barangkali kita ingin melakukan sesuatu yang lain.

- Kita masih bisa menggunakan `break` untuk menghentikannya
- Namun kita tidak dapat menggunakan `while` untuk mengembalikan nilai, (sepengetahuanku ya)

Hasil code di atas adalah

```
lanjuuut.... masih ada 60 menit
lanjuuut.... masih ada 59 menit
lanjuuut.... masih ada 58 menit
lanjuuut.... masih ada 57 menit
lanjuuut.... masih ada 56 menit
lanjuuut.... masih ada 55 menit
lanjuuut.... masih ada 54 menit
lanjuuut.... masih ada 53 menit
lanjuuut.... masih ada 52 menit
lanjuuut.... masih ada 51 menit
lanjuuut.... masih ada 50 menit
udahan ah, banyak kerjaan
udahan bosque, kerja kerja
```

### `for in`

`for in` adalah yang paling ideal kita gunakan untuk melakukan pengulangan pada list/collection.

Tentu kita dapat melakukannya dengan `while` juga.

```rust
    let my_special_ages = [0, 5, 6, 11, 14, 17, 18];

    for age in my_special_ages.iter() {
        match age {
            0 => println!("lahir lah"),
            5 | 6 | 14 => println!("masuk sekolah"),
            11 | 17 => println!("lulus sekolah"),
            18 => break,
            _ => println!("pokoknya spesial"),
        }
    }
```

- kondisi tidak perlu `( )`
- block kode yang diulangi berada dalam body, dibungkus `{ }`
- kita tetap bisa menggunakan kondisi & `break` di dalamnya

kode di atas menghasilkan

```
lahir lah
masuk sekolah
masuk sekolah
lulus sekolah
masuk sekolah
lulus sekolah
```

> Kita dapat menggunakan semua yang di atas secara _nested_
>
> Sejauh ini kita telah menggunakan `break`
> Yang berfungsi untuk menghentikan pengulangan
> Selanjutnya kita bahas sisanya dengan contoh nested

```rust
fn main() {
    // nested
    let days = [
        "minggu", "senin", "selasa", "rabu", "kamis", "jumat", "sabtu",
    ];

    println!("budak korporate");
    'daysloop: for day in days.iter() {
        println!("hari {}", day);
        let day = *day;

        if day == "sabtu".to_string() || day == "minggu".to_string() {
            println!("libur");
            continue 'daysloop;
        }

        let hours = 0..=24;
        let workhours = 9..=17;
        'hoursloop: for hour in hours {
            if hour == 17 {
                println!("pulang pulang");
                break 'hoursloop;
            }

            if !workhours.contains(&hour) {
                continue 'hoursloop;
            }

            println!("kerja.., jam {}", hour);
        }
    }
}
```

> Bila `break` digunakan untuk menghentikan pengulangan,
> `continue` digunakan untuk loncat pada pengulanga item selanjutnya
> Sementara label digunakan pada `break` ataupun `continue` untuk menjalankannya pada spesifik iteration yang kita maksud,
> biasa digunakan pada nested iteration

Semoga mudah dimengerti,

Terima kasih.

BTW, kode di atas akan menghasilkan

```
budak korporate
hari minggu
libur
hari senin
kerja.., jam 9
kerja.., jam 10
kerja.., jam 11
kerja.., jam 12
kerja.., jam 13
kerja.., jam 14
kerja.., jam 15
kerja.., jam 16
pulang pulang
hari selasa
kerja.., jam 9
kerja.., jam 10
kerja.., jam 11
kerja.., jam 12
kerja.., jam 13
kerja.., jam 14
kerja.., jam 15
kerja.., jam 16
pulang pulang
hari rabu
kerja.., jam 9
kerja.., jam 10
kerja.., jam 11
kerja.., jam 12
kerja.., jam 13
kerja.., jam 14
kerja.., jam 15
kerja.., jam 16
pulang pulang
hari kamis
kerja.., jam 9
kerja.., jam 10
kerja.., jam 11
kerja.., jam 12
kerja.., jam 13
kerja.., jam 14
kerja.., jam 15
kerja.., jam 16
pulang pulang
hari jumat
kerja.., jam 9
kerja.., jam 10
kerja.., jam 11
kerja.., jam 12
kerja.., jam 13
kerja.., jam 14
kerja.., jam 15
kerja.., jam 16
pulang pulang
hari sabtu
libur
```