Control Flow Bahasa Pemrograman Rust

Control flow adalah serangkaian pengaturan kode dalam blok yang akan dijalankan sesuai kondisi tertentu. Control flow pada rust terdiri dari if expression dan loop expression yang diperuntukan sesuai dengan kemampuannya menangani suatu permasalahan.

  1. If Expression
    1. else
    2. else if
    3. Menggunakan if pada variabel
  2. Loop Expression
    1. Infinity loop
    2. Loop yang mengembalikan nilai
    3. Membuat loop dalam loop
    4. while
      1. While untuk mengambil nilai array
    5. for
  3. Kesimpulan

Jika aku kalah, aku akan bahagia. Jika aku menang, aku akan bersedih.

Control flow mirip dengan kalimat di atas dimana reaksi bersedih atau bahagia tergantung dari peristiwa kalah atau menang. Bedanya control flow melakukannya secara otomatis tanpa perlu bantuan manusia berdasarkan nilai boolean true dan false.

If Expression

Expression merupakan baris kode yang mengembalikan suatu nilai. If adalah salah satu contoh expression yang mengevaluasi suatu nilai dari blok kode di dalamnya kemudian mengembalikan nilai hasil evaluasi tersebut.

fn main (){
  let a:i32 = 10+10; 
  if a ==20{
    println!("a = 20");
  }
}

Contoh 1.0

Terdapat variabel let a:i32 = 10+10; kemudian terdapat if expression yang menyatakan jika hasil dari penjumlahan variabel sama dengan angka 20 dituliskan a==20. Kode dalam kurung kurawal { } akan dijalankan untuk menampilkan text, yaitu println!(“a = 20”);

Simbol/operatorFungsiContoh
%Sisa dari suatu operasiif a % 2 == 0 { }
==Membandingkan dua eskpresiif a == 30 { }
!=Tidak sama denganif a != 30 { }
<=Kurang dari sama dengan
if a <= 20 { }
>=Lebih dari sama denganif a >= 20 { }

Output dari kode tersebut ketika dijalankan sebagai berikut.

a = 20

Contoh 1.1

Karena 10+10 = 20 yang berarti sesuai dengan if a ==20. Kode dalam blok dijalankan seperti pada contoh 1.1.

fn main (){
  let a:i32 = 30+10; 
  if a ==20{
    println!("a = 20");
  }
}

Contoh 1.2

Perhatikan pada contoh 1.2 dimana variabel a diganti menjadi let a:i32 = 30+10; sehingga kondisi tidak sesuai a ==20. Tidak ada text yang ditampilkan.

else

else masih termasuk ke dalam if expression. Pada contoh 1.0 tidak terdapat alternatif sehingga jika kondisi tidak terpenuhi (false) tidak akan ada kode yang dijalankan seperti pada contoh 1.2.

Kita memerlukan sebuah alternatif yang akan dijalankan ketika kondisi false. else adalah jawabannya.

fn main (){
  let a:i32 = 10+10; 
  if a ==20{
    println!("a = 20");
  }
  
  else {
    println!("Kode tersebut tidak sama dengan 20");
  }
  
}

Contoh 1.3

Ketika kondisi tidak memenuhi if maka kode yang dijalankan adalah println!(“Kode tersebut tidak sama dengan 20”); pada bagian else.

Output dari kode di atas akan berbeda dengan contoh 1.2.

Kode tersebut tidak sama dengan 20

Contoh 1.4

else if

else if adalah kombinasi dari else + if. Jangan mengaplikasikan else if pada satu ekspresi saja. Karena akan terjadi error. else if bergantung pada if. Jika tidak ada if maka tidak valid.

Ingat bahwa else digunakan untuk kondisi false dan if jika true. Dengan demikian ketika tidak memenuhi kondisi, maka kode akan tetap ditampilkan.

else if hanya menampilkan nilai true yang pertama terdeteksi. Walaupun semisal terdapat kondisi lain yang bernilai true, akan diabaikan.

fn main (){
    let a:i32 = 10+10; 
    if a ==20{
        println!("a'= 20");
      }
    if a ==20{
      println!("a = 20");
    }
    
  }

Contoh 1.5

Ketika dua if tersebut bernilai true maka semua blok kode akan dijalankan seperti pada contoh 1.6.

a'= 20
a = 20

Contoh 1.6

Perhatikan contoh 1.7 mengenai penambahan else if. Kode yang akan dijalankan hanya pada blok if saja karena sesuai dengan kondisi true. Walaupun else if juga bernilai true.

fn main (){
    let a:i32 = 10+10; 
    if a ==20{
        println!("a'= 20");
      }
    else if a ==20{
        println!("a = 20");
    }
    
  }

Contoh 1.7

Output dari kode di atas adalah sebagai berikut.

a' = 20

Contoh 1.8

Menggunakan if pada variabel

if juga dapat digunakan pada let statement. Hal ini berguna ketika kita ingin mengeksekusi suatu kode berdasarkan nilai dari suatu variabel dan memasukan hasil ekspresi kepada variabel lain.

fn main() {
    let x:i32 = 2000;
    let y:&str  = if x >1000 {">1000"} else {"<1000"};
    
    println!("x = {y}");
    
}

Contoh 1.9

Pada contoh 1.6 variabel let x: i32 = 2000; adalah acuan untuk if expression dalam variabel let y: &str. Pada kesempatan ini kita tidak perlu menggunakan mut karena variabel y bergantung pada if dan belum memiliki nilai tetap.

Selain itu variabel x memiliki tipe data i32 sedangkan y adalah &str. Hal ini tidak menjadi masalah karena 2000 hanya dijadikan sebagai acuan. Berbeda halnya dengan penjumlahan atau kondisi lain, tipe data haruslah sama.

Output dari kode tersebut adalah sebagai berikut.

x = >1000

Contoh 2.0

Loop Expression

Rust memiliki tiga jenis loop, yaitu loop, while, dan for. Pastikan menggunakan kurung kurawal { } sebagai awalan dan akhiran.

Infinity loop

loop akan terus mengulang kode dalam kurung kurawal { } tanpa batas waktu (selamanya). Untuk menghentikan loop kita dapat menggunakan break, if, shortcut Ctrl + C, dll.

fn main(){
loop {
  println!("rust is fun");
}
}

Contoh 2.1

Pada contoh 2.1 println!(“rust is fun”); dalam kurung kurawal { } diulang terus menerus sampai kombinasi tombol Ctrl + C ditekan sebagai pertanda untuk mengakhiri loop.

rust is fun
rust is fun
rust is fun
rust is fun
rust is fun
rust is fun
rust is fun
rust is fun
rust is fun
rust is fun

Contoh 2.2

Loop yang mengembalikan nilai

fn main(){
    let mut x: i32 = 0;
    let result = loop {
        x += 1;
        println!("Angka {x}");
        if x == 7 {
        break x * 2;}
    };
    println!("The final value of x is: {result}");
  }

Contoh 2.3

Loop expression dapat digunakan untuk mengembalikan suatu nilai. Pada contoh 2.3 terdapat variabel mutable, yaitu let mut x: i32 = 0;. Jika variabel tersebut immutable akan terjadi error dikarenakan nilai x tidak dapat berubah.

Dalam variabel let result didalamnya terdapat loop mengenai operasi pertambahan x += 1. Variabel x yang bernilai 0 akan terus ditambah dengan 1 sampai hasil = 7. Jika angka sudah berada pada 7 maka perintah melakukan break x * 2 akan dijalankan. Sehingga variabel result tersebut pada akhirnya bernilai 14.

Struktur kode tersebut disusun demikian rupa agar menghasilkan output seperti contoh 2.4.

Angka 1
Angka 2
Angka 3
Angka 4
Angka 5
Angka 6
Angka 7
The final value of x is: 14

Contoh 2.4

Membuat loop dalam loop

fn main () {
let mut x: i32 = 0;
  
'first: loop {
      println!("X = {x}");
      x += 1;
      let mut z: i32 = 10;
'second: loop {
      println!("z = {z}");
      z -= 1;
      if x ==3 {break 'first}
      if z ==5 {break 'second}
      } 
    }
  }

Contoh 2.5

Kita juga dapat membuat loop di dalam loop dan menambahkan nama agar tidak membingungkan saat melakukan break. Penggunaan nama menggunakan format ‘nama: loop.

Pada kode di atas loop pertama adalah ‘first: loop dan didalamnya terdapat loop kedua, yaitu second: loop. Kemudian saat dilakukan if x ==3 {break ‘first} dan if z ==5 {break ‘second}. Kita menyebutkan loop mana yang akan dihentikan oleh break.

while

while adalah loop yang memiliki persyaratan untuk berhenti secara otomatis. Misalnya jika x = 3 maka loop akan berakhir tanpa perlu melakukan break dan if.

fn main () {
    let mut a: i32 = 0;
    while a != 10 {
      println!("a = {a}");
      a += 2;
    }
    println!("The final a value:{a}");
}

Contoh 2.6

Pada contoh 2.6 kode akan otomatis berhenti ketika nilai dari variabel a sama dengan 10. Jangan lupa di dalam while juga terdapat operasi penjumlahan yang akan merubah variabel x, yaitu a += 2;. Secara eskplisit berarti 0 + 2 = 2, 2 + 2 = 4, 4 + 2 = 6, dst.

That’s why you can remove the semicolon after loop: it results in ! (because the loop never ends and thus never resolves to a value), which can be implicitly coerced to () which is the type that main expects the final expression to be.

Daniel Keep – Rust forum

Dengan menggunakan while tentunya lebih praktis dibandingkan dengan infinity loop + if expression. Output dari kode tersebut adalah sebagai berikut.

a = 0
a = 2
a = 4
a = 6
a = 8
The final a value:10

Contoh 2.7

While untuk mengambil nilai array

fn main(){
let array: [i32; 5] = [1, 2, 3, 4, 5];
let mut index:usize = 0;
  while index < 5 {
  println!("Array is: {}", array[index]); 
  index += 1;
  }
}

Contoh 2.8

Pada contoh 2.6 terdapat dua variabel, yaitu array dan index. while akan berhenti ketika index bernilai 4. Kode println!(“Array is: {}”, array[index]); akan mengambil nilai pada array dengan index berasal dari penjumlahan index += 1;.

Array is: 1
Array is: 2
Array is: 3
Array is: 4
Array is: 5

Contoh 2.9

Penggunaan while akan menyebabkan panic jika kita merubah elemen dalam array tanpa menyesuaikan while index < 5. Hal ini menjadi masalah karena kita memerlukan perubahan pada baris kode kode tertentu.

for

for dapat digunaan untuk memetakan elemen pada array. for mengevaluasi nilai langsung dari suatu objek. for element in + nama variabel adalah perintah melakukan index pada element array.

for juga dapat kita gunakan untuk menghindari bug, misalnya kesalahan iterasi dari while untuk mengambil nilai dari array.

fn main(){
     
     let array_a = [3, 4, 5, 6, 7, 8];
     let mut index_a = 0;

     while index_a != 6 {
        index_a +=1;
        println!("Nilai array secara berurutan: { }", array_a[index_a] );
     }     
}

Contoh 3.0

Ketika kita menjalankan kode 3.0 akan terjadi panic, hal ini terjadi karena array dengan index 6 tidak ada. Panic tidak akan terjadi ketika kita memindahkan println! menjadi sebelum baris index_a +=1;.

Kode tersebut merupakan contoh bug yang dapat terjadi ketika kita tidak memperhitungkan panjang dari array. Hal ini menambah kompeleksitas program pada beberapa case. Oleh karena itu for ada untuk mengatasi masalah ini.

Nilai array secara berurutan: 4
Nilai array secara berurutan: 5
Nilai array secara berurutan: 6
Nilai array secara berurutan: 7
Nilai array secara berurutan: 8
thread 'main' panicked at src/main.rs:8:55:
index out of bounds: the len is 6 but the index is 6
stack backtrace:
   0: rust_begin_unwind
             at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/std/src/panicking.rs:665:5
   1: core::panicking::panic_fmt
             at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/panicking.rs:74:14
   2: core::panicking::panic_bounds_check
             at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/panicking.rs:276:5
   3: hello_word::main
             at ./src/main.rs:8:55
   4: core::ops::function::FnOnce::call_once
             at /rustc/eeb90cda1969383f56a2637cbd3037bdf598841c/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Contoh 3.1

Panic terjadi karena while adalah loop yang secara otomatis menggunakan break ketika suatu kondisi bernilai true. Perhatikan bagian kode index_a != 6 pada contoh 3.0. Kondisi yang memicu break ketika var index_a memiliki nilai 6.

Pertanyaanya adakah array dengan index 6? tidak ada. Ketika kita meletakan println! (memanggil nilai array) sebelum index_a != 6 kode tidak panic karena tidak ada pemanggilan index 6, sudah di break terlebih dahulu. Sebaliknya ketika kita memanggil aray setelah increment kita akan memanggilnya karena var index_a bernilai 6.

fn main(){
let array: [i32; 4] = [1, 2, 3, 4];
  for element in array {
  println!("Array is: {element}");
  }
}

Contoh 3.2

for tidak memerlukan kondisi tertentu seperti while. Karena for langsung mengevaluasi array. Sehingga walaupun elemen berubah atau bertambah tidak perlu mengubah kode. Output dari kode di atas adalah sebagai berikut.

Array is: 1
Array is: 2
Array is: 3
Array is: 4

Contoh 3.3

Kesimpulan

if expression dan loop expression memiliki fungsi masing-masing. Tetapi terdapat beberapa jenis exspression yang sering dipakai oleh programer seperti for yang menghilangkan kebutuhan untuk banyak merubah kode dan else if agar menghentikan proses pemeriksaan ketika sudah terdapat kondisi true.

Perjalanan saya masih sangat panjang karena memerlukan banyak belajar. Tapi, itulah hal yang menurut saya menyenangkan. Programming seperti sebuah game yang harus terus kita pelajari karena berkembang begitu cepat, tentunya untuk tetap bertahan dan beraadaptasi.


Discover more from Qorinotes

Subscribe to get the latest posts sent to your email.

Qori Avatar

Published by

Categories: