Stage 5 - Conditional Expression | Belajar Rust #6
Tags: rust, programming, beginners, tutorial
Published: 2022-01-22 06:51:10

Sebenarnya conditional itu kayak kekuatan super, kalian bisa menggunakan conditional untuk membuat keputusan. Kekuatan ini bekerja dengan cara melalukan pengecekan pada condition of the expression dan bertindak sesuai dengan condition of the expression tersebut.

**Tipe-tipe dari conditional expression**

1. `if` expression
2. `if let` expression
3. `match` expression


![Rust Blog](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/m6m6qdrljzvghfse9tzw.png)

## 1. If expression

Rust memiliki berbagai macam conditional menggunakan if statement. Apa saja sih, yok kita bahas satu-persatu 🥳

### a. If expression

`if` expression memerlukan suatu kondisi/ condition. Jika condition di dalam `if` expression bernilai true, maka block of code akan dieksekusi.


![Rust Blog (1)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uvrzu10dfzk9f96uvhqj.png)

→ Contoh

```rust
fn main() {
  let mahasiswa = "Adi";

  if mahasiswa == "Adi" {
    println!("Mahasiswa ini bernama {}", mahasiswa);
  }
}
```

→ Output

```bash
Mahasiswa ini bernama Adi
```

### b. If...else expression

`if...else` memiliki kegunaan yang melengkapi kekosongan `if` expression, jika kondisi yang berada di `if` expression bernilai false, maka statement yang berada di dalam block `else` akan dieksekusi.


![Rust Blog](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3ixpii28fylz5hxbah6m.png)

→ Contoh

```rust
fn main() {
  let mahasiswa = "Adi";

  if mahasiswa == "Adi" {
    println!("Mahasiswa ini bernama {}", mahasiswa);
  } else {
    println!("Wahh mahasiswa ini gak bernama");
  }
}
```

→ Output

```bash
Mahasiswa ini bernama Adi
```

### c. If...else if...else expression

Jika kita memiliki banyak atau lebih dari satu kondisi yang perlu kita cek, maka menggunakan `if...else if...else` merupakan pilihan yang sangat tepat.


![Rust Blog (2)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/izd5yzo0qm0181bfvrxz.png)

→ Contoh

```rust
fn main() {
  let mahasiswa = "Yusuf";

  if mahasiswa == "Adi" {
    println!("Mahasiswa ini bernama {}", mahasiswa);
  } else if mahasiswa == "Yusuf" {
     println!("Mahasiswa ini bernama {}", mahasiswa);
  } else {
    println!("Wahh mahasiswa ini gak bernama");
  }
}
```

→ Output

```bash
Mahasiswa ini bernama Yusuf
```

### d. Nested if expression

Kita bisa melakukan nested/ bersarang `if` expression, yang dimaksud nested adalah kita dapat menggunakan `if` expression di dalam body `if` expression yang lain.


![Rust Blog (3)](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3wke33d3bn8mbh89ngt.png)

> **Note:** Kalian bisa membuat banyak level nesting, sesuai kebutuhan.
> 

→ Contoh

```rust
fn main() {
  let mahasiswa = "Adi";
  let mahasiswa_2 = "Yusuf";

  if mahasiswa == "Adi" {
    if mahasiswa_2 == "Yusuf" {
      println!("Mahasiswa ini bernama {}", mahasiswa_2);
    }
    println!("Mahasiswa ini bernama {}", mahasiswa);
  } else {
    println!("Wahh mahasiswa ini gak bernama")
  }
}
```

→ Output

```bash
Mahasiswa ini bernama Yusuf
Mahasiswa ini bernama Adi
```

### e. Shorthand if

Kita sebagai warga netizen atau warga +62, kita sangat malas mengetik `if-else` yang sangat panjang, spesial untuk warga +62 kita bisa menggunakan **shorthand** `if`.

→ Contoh

```rust
fn main() {
  let mahasiswa = "Adi";
  
  let hasil = if mahasiswa == "Adi" { "Your so handsome, Adi" } else { "I,m pretty handsome" };
  println!("{}", hasil);
}
```

→ Output

```bash
Your so handsome, Adi
```

## 2. If let expression

If let merupakan conditional expression yang memungkinkan pattern matching. Block of code dalam konstruk dijalankan jika pola dalam kondisi cocok dengan  scrutinee expression. Aduh bingung ya, yuk langsung ke contoh dengan beberapa kasus.

### a. Pattern is matched

→ Contoh

```rust
fn main() {
  // scrutinee expression
  let mahasiswa = ("Adi", "sistem informasi", "yogyakarta");
  
  if let  ("Adi", "sistem informasi", "yogyakarta") = mahasiswa {
    println!("{:?}", mahasiswa);
  } else {
    println!("Value tidak berjodoh");
  }
}
```

→ Output

```bash
("Adi", "sistem informasi", "yogyakarta")
```

→ Contoh value pertama atau kedua match

```rust
fn main() {
  // scrutinee expression
  let mahasiswa = ("Adi", "sistem informasi", "yogyakarta");
  
  if let  ("Adi", "sistem informasi", z) = mahasiswa {
    println!("Nilai tampil {}", z);
  } else {
    println!("Value tidak berjodoh");
  }
}
```

→ Output

```bash
Nilai tampil yogyakarta
```

→ Contoh value pertama match

```rust
fn main() {
  // scrutinee expression
  let mahasiswa = ("Adi", "sistem informasi", "yogyakarta");
  
  if let  ("Adi", y, z) = mahasiswa {
    println!("Nilai tampil {}, {}", y, z);
  } else {
    println!("Value tidak berjodoh");
  }
}
```

→ Output

```bash
Nilai tampil sistem informasi, yogyakarta
```

### b. Pattern is not matched

→ Contoh

```rust
fn main() {
  // scrutinee expression
  let mahasiswa = ("Adi", "sistem informasi", "yogyakarta");
  
  if let  ("Yusuf", y, z) = mahasiswa {
    println!("Nilai tampil {}, {}", y, z);
  } else {
    println!("Value tidak berjodoh");
  }
}
```

→ Output

```bash
Value tidak berjodoh
```

### c. Pattern is replaced with `_`

Kita bisa menggunakan `_` untuk kasus ketika pattern tidak terdefinisi.

→ Contoh

```rust
fn main() {
  // scrutinee expression
  let mahasiswa = ("Adi", "sistem informasi", "yogyakarta");
  
  if let _ = mahasiswa {
    println!("{:?}", mahasiswa);
  } else {
    println!("Value tidak berjodoh");
  }
}
```

→ Output

```bash
warning: irrefutable `if let` pattern
 --> src/main.rs:5:6
  |
5 |   if let  _ = mahasiswa {
  |      ^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(irrefutable_let_patterns)]` on by default

("Adi", "sistem informasi", "yogyakarta")
```

> **Note:** Kenapa compiler mendeteksi warning ⚠️, dikarenakan Rust compiler mengeluh, kalian itu gak masuk akal makai `if let` dengan **irrefutable pattern**
> 

## 3. Match expression

Match expression mengecek jika value saat ini cocok dengan value yang berada di dalam list. Jika kalian sudah pernah mempelajari beberapa bahasa pemrograman seperti C++, maka match expression mirip dengan switch. Expression ini membuat code lebih compact dari pada mengunakan if/else.

→ Contoh

```rust
fn main() {
  let x = 2;

  match x {
    1 => println!("Adi"),
    2 => println!("Purwanto"),
    3 => println!("Sistem"),
    _ => println!("Informasi") // ini akan dieksekusi jika value tidak ada yang macth
  };
}
```

→ Output

```bash
Purwanto
```

→ Contoh

```rust
fn main() {
  let x = 10;

  let value = match x {
    1 => "Adi",
    2 => "Purwanto",
    3 => "Sistem",
    _ => "Informasi" // ini akan dieksekusi jika value tidak ada yang macth
  };

  println!("{}", value);
}
```

→ Output

```bash
Informasi
```

## Contoh

Contoh kali ini kita akan membuat program pengecekan apakah bilangan tersebut ganjil atau genap.

**Input**

```bash
integer
```

**Output**

```bash
Angka x adalah ganjil atau Angka x adalah genap
```

> **Note:** Yuk kerjakan dulu, lalu beri tahu jawabannya di kolom discussion bagaimana cara solve the problem diatas.
> 

.

.

.

.

.

→ Penyelesaian jika ada yang mentok

```rust
fn main() {
  // input
  let x:i32 = 6;

  if x % 2 != 0 {
    println!("Angka {} adalah ganjil", x);
  } else {
    println!("Angka {} adalah genap", x);
  }
}
```

→ Output

```bash
Angka 6 adalah genap
```

---

Jika ada kesalahan dalam menyampaikan konsep dan penulisan mohon bantuannya di kolom discussion 🤗. Terima kasih.

> `#samasamabelajar`
> 

---

> **LIST COURSE:**
> 
> 
> **[If you don't know me, then, you would not know who I am](https://dev.to/myusufadp/if-you-dont-know-me-then-you-would-not-know-who-i-am-learn-rust-1-ah4)**
> 
> **[Stage 1](https://dev.to/myusufadp/stage-1-belajar-rust-2-5al5)**
> 
> **[Stage 2 - Variables](https://dev.to/myusufadp/stage-3-data-types-belajar-rust-4-2dhn-temp-slug-197874/edit)**
> 
> **[Stage 3 - Data Types](https://dev.to/myusufadp/stage-3-data-types-belajar-rust-4-3l71)**
> 
> **[Stage 4 - Operators](https://dev.to/myusufadp/stage-4-operators-belajar-rust-5-2mb4)**
> 

---

> [Twitter](https://twitter.com/myusufadp)
> 
> 
> [Buy me a coffe](https://saweria.co/myusufadp)
>