Struct, Enum, and Trait

Nestero
Bismillahirrahmanirrahim

Catatan kali ini akan membahas 3 serangkai yang sering digunakan dalam bahasa pemrograman rust, yaitu Struct, Enum, dan Trait.

Struct

Secara sederhana struct ini berfungsi untuk mengelompokan data, struct mirip dengan class dibeberapa bahasa pemrograman seperti python, mirip tapi tak sama di rust struct tidak memiliki fitur inheritance. Gaya penulisan nama struct diawali dengan huruf besar, berikut beberapa “jenis” struct :

Classic / Named

Jenis ini yang paling umum digunakan, menuliskan nama field dan diikuti dengan tipe datanya, contoh :

struct User {
	username: String,
	email: String,
	status: bool,
}

penggunaannya :

fn main () {
	let user_1 = User {
			username: String::from("nester"),
			email: String::from("nestero@mail.com"),
			status: true,
	};
	println!("Username 1 : {}" ,user_1.username)
}

Tuple

Jenis ini tidak menuliskan nama field, tetapi langsung ke tipe datanya (berbentuk tuple), contoh :

struct Warna(i32, i32, i32) // Format RGB

penggunaanya :

fn main () {
	let black = Warna(0, 0, 0);
	// Akses menggunakan indeks
   println!("Nilai Red: {}", black.0);
}

Unit

Jenis struct ini sama sekali tidak memiliki nama field ataupun tipe data, contoh :

struct UserLogout;

penggunaannya :

fn process_event(_event: UserLogout) {
    println!("User telah logout.");
}

fn main() {
    // Membuat instance
    let event = UserLogout;
    
    // Unit struct sering dipakai sebagai penanda (marker)
    process_event(event);
}

Enum

Fungsi enum pada rust adalah untuk mendefinisikan tipe data yang bisa menjadi salah satu dari beberapa varian yang mungkin. Jika Struct berfungsi untuk mengelompokan atau menggabungkan data (Logika AND), maka Enum digunakan untuk memilih satu data dari beberapa pilihan (Logika OR). Contoh penulisan dan penggunaan enum :

enum StatusPesanan {
	// Varian tanpa data
	MenungguPembayaran,
	// Varian dengan data String
	Dikirim(String),
	// Varian dengan struct
	Diterima { tanggal: String, penerima: String },
}

fn cek_status(status: StatusPesanan) {
	match status {
		StatusPesanan::MenungguPembayaran => {
			println!("Silahkan melakukan pembayaran terlebih dahulu");
		},
		StatusPesanan::Dikirim (resi)=> {
			println!("Barang sedang jalan. Resi: {}", resi);
        },
		StatusPesanan::Diterima { tanggal, penerima } => {
            println!("Diterima oleh {} pada tanggal {}", penerima, tanggal);
      },
	}
}

penggunaannya :

fn main() {
    let pesanan_saya = StatusPesanan::Dikirim(String::from("JNE-12345"));
    cek_status(pesanan_saya);
}

Trait

Jika Struct mendefinisikan data, dan Enum mendefinisikan varian, maka Trait mendefinisikan behavior atau kemampuan yang dimiliki oleh suatu tipe data. Contoh mendefinisikan trait :

trait Bersuara {
	fn suara(&self) -> String;
}

Implementasi

Misalkan kita punya dua struct berbeda, Kucing dan Anjing. Keduanya adalah hewan yang bisa bersuara, tetapi suaranya berbeda. Kita bisa menerapkan trait Bersuara ke keduanya.

// Unit Struct sebagai contoh
struct Kucing;
struct Anjing;

// Implementasi trait untuk Kucing
impl Bersuara for Kucing {
    fn suara(&self) -> String {
        String::from("Meong!")
    }
}

// Implementasi trait untuk Anjing
impl Bersuara for Anjing {
    fn suara(&self) -> String {
        String::from("Guk Guk!")
    }
}

penggunaanya :

fn main() {
    let oyen = Kucing;
    let doggy = Anjing;

    println!("Kucing bilang: {}", oyen.suara());
    println!("Anjing bilang: {}", doggy.suara());
}
Sesungguhnya yang menyebabkan ilmu hilang adalah lupa dan tidak mengulanginya.

"Sesungguhnya yang menyebabkan ilmu hilang adalah lupa dan tidak mengulanginya."

Imam Az-Zuhri rahimahullah

Tags:

Referensi:

Catatan Terkait:

NESTECH ID

Copyright 2025. All rights reserved.