Skip to content

Commit c76f3b9

Browse files
authored
Merge pull request #27 from MMADUs/main
feat: enumeration and pattern matching
2 parents ea4fc31 + 866e426 commit c76f3b9

File tree

4 files changed

+289
-113
lines changed

4 files changed

+289
-113
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
pub fn pattern_match() {
2+
let kata = "bakso";
3+
// pattern matching string
4+
match kata {
5+
"bakso" => println!("bakso"),
6+
"burger" => println!("burger"),
7+
_ => println!("pilihan selain di atas"),
8+
}
9+
10+
let angka = 100;
11+
// pattern matching angka, bisa integer, float, dll
12+
match angka {
13+
100 => println!("ini angka 100"),
14+
200 => println!("ini angka 200"),
15+
_ => println!("pilihan selain di atas"),
16+
}
17+
18+
let boolean = true;
19+
// pattern matching boolean
20+
match boolean {
21+
true => println!("ini true"),
22+
false => println!("ini false"),
23+
}
24+
}
25+
// setelah memahami pattern matching
26+
// kita masuk ke enum type
27+
enum Animal {
28+
Dog,
29+
Cat,
30+
Fish
31+
}
32+
// penggunaan dasar enum
33+
pub fn basic_enum() {
34+
// buat variable dengan enum type dog
35+
let dog = Animal::Dog;
36+
// pattern match enum
37+
// masing masing pattern return string
38+
let result = match dog {
39+
Animal::Dog => "dog".to_string(),
40+
Animal::Cat => "cat".to_string(),
41+
Animal::Fish => "fish".to_string(),
42+
};
43+
// cek jika return sesuai pattern match
44+
assert_eq!(result, "dog");
45+
46+
let cat = Animal::Cat;
47+
// pattern match cat
48+
let result = match cat {
49+
Animal::Dog => "dog".to_string(),
50+
Animal::Cat => "cat".to_string(),
51+
Animal::Fish => "fish".to_string(),
52+
};
53+
// cek jika return sesuai pattern match
54+
assert_eq!(result, "cat");
55+
56+
let fish = Animal::Fish;
57+
// pattern match cat
58+
let result = match fish {
59+
Animal::Dog => "dog".to_string(),
60+
Animal::Cat => "cat".to_string(),
61+
Animal::Fish => "fish".to_string(),
62+
};
63+
// cek jika return sesuai pattern match
64+
assert_eq!(result, "fish");
65+
}
66+
// setelah memahami enum
67+
// enum bisa menampung suatu nilai dengan type yang di tentukan
68+
// ini bisa di sebut sebagai enum states
69+
enum Person {
70+
Budi(String),
71+
Andi(String, i8),
72+
Anton(String, i8, f64),
73+
}
74+
// penggunaan enum states
75+
pub fn enum_state() {
76+
// deklarasi budi dengan enum states yang telah di definisikan
77+
let budi = Person::Budi("polisi".to_string());
78+
// pattern match budi
79+
let pekerjaan_budi = match budi {
80+
Person::Budi(pekerjaan) => {
81+
println!("pekerjaan budi adalah: {}", pekerjaan);
82+
pekerjaan
83+
},
84+
Person::Andi(pekerjaan, umur) => pekerjaan,
85+
Person::Anton(pekerjaan, umur, gaji) => pekerjaan,
86+
};
87+
// validasi pekerjaan budi
88+
assert_eq!(pekerjaan_budi, "polisi");
89+
90+
// deklarasi andi dengan enum states yang telah di definisikan
91+
let andi = Person::Andi("programmer".to_string(), 25);
92+
// pattern match andi
93+
let umur_andi = match andi {
94+
Person::Andi(pekerjaan, umur) => {
95+
println!("umur andi adalah: {}", umur);
96+
umur
97+
},
98+
Person::Anton(pekerjaan, umur, gaji) => umur,
99+
_ => 0
100+
};
101+
// validasi umut andi
102+
assert_eq!(umur_andi, 25);
103+
104+
// deklarasi anton dengan enum states yang telah di definisikan
105+
let anton = Person::Anton("dokter".to_string(), 30, 25000000.00);
106+
// pattern match anton
107+
let gaji_anton = match anton {
108+
Person::Anton(pekerjaan, umur, gaji) => {
109+
println!("gaji anton adalah: {}", gaji);
110+
gaji
111+
},
112+
_ => 0.0
113+
};
114+
// validasi gaji anton
115+
assert_eq!(gaji_anton, 25000000.00);
116+
}
117+
// setelah memahami enum states
118+
// kita bisa membuat enum method dan mengakses states tersebut
119+
enum Tebakan {
120+
Kalah(String),
121+
Menang(String),
122+
}
123+
// deklarasi enum method di dalam keyword impl
124+
impl Tebakan {
125+
// method dari enum tebakan
126+
fn tebak(&self) -> String {
127+
match self {
128+
Tebakan::Kalah(reason_kalah) => {
129+
println!("Tebakan salah: {}", reason_kalah);
130+
reason_kalah.to_string()
131+
}
132+
Tebakan::Menang(reason_menang) => {
133+
println!("Tebakan benar: {}", reason_menang);
134+
reason_menang.to_string()
135+
}
136+
}
137+
}
138+
}
139+
// penggunaan enum method
140+
pub fn enum_method() {
141+
// buatkan enum type kalah dengan alasan kalah sebagai enum state
142+
let pilihan = Tebakan::Kalah("ini alasan tebakan mu salah".to_string());
143+
// panggile enum method
144+
let alasan = pilihan.tebak();
145+
// validasi alasan
146+
assert_eq!(alasan, "ini alasan tebakan mu salah");
147+
148+
// buatkan enum type menang dengan alasan menang sebagai enum state
149+
let pilihan = Tebakan::Menang("ini alasan tebakan mu menang".to_string());
150+
// panggil enum method
151+
let alasan = pilihan.tebak();
152+
// validasi alasan
153+
assert_eq!(alasan, "ini alasan tebakan mu menang");
154+
}
155+
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1+
mod example;
2+
13
#[cfg(test)]
24
mod tests {
5+
use crate::example;
6+
7+
#[test]
8+
fn example_test() {
9+
example::pattern_match();
10+
example::basic_enum();
11+
example::enum_state();
12+
example::enum_method();
13+
}
314

415
#[test]
516
fn start() {}
6-
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
// untuk error handling di rust menggunakan result sebagai hasil dari suatu proses
2+
// result memiliki 2 kondisi utama yaitu Ok = hasil, dan Err = error
3+
4+
fn get_ok() -> Result<String, String> {
5+
// untuk mengembalikan hasil, dengan keyword Ok(value)
6+
Ok("ini result".to_string())
7+
}
8+
9+
fn get_err() -> Result<String, String> {
10+
// untuk mengembalikan error, dengan keyword Err(value)
11+
Err("ini error".to_string())
12+
}
13+
14+
pub fn result_types() {
15+
// memanggil function untuk return result terlebih dahulu
16+
let result = get_ok();
17+
// memastikan hasil yang di return Ok
18+
assert!(result.is_ok());
19+
// simulasi Ok pattern matching untuk tipe data Result
20+
match result {
21+
Ok(result) => println!("Hasil Ok: {}", result),
22+
Err(e) => println!("Hasil Err: {}", e),
23+
}
24+
25+
// sama seperti di atas, namun kali ini simulasi error
26+
let error = get_err();
27+
// memastikan hasil yang di return Err
28+
assert!(error.is_err());
29+
// simulasi Err pattern matching untuk tipe data Result
30+
match error {
31+
Ok(result) => println!("Hasil Ok: {}", result),
32+
Err(e) => println!("Hasil Err: {}", e),
33+
}
34+
35+
// syntax function dengan pattern matching bisa di persingkat menjadi
36+
match get_ok() {
37+
Ok(result) => println!("Hasil dipersingkat Ok: {}", result),
38+
Err(e) => println!("Hasil Err: {}", e),
39+
}
40+
41+
// syntax function dengan pattern matching bisa di persingkat menjadi
42+
match get_ok() {
43+
// disini kita bisa menambahkan wildcard (_) untuk mengabaikan hasil yang tidak digunakan
44+
// namun ini tidak disarankan, lebih baik di match secara explicit
45+
Ok(result) => println!("Hasil dengan wildcard Ok: {}", result),
46+
_ => (),
47+
}
48+
}
49+
50+
/// bahasa pemrograman rust tidak memiliki nilai Null atau Nil seperti bahasa lainnya
51+
/// rust memiliki fitur option untuk mencegah null value yang berpotensi bug
52+
/// option memiliki 2 kondisi utama yaitu Some = ada value, dan None = tidak ada value
53+
54+
fn get_some() -> Option<String> {
55+
// Some di gunakan untuk mengembalikan Option dengan value
56+
Some("hasil dengan value".to_string())
57+
}
58+
59+
fn get_none() -> Option<String> {
60+
// None di gunakan untuk mengembalikan Option tanpa value
61+
None
62+
}
63+
64+
pub fn option_types() {
65+
// memanggil function untuk return option terlebih dahulu
66+
let option = get_some();
67+
// memastikan return some value
68+
assert!(option.is_some());
69+
// simulasi Some di pattern matching
70+
match option {
71+
Some(result) => println!("Hasil Some: {}", result),
72+
None => println!("Hasil None"),
73+
}
74+
75+
// memanggil function untuk return option terlebih dahulu
76+
let option = get_none();
77+
// memastikan return none value
78+
assert!(option.is_none());
79+
// simulasi None di pattern matching
80+
match option {
81+
Some(result) => println!("Hasil Some: {}", result),
82+
None => println!("Hasil None"),
83+
}
84+
85+
// persingkat pattern matching dengan function
86+
match get_some() {
87+
Some(result) => println!("Hasil persingkat Some: {}", result),
88+
None => println!("Hasil None"),
89+
}
90+
91+
// kita bisa melakukan unwrap yaitu mengambil value di dalam type option ini
92+
// cara ini tidak disarankan, karena juga function return none akan menyebabkan panic
93+
let hasil_option = get_none();
94+
assert!(hasil_option.is_none());
95+
// kita bisa menggunakan default value, sangat disarankan sewaktu waktu hasil nya none, agar tidak panic
96+
let hasil = hasil_option.unwrap_or("ini hasil default".to_string());
97+
// kode dibawah ini akan meyebabkan error, jangan unwrap begitu saja pada option!
98+
// let hasil = hasil_option.unwrap();
99+
println!("Hasil unwrap dengan default: {}", hasil);
100+
101+
let hasil_kondisi = get_some();
102+
// if ini akan jalan jika di temui value dari option tersebut
103+
if let Some(result) = hasil_kondisi {
104+
// variable result yand di deklarasi sebagai some hanya bisa di akses di dalam if block saja
105+
println!("kondisi result true: {}", result);
106+
}
107+
108+
// bisa di persingkat & simulasi jika value adalah none
109+
if let Some(result) = get_none() {
110+
// ini tidak akan jalan karna false!
111+
// variable result mengharapkan some value dari function, namun function mengembalikan none.
112+
println!("kondisi None & false: {}", result);
113+
}
114+
}

0 commit comments

Comments
 (0)