Menu
CoddyTech

Struct Generik

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 24 dari 61.

Sejauh ini, setiap struct yang kamu buat memiliki field dengan tipe yang spesifik dan konkret. Sebuah Pet memiliki nama bertipe String, sebuah Rectangle memiliki dimensi bertipe f64. Namun, bagaimana jika kamu ingin membuat struct yang dapat menyimpan jenis data apa pun?

Di sinilah generics berperan. Generics memungkinkan kamu menulis kode yang fleksibel dan dapat digunakan kembali, yang bekerja dengan berbagai tipe. Alih-alih menetapkan tipe tertentu secara langsung, kamu menggunakan placeholder, biasanya T, yang diganti dengan tipe konkret saat kamu menggunakan struct.

Berikut struct pembungkus sederhana yang dapat menyimpan tipe apa pun:

struct Wrapper<T> {
    value: T,
}

<T> setelah nama struct mendeklarasikan parameter tipe generik. Di dalam struct, T berfungsi sebagai pengganti tipe apa pun yang akan kamu gunakan. Saat membuat instance, Rust menyimpulkan tipe konkretnya:

let int_wrapper = Wrapper { value: 42 };        // T bertipe i32
let float_wrapper = Wrapper { value: 3.14 };    // T bertipe f64
let text_wrapper = Wrapper { value: "hello" };  // T bertipe &str

Masing-masing memiliki tipe konkret yang berbeda, yaitu Wrapper<i32>, Wrapper<f64>, dan Wrapper<&str>, tetapi semuanya menggunakan definisi struct yang sama. Dengan begitu, kamu tidak perlu menulis struct IntWrapper, FloatWrapper, dan StringWrapper secara terpisah, padahal semuanya pada dasarnya melakukan hal yang sama.

Huruf T hanyalah konvensi (singkatan dari "Type"). Kamu bisa menggunakan identifier valid apa pun, tetapi T merupakan standar di Rust dan sebagian besar bahasa lain yang memiliki generik.

challenge icon

Tantangan

Mudah

Mari buat container generik yang dapat menampung nilai dengan tipe apa pun! Kamu akan membuat struct Container untuk menunjukkan bagaimana generik membuat kodemu fleksibel dan dapat digunakan kembali.

Kamu akan membagi kodemu ke dalam dua file:

  • container.rs: Definisikan struct generik publik bernama Container<T> dengan satu field publik item bertipe T. Container ini harus dapat menampung tipe apa pun: bilangan bulat, bilangan desimal, string, atau apa pun.
  • main.rs: Sertakan module container-mu dan tunjukkan fleksibilitasnya dengan membuat container yang menampung tipe data berbeda. Kamu akan membuat tiga container dan menampilkan isi masing-masing.

Di file utama, buat container berikut:

  1. Container yang menampung nilai bilangan bulat (input pertama, diuraikan sebagai i32)
  2. Container yang menampung nilai bilangan desimal (input kedua, diuraikan sebagai f64)
  3. Container yang menampung string (input ketiga, disimpan sebagai String)

Output-mu harus menampilkan isi setiap container dalam format ini:

Integer container: {value}
Float container: {value}
String container: {value}

Contohnya, dengan input 42, 3.14, dan hello:

Integer container: 42
Float container: 3.14
String container: hello

Perhatikan bagaimana definisi Container<T> yang sama dapat digunakan untuk ketiga tipe berbeda: itulah keunggulan generik!

Kamu akan menerima tiga input: nilai bilangan bulat, nilai bilangan desimal, dan nilai string.

Coba sendiri

mod container;

use container::Container;

fn main() {
    // Baca ketiga input
    let mut input1 = String::new();
    std::io::stdin().read_line(&mut input1).expect("Failed to read line");
    let int_value: i32 = input1.trim().parse().expect("Failed to parse integer");

    let mut input2 = String::new();
    std::io::stdin().read_line(&mut input2).expect("Failed to read line");
    let float_value: f64 = input2.trim().parse().expect("Failed to parse float");

    let mut input3 = String::new();
    std::io::stdin().read_line(&mut input3).expect("Failed to read line");
    let string_value = input3.trim().to_string();

    // TODO: Buat tiga container menggunakan Container<T>
    // 1. Container bilangan bulat yang menyimpan int_value
    // 2. Container bilangan desimal yang menyimpan float_value
    // 3. Container string yang menyimpan string_value

    // TODO: Cetak isi setiap container dalam format yang diminta
    // Integer container: {value}
    // Float container: {value}
    // String container: {value}
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online