Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: enumeration and pattern matching #27

Merged
merged 2 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 155 additions & 0 deletions basics/05_enumeration_dan_pattern_matching/src/example.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
pub fn pattern_match() {
let kata = "bakso";
// pattern matching string
match kata {
"bakso" => println!("bakso"),
"burger" => println!("burger"),
_ => println!("pilihan selain di atas"),
}

let angka = 100;
// pattern matching angka, bisa integer, float, dll
match angka {
100 => println!("ini angka 100"),
200 => println!("ini angka 200"),
_ => println!("pilihan selain di atas"),
}

let boolean = true;
// pattern matching boolean
match boolean {
true => println!("ini true"),
false => println!("ini false"),
}
}
// setelah memahami pattern matching
// kita masuk ke enum type
enum Animal {
Dog,
Cat,
Fish
}
// penggunaan dasar enum
pub fn basic_enum() {
// buat variable dengan enum type dog
let dog = Animal::Dog;
// pattern match enum
// masing masing pattern return string
let result = match dog {
Animal::Dog => "dog".to_string(),
Animal::Cat => "cat".to_string(),
Animal::Fish => "fish".to_string(),
};
// cek jika return sesuai pattern match
assert_eq!(result, "dog");

let cat = Animal::Cat;
// pattern match cat
let result = match cat {
Animal::Dog => "dog".to_string(),
Animal::Cat => "cat".to_string(),
Animal::Fish => "fish".to_string(),
};
// cek jika return sesuai pattern match
assert_eq!(result, "cat");

let fish = Animal::Fish;
// pattern match cat
let result = match fish {
Animal::Dog => "dog".to_string(),
Animal::Cat => "cat".to_string(),
Animal::Fish => "fish".to_string(),
};
// cek jika return sesuai pattern match
assert_eq!(result, "fish");
}
// setelah memahami enum
// enum bisa menampung suatu nilai dengan type yang di tentukan
// ini bisa di sebut sebagai enum states
enum Person {
Budi(String),
Andi(String, i8),
Anton(String, i8, f64),
}
// penggunaan enum states
pub fn enum_state() {
// deklarasi budi dengan enum states yang telah di definisikan
let budi = Person::Budi("polisi".to_string());
// pattern match budi
let pekerjaan_budi = match budi {
Person::Budi(pekerjaan) => {
println!("pekerjaan budi adalah: {}", pekerjaan);
pekerjaan
},
Person::Andi(pekerjaan, umur) => pekerjaan,
Person::Anton(pekerjaan, umur, gaji) => pekerjaan,
};
// validasi pekerjaan budi
assert_eq!(pekerjaan_budi, "polisi");

// deklarasi andi dengan enum states yang telah di definisikan
let andi = Person::Andi("programmer".to_string(), 25);
// pattern match andi
let umur_andi = match andi {
Person::Andi(pekerjaan, umur) => {
println!("umur andi adalah: {}", umur);
umur
},
Person::Anton(pekerjaan, umur, gaji) => umur,
_ => 0
};
// validasi umut andi
assert_eq!(umur_andi, 25);

// deklarasi anton dengan enum states yang telah di definisikan
let anton = Person::Anton("dokter".to_string(), 30, 25000000.00);
// pattern match anton
let gaji_anton = match anton {
Person::Anton(pekerjaan, umur, gaji) => {
println!("gaji anton adalah: {}", gaji);
gaji
},
_ => 0.0
};
// validasi gaji anton
assert_eq!(gaji_anton, 25000000.00);
}
// setelah memahami enum states
// kita bisa membuat enum method dan mengakses states tersebut
enum Tebakan {
Kalah(String),
Menang(String),
}
// deklarasi enum method di dalam keyword impl
impl Tebakan {
// method dari enum tebakan
fn tebak(&self) -> String {
match self {
Tebakan::Kalah(reason_kalah) => {
println!("Tebakan salah: {}", reason_kalah);
reason_kalah.to_string()
}
Tebakan::Menang(reason_menang) => {
println!("Tebakan benar: {}", reason_menang);
reason_menang.to_string()
}
}
}
}
// penggunaan enum method
pub fn enum_method() {
// buatkan enum type kalah dengan alasan kalah sebagai enum state
let pilihan = Tebakan::Kalah("ini alasan tebakan mu salah".to_string());
// panggile enum method
let alasan = pilihan.tebak();
// validasi alasan
assert_eq!(alasan, "ini alasan tebakan mu salah");

// buatkan enum type menang dengan alasan menang sebagai enum state
let pilihan = Tebakan::Menang("ini alasan tebakan mu menang".to_string());
// panggil enum method
let alasan = pilihan.tebak();
// validasi alasan
assert_eq!(alasan, "ini alasan tebakan mu menang");
}

13 changes: 12 additions & 1 deletion basics/05_enumeration_dan_pattern_matching/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,17 @@
mod example;

#[cfg(test)]
mod tests {
use crate::example;

#[test]
fn example_test() {
example::pattern_match();
example::basic_enum();
example::enum_state();
example::enum_method();
}

#[test]
fn start() {}
}
}
114 changes: 114 additions & 0 deletions basics/06_result_dan_option_type/src/example.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
// 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())
}

pub 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
}

pub 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);
}
}
Loading
Loading