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
Struct adalah tipe data yang dapat menyimpan berbagai macam nilai disertai keterangannya. Hal ini berbeda dari tuple atau array yang tidak disertai keterangan dari sebuah data.
fn main() {
// TUPLE
let data1:(i32, i64, i32) = (25000, 3000000, 350000);
// ARRAY
let data2 = [110000, 50000, 70000];
}
Contoh 1.0
Berdasarkan contoh 1.0 kita tidak mengetahui makna dari kumpulan nilai pada data1 atau data2. Walaupun sudah terdapat clue seperti data2 berisi harga novel Sherlock Holmes, Harry Potter, dan Laskar Pelangi.
Jadi berapa harga novel-novel tersebut berdasarkan data2?
Kita masih dapat menentukan kecocokan harga novel tersebut dengan cara menebak. Semakin besar data yang ada, tentunya semakin sulit untuk melakukan tebakan. Oleh karena itu, kita menggunakan struct.
struct Novel {
// Field 1
sherlock_holmes: i32,
// Field 2
harry_potter: i32,
// Field 3
laskar_pelangi: i32,
}
fn main() {
let harga = Novel {
sherlock_holmes: 70000,
harry_potter: 110000,
laskar_pelangi: 50000,
};
}
Contoh 1.1
Pada contoh 1.1 struct berada di atas fungsi fn main. Tidak ada aturan baku apakah penempatannya harus sebelum atau sesudah. struct dideklarasikan di luar fungsi yang memuat judul buku dan tipe data.
warning: type `novel` should have an upper camel case name
--> src/main.rs:13:8
|
13 | struct novel {
| ^^^^^ help: convert the identifier to upper camel case: `Novel`
|
= note: `#[warn(non_camel_case_types)]` on by default
Contoh 1.2
Nama untuk struct sebaiknya huruf pertama kapital seperti Novel agar dapat dibedakan dengan variabel.
println!("{}", harga.sherlock_holmes);
Jika kita ingin mengambil nilai dari struct, lakukan dengan cara nama_variabel.field.
Contoh 1.3
Variasi Penggunaan
Merubah isi Data
struct User {
// Field 1
nama_tanaman: String,
// Field 2
nama_latin: String,
// Field 3
tahun_penemuan: i32,
}
fn main() {
let mut pengguna = User {
nama_tanaman : String::from("Padi"),
nama_latin : String::from("Daucus carota"),
tahun_penemuan : 1000,
};
pengguna.nama_tanaman = String::from("Wortel");
println!("{}", pengguna.nama_tanaman);
}
Contoh 1.4
Untuk merubah nilai dari struct kita memerlukan variabel yang bersifat mutable seperti let mut pengguna. Kemudian perubahan dilakukan dengan mendefinisikan element dari struct, yaitu pengguna.nama_tanaman disertai nilai yang akan diunggah String::from(“Wortel”);.
Semua element pada User akan bersifat mutable tanpa terkecuali. Misalnya element tahun_penemuan dapat diganti dengan kode pengguna.tahun_penemuan = 2023;.
Menggunakan Singkatan
struct User {
nama_tanaman: String,
nama_latin: String,
tahun_penemuan: i32,
}
fn terima_nilai (nama_tanaman: String, nama_latin: String) -> User {
User {
nama_tanaman,
nama_latin,
tahun_penemuan: 1000,
}
}
fn main () {
let pengguna = terima_nilai(
String::from("Wortel"),
String::from("Daucus carota"),
);
println!("{} atau {} didomestikasi pada tahun {} CE", pengguna.nama_tanaman, pengguna.nama_latin, pengguna.tahun_penemuan);
}
Contoh 1.5
Contoh 1.5 menunjukan telah dilakukannya move. Pada saat fn terima_nilai menerima String dari caller secara otomatis akan terhubung dengan struct. Karena nama dari parameter sama, sehingga tidak perlu mengetik ulang menjadi nama_tanaman : nama_tanaman, cukup nama_tanaman saja.
Selanjutnya return value dari fn terima_nilai adalah User yang telah memiliki String. Output dari program di atas adalah sebagai berikut.
Wortel atau Daucus carota didomestikasi pada tahun 1000 CE
Wortel atau Daucus carota didomestikasi pada tahun 1000 CEContoh 1.6
Menggunakan Kembali Nilai Struct
struct Akun {
nama: String,
umur: i32,
tahun: i32,
}
fn main(){
let daniel = Akun {
nama: String::from("Daniel scott"),
umur: 21,
tahun: 2002
};
let johannson = Akun {
nama: String::from("Johansson jacksen"),
umur: daniel.umur,
tahun: daniel.tahun,
};
println!("{}", johannson.tahun);
}
Contoh 1.7
Dalam rangka mempersingkat waktu, kita dapat menggunakan nilai dari struct yang telah dideklarasikan pada variabel daniel. Caranya dengan mendefinisikan umur: daniel.umur, pada variabel johannson.
let mengambi_l = umur.johannson;
letmengambil_2 = umur.johannson;
Contoh 1.8
Jika kita menggunakan field dari struct lalu mendefinisikannya pada suatu variabel seperti contoh 1.8 yang berhubungan dengan ownership. Maka dari itu aturan “tidak bisa melakukan move secara bersamaan dari sumber yang sama” akan berlaku.
Menggunakan Seluruh Nilai Struct Lain
struct Akun {
nama: String,
umur: i32,
tahun: i32,
}
fn main(){
let daniel = Akun {
nama: String::from("Daniel scott"),
umur: 21,
tahun: 2002
};
let johannson = Akun {
nama: String::from("Johansson jacksen"),
..daniel
};
// Melakukan print -> 21
println!("{}", johannson.umur);
}
Contoh 1.9
Penggunaan ..daniel akan memanggil seluruh isi struct dari variabel daniel kecuali untuk field nama karena memiliki nilai yang berbeda. Cara ini mirip seperti melakukan slice.
Menggunakan Tuple Struct
struct Harga(i32, i32,i32);
struct Diskon(i32, i32, i32);
fn main () {
let andrea_hirata = Harga(103000, 107000, 71200);
let obral_baju = Diskon( 10000, 25000, 5000);
// Kode akan menghasilkan text -> 10.000
println!("{}", obral_baju.0);
}
Contoh 2.0
Tuple struct dapat digunakan ketika kita tidak membutuhkan keterangan pada data karena menjadikannya bertele-tele. Kita juga tidak dapat menggunakan nilai pada struct Harga dengan memanggilnya menggunakan struct Diskon. Walaupun tipe datanya sama tetapi “kandangnya” berbeda.
Unit Like Struct
struct Data;
fn main() {
let penilaian = Data;
}
Contoh 2.1
Unit like struct tidak memiliki data apapun di dalamnya. Misalnya di masa depan kita dapat memberikan serangkaian pengaturan pada kode tersebut.
Penutupan
struct memiliki berbagai macam variasi penggunaan yang bisa disesuaikan kebutuhan. Kendati demikian, saya akui bahwa materi ini berhubungan erat dengan materi lain. Tetapi saya tidak terlalu kesulitan karena menggunakan media pembelajaran selain laptop, yaitu ponsel android.