Sebenarnya ada apa dengan postingan ini? saya sedang belajar rust lang. Metode yang menurut saya efektif untuk belajar adalah menuliskannya di blog dan menjelaskan kembali hal tersebut. Saya amat sangat menerima kritik dan saran.
Pendahuluan
Setelah membahas mengenai struct secara komprehensif, kita lanjutkan dengan contoh aplikasi tipe data tersebut pada sebuah program. Masalah yang harus dipecahkan adalah membuat program yang dapat menghitung luas dari persegi panjang. Tetapi kode yang ditulis haruslah mudah dipahami dan minim ambiguitas.
fn main() {
// Deklarasi variabel panjang dan lebar
let panjang = 50;
let lebar = 25;
// Melakukan move karena var panjang dan lebar didefinisikan pada param
// Menampilkan text hasil dari return value
println!("Luas persegi tersebut adalah: {} m2", kalkulasi(panjang, lebar));
}
// Fungsi ini melakukan penjumlahan dengan nilai yang berasal dari param
fn kalkulasi (panjang: u32, lebar: u32) -> u32{
panjang*lebar
}Contoh 1.0
Contoh 1.0 akan menghasilkan output luas persegi panjang. Secara garis besar program tersebut dinyatakan berhasil memberikan sebuah solusi. Hanya saja, kode ini belum terlalu jelas untuk dibaca karena panjang dan lebar pada parameter fn kalkulasi tidak menunjukan suatu hubungan.
fn kalkulasi (panjang: u32, lebar: u32) -> u32Contoh 1.1
Jika terdapat programmer yang ingin menggunakan kembali kode tersebut, belum tentu mengetahui makna dari panjang dan lebar pada parameter fn kalkulasi. Bisa saja muncul dugaaan bahwa masing-masing variabel berdiri sendiri.
Menggunakan Tuple
Tuple adalah tipe data compound yang dapat menyimpan berbagai macam nilai dengan jenis yang berbeda. Penggunaan tuple menjadikan panjang dan lebar dari persegi panjang, ada pada satu wadah yang sama.
fn main() {
// Deklarasi variabel dengan tipe tuple
// Nilai panjang dan lebar ada pada satu wadah yang sama
let persegi_panjang = (50, 25);
// Melakukan move terhadap var persegi_panjang
// Menerima return value dari fn kalkulasi
println!("luas dari persegi adalah {} m2", kalkulasi(persegi_panjang));
}
fn kalkulasi(data: (u32, u32)) -> u32{
// Expression yang menghasilkan return value u32
data.0 * data.1
}Contoh 1.2
Pada contoh 1.2 kita dapat mengetahui hubungan antara panjang dan lebar karena keduanya disandingkan pada variabel persegi_panjang. Tetapi ada satu masalah lain yang muncul, dimana kita tidak mengetahui secara pasti nilai panjang dan lebar dari let persegi_panjang = (50, 25);. Jadi nilai mana yang panjang atau lebar? bayangkan jika isi dari tuple memiliki puluhan data.
Menggunakan Struct
Struct adalah tipe data yang dapat menyimpan berbagai macam nilai berbeda seperti tuple, plus dengan keterangan dari elemen di dalamnya.
// Deklarasi struct dengan nama PersegiPanjang dan jenisnya
struct PersegiPanjang {
panjang: u32,
lebar: u32,
}
fn main() {
// Deklarasi PersegiPanjang dengan nilai panjang dan lebar
let data = PersegiPanjang {
panjang: 50,
lebar: 25,
};
// Melakukan borrowing terhadap variabel data pada parameter fungsi
// Menerima return value dari fungsi kalkulasi
println!("luas dari persegi adalah {} m2", kalkulasi(&data));
}
fn kalkulasi(data: &PersegiPanjang) -> u32 {
// Mengambil nilai dari struct dan melakukan perkalian sebagai expression
data.panjang*data.lebar
}Contoh 1.3
Dengan adanya struct PersegiPanjang kita dapat dengan mudah membaca kode tersebut karena setiap nilai memiliki keterangan, misalnya panjang: 50,. Kode di atas lebih jelas ketika seseorang mencoba membacanya dibandingkan contoh 1.0 dan contoh 1.2
Menampilkan Isi Struct
struct PersegiPanjang {
panjang: u32,
lebar: u32,
}
fn main() {
let data = PersegiPanjang {
panjang: 50,
lebar: 25,
};
// Mencoba menampilkan struct PersegiPanjang
println!("{:?}", data);
}Contoh 1.4
Apa yang terjadi ketika kita ingin melihat nilai dari struct PersegiPanjang menggunakan println!(“{}”, data);? Rust tidak akan menampilkan apapun karena compiler mencegah hal tersebut.
= help: the trait `std::fmt::Display` is not implemented for `PersegiPanjang`
= note: in format strings you may be able to use `{:?}` (or {:#?} for pretty-print) insteadContoh 1.5
Rust tidak ingin menebak apa yang kita inginkan ketika menampilkan struct PersegiPanjang, apakah harus dengan kurung kurawal “{ }“? apakah keterangan dari tiap data juga harus ditampilkan? apakah semua field harus ditampilkan? dsb.
Oleh karena itu, struct tidak memiliki implementasi terhadap std::fmt::Display untuk menampilkannya menggunakan macro println! dan “{ }“. Pada contoh 1.5 kita mendapatkan saran dari compiler untuk menggunakan {:?}.
println!("{:?}", data);Contoh 1.6
Setelah melakukan aplikasi {:?} seperti contoh 1.6, ternyata masih terdapat error.
= help: the trait `Debug` is not implemented for `PersegiPanjang`
= note: add `#[derive(Debug)]` to `PersegiPanjang` or manually `impl Debug for PersegiPanjang`Contoh 1.7
Kita belum menambahkan Debug berupa kode [derive(Debug)] sebelum melakukan deklarasi struct PersegiPanjang.
#[derive(Debug)]
struct PersegiPanjang {
panjang: u32,
lebar: u32,Contoh 1.8
Setelah menambahkan perintah untuk melakukan debug, output yang dihasilkan adalah sebagai berikut.
PersegiPanjang { panjang: 50, lebar: 25 }Contoh 1.9
Sekarang kita dapat melihat isi dari struct PersegiPanjang. Agar mempermudah kita dalam membaca outdput dapat digunakan kode :#?.
println!("{:#?}", data);Contoh 2.0
Output yang akan dihasilkan adalah sebagai berikut.
PersegiPanjang {
panjang: 50,
lebar: 25,
}Contoh 2.1
Penggunaan dbg!
#[derive(Debug)]
struct PersegiPanjang {
panjang: u32,
lebar: u32,
}
fn main() {
let faktor = 2;
let data = PersegiPanjang {
panjang: 50 * faktor,
lebar: 25,
};
// Penggunaan dbg!+
dbg!(&data);
}
Contoh 2.2
dbg! akan mengambil kepemilikan dari variabel data ketika tidak menggunakan reference. Kode ini juga mengembalikan suatu nilai berikut dengan proses perkalian yang ada pada field panjang: 50 * faktor. dbg! menjadikan kita dapat mengetahui proses yang terjadi pada suatu program.
[src/main.rs:14] &data = PersegiPanjang {
panjang: 100,
lebar: 25,
}Contoh 2.3
Penutupan
Pada skala data yang lebih besar, struct menjadi salah satu tipe data yang penting dalam melakukan manajemen data. Implementasi struct pada program sederhana ini membuat saya menjadi lebih aware terhadap fungsionalitasnya.