-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #24 from MMADUs/option-result
feat: result dan option types
- Loading branch information
Showing
3 changed files
with
120 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,4 +7,7 @@ | |
Cargo.lock | ||
|
||
# These are backup files generated by rustfmt | ||
**/*.rs.bk | ||
**/*.rs.bk | ||
|
||
# Jetbrains ignore | ||
.idea |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,119 @@ | ||
#[cfg(test)] | ||
mod tests { | ||
// untuk error handling di rust menggunakan result sebagai hasil dari suatu proses | ||
// result memiliki 2 kondisi utama yaitu Ok = hasil, dan Err = error | ||
|
||
fn get_ok() -> Result<String, String> { | ||
// untuk mengembalikan hasil, dengan keyword Ok(value) | ||
Ok("ini result".to_string()) | ||
} | ||
|
||
fn get_err() -> Result<String, String> { | ||
// untuk mengembalikan error, dengan keyword Err(value) | ||
Err("ini error".to_string()) | ||
} | ||
|
||
#[test] | ||
fn result_types() { | ||
// memanggil function untuk return result terlebih dahulu | ||
let result = get_ok(); | ||
// memastikan hasil yang di return Ok | ||
assert!(result.is_ok()); | ||
// simulasi Ok pattern matching untuk tipe data Result | ||
match result { | ||
Ok(result) => println!("Hasil Ok: {}", result), | ||
Err(e) => println!("Hasil Err: {}", e), | ||
} | ||
|
||
// sama seperti di atas, namun kali ini simulasi error | ||
let error = get_err(); | ||
// memastikan hasil yang di return Err | ||
assert!(error.is_err()); | ||
// simulasi Err pattern matching untuk tipe data Result | ||
match error { | ||
Ok(result) => println!("Hasil Ok: {}", result), | ||
Err(e) => println!("Hasil Err: {}", e), | ||
} | ||
|
||
// syntax function dengan pattern matching bisa di persingkat menjadi | ||
match get_ok() { | ||
Ok(result) => println!("Hasil dipersingkat Ok: {}", result), | ||
Err(e) => println!("Hasil Err: {}", e), | ||
} | ||
|
||
// syntax function dengan pattern matching bisa di persingkat menjadi | ||
match get_ok() { | ||
// disini kita bisa menambahkan wildcard (_) untuk mengabaikan hasil yang tidak digunakan | ||
// namun ini tidak disarankan, lebih baik di match secara explicit | ||
Ok(result) => println!("Hasil dengan wildcard Ok: {}", result), | ||
_ => (), | ||
} | ||
} | ||
|
||
/// bahasa pemrograman rust tidak memiliki nilai Null atau Nil seperti bahasa lainnya | ||
/// rust memiliki fitur option untuk mencegah null value yang berpotensi bug | ||
/// option memiliki 2 kondisi utama yaitu Some = ada value, dan None = tidak ada value | ||
fn get_some() -> Option<String> { | ||
// Some di gunakan untuk mengembalikan Option dengan value | ||
Some("hasil dengan value".to_string()) | ||
} | ||
|
||
fn get_none() -> Option<String> { | ||
// None di gunakan untuk mengembalikan Option tanpa value | ||
None | ||
} | ||
|
||
#[test] | ||
fn it_works() { | ||
let result = 2 + 2; | ||
assert_eq!(result, 4); | ||
fn option_types() { | ||
// memanggil function untuk return option terlebih dahulu | ||
let option = get_some(); | ||
// memastikan return some value | ||
assert!(option.is_some()); | ||
// simulasi Some di pattern matching | ||
match option { | ||
Some(result) => println!("Hasil Some: {}", result), | ||
None => println!("Hasil None"), | ||
} | ||
|
||
// memanggil function untuk return option terlebih dahulu | ||
let option = get_none(); | ||
// memastikan return none value | ||
assert!(option.is_none()); | ||
// simulasi None di pattern matching | ||
match option { | ||
Some(result) => println!("Hasil Some: {}", result), | ||
None => println!("Hasil None"), | ||
} | ||
|
||
// persingkat pattern matching dengan function | ||
match get_some() { | ||
Some(result) => println!("Hasil persingkat Some: {}", result), | ||
None => println!("Hasil None"), | ||
} | ||
|
||
// kita bisa melakukan unwrap yaitu mengambil value di dalam type option ini | ||
// cara ini tidak disarankan, karena juga function return none akan menyebabkan panic | ||
let hasil_option = get_none(); | ||
assert!(hasil_option.is_none()); | ||
// kita bisa menggunakan default value, sangat disarankan sewaktu waktu hasil nya none, agar tidak panic | ||
let hasil = hasil_option.unwrap_or("ini hasil default".to_string()); | ||
// kode dibawah ini akan meyebabkan error, jangan unwrap begitu saja pada option! | ||
// let hasil = hasil_option.unwrap(); | ||
println!("Hasil unwrap dengan default: {}", hasil); | ||
|
||
let hasil_kondisi = get_some(); | ||
// if ini akan jalan jika di temui value dari option tersebut | ||
if let Some(result) = hasil_kondisi { | ||
// variable result yand di deklarasi sebagai some hanya bisa di akses di dalam if block saja | ||
println!("kondisi result true: {}", result); | ||
} | ||
|
||
// bisa di persingkat & simulasi jika value adalah none | ||
if let Some(result) = get_none() { | ||
// ini tidak akan jalan karna false! | ||
// variable result mengharapkan some value dari function, namun function mengembalikan none. | ||
println!("kondisi None & false: {}", result); | ||
} | ||
} | ||
} |