Mengenal Enum dan Fungsinya Pada Rust

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

Enum memiliki fungsi yang hampir sama dengan struct yaitu mengelompokan suatu data. Tetapi, terdapat beberapa perbedaan mendasar. Enum memungkinkan kita untuk mendeklarasikan suatu nilai yang memiliki set nilai.

Contoh di atas menunjukan bangun geometri persegi, di dalamnya bisa saja terdapat lingkaran dan segitiga, inilah yang dimaksud “nilai dengan set nilai“. Enum memiliki kemampuan tersebut untuk membuat program yang efisien.

Isi

Studi kasus

Seorang admin website ingin mencatat alamat IP dari setiap karyawan. Alamat IP yang banyak dipakai adalah IP V4 dan IP V6. Karena terdapat dua jenis IP, ilustrasinya adalah sebagai berikut.

Pembuatan enum dilakukan seperti membuat sebuah struct yang harus dideklarasikan terlebih dahulu (bisa di dalam ataupun diluar fungsi).

enum AlamatIp{
    V4,
    V6,
}

fn main (){
    let empat = AlamatIp::V4;
    let six = AlamatIp::V6;

    route(&AlamatIp::V4);
    route(&AlamatIp::V6);
}

fn route (set: &AlamatIp) {
}

Contoh 1.0

enum AlamatIp memiliki dua varian berupa V4 dan V6. Lalu ketika ingin membuat instance baru gunakan tanda “::” seperti let empat = AlamatIp::V4. Baik V4 atau V6, keduanya memiliki tipe yang sama, yaitu AlamatIp.

fn route meminjam nilai dari enum AlamatIP, kita juga dapat memanggilnya dengan route(&AlamatIp::V4); pada fungsi utama.

Menyimpan Data Pada Struct

Sekarang asumsikan bahwa enum tersebut akan digunakan untuk menyimpan data berupa Alamat Ip pengguna. Cara pertama adalah menggunkan struct.

enum AlamatIp {
    V4,
    V6,
}

struct Penyimpanan {
    jenis: AlamatIp,
    alamat: String,
}

fn main() {
    let home = Penyimpanan {
        jenis: AlamatIp::V4,
        alamat: String::from("127.0.0.1"),
    };

    let loopback = Penyimpanan {
        jenis: AlamatIp::V6,
        alamat: String::from("::1"),
    };
}

Contoh 1.1

Pada contoh di atas, kita mendeklarasikan enum dan struct yang memiliki dua field. Saat menyimpan data maka struct berperan sebagai storage alamat IP pengguna, sedangkan enum digunakan untuk menjelaskan tipe dari AlamatIP.

Menyimpan Nilai Langsung Pada Enum

enum AlamatIp {
    V4 (String),
    V6(String),
}

fn main() {
    let home = AlamatIp::V4(String::from("127.0.0.1"));
    let loopback = AlamatIp::V6(String::from("::1"));
}

Contoh 1.2

Cara ini tentunya terbilang lebih mudah dan jelas karena kita tidak melibatkan struct untuk penyimpanan nilai. Hal yang harus dilakukan adalah mendeklarasikan tipe data terlebih dahulu seperti V4(String). Kemudian nilai dimasukan pada fungsi utama AlamatIp::V4(nilai).

Varian dari enum yang didefinisikan pada variabel home dan loopback menjadi sebuah pemanggilan fungsi yang memiliki parameter berupa String::from(“127.0.0.1”) kemudian mengembalikan nilai berupa AlamatIP.

Menggunakan Ragam Nilai Pada Varian

enum AlamatIp {
    V4(u8, u8, u8, u8),
    V6(String),
}

fn main() {
let home = AlamatIp::V4(127, 0, 0, 1);
let loopback = AlamatIp::V6(String::from("::1"));    
}

Contoh 1.3

enum memiliki keunggulan dapat menyimpan set nilai dalam satu varian. IP V4 selalu memiliki 4 komponen angka, maka kita memiliki opsi untuk menyimpannya menjadi 4 u8 sedangkan IP V6 tetap String.

Rust memiliki standard library khusus untuk Alamat IP V6 dan IP V4. Artinya kita dapat menggunakan modul khusus yang akan langsung dipahami oleh compiler bahwa itu merupakan jenis alamat IP V4 dan V6.

struct Ipv4Addr {

}

struct Ipv6Addr {
    
}

enum AlamatIp {
V4(Ipv6Addr),
V6(Ipv6Addr),
}

Contoh 1.4

Contoh 1.4 menunjukan bahwa enum dapat menyimpan semua tipe nilai, bahkan struct atau enum itu sendiri.

Variasi Pada Enum

enum Pesan {
    Quit,
    Move {x: i32, y: i32},
    Write(String),
    ChangeColor(i32, i32, i32),
}

Contoh 1.5

Contoh 1.5 menunjukan bahwa enum memiliki ragam kemampuan untuk menyimpan suatu set nilai. Fungsi tersebut mirip dengan struct.

struct QuitMessage;

struct MoveMessage {
    x: i32,
    y: i32,
}

struct WriteMessage (String);

struct ChangeColorMessage (i32, i32, i32);

fn main(){}

Contoh 1.6

Menerapkan Implement Block

impl juga dapat diterapkan pada enum. Caranya hampir sama dengan struct.

fn main() {
enum Pesan {
    Quit,
    Move {x: i32, y: i32},
    Write(String),
    ChangeColor(i32, i32, i32),
}

impl Pesan {
    fn call(&self){

    }
}

let m = Pesan::Write(String::from("Hello"));
}

Contoh 1.7

Penutup

Pada bab ini saya tidak terlalu kesulitan untuk memahami enum karena konsepnya hampir mirip dengan struct. Jika pada struct di sebut field sedangkan enum adalah varian.


Discover more from Qorinotes

Subscribe to get the latest posts sent to your email.

Qori Avatar

Published by

Categories: