Lompati ke konten utama
Modul 5 · Pelajaran 1 dari 29/14 dalam kursus~12 min
Pelajaran modul (1/2)

Generik dan Fungsi

Generik memungkinkan Anda menulis kode yang fleksibel dan dapat digunakan kembali, menghindari duplikasi logika untuk tipe data yang berbeda. Daripada mendefinisikan beberapa fungsi atau struktur untuk tipe yang berbeda (seperti i32, f64, atau String), kita dapat menggunakan parameter tipe generik, yang biasanya diwakili oleh huruf T.

Kompiler Rust mengelola obat generik menggunakan proses yang disebut monomorfisasi: selama kompilasi, ia menghasilkan salinan kode generik untuk setiap jenis konkret yang benar-benar digunakan. Ini berarti tidak ada overhead kinerja waktu proses.


Fungsi Generik

Untuk mendefinisikan fungsi generik, kita masukkan parameter tipe <T> tepat setelah nama fungsi dan sebelum daftar argumen:

Rust
fn print_value<T: std::fmt::Debug>(value: T) {
    println!("Value: {:?}", value);
}

Dalam fungsi generik, kita bisa menggunakan tipe generik T untuk tipe argumen dan tipe kembalian:

Rust
fn identity<T>(value: T) -> T {
    value
}

Struktur Generik

Kita juga dapat menggunakan parameter tipe generik di dalam struktur (struct) untuk menentukan bidang fleksibel:

Rust
struct KeyValuePair<K, V> {
    key: K,
    value: V,
}

fn main() {
    let pair = KeyValuePair {
        key: String::from("age"),
        value: 30,
    };
}

Dalam blok impl untuk struct generik, kita harus mendeklarasikan parameter tipe <T> tepat setelah kata kunci impl untuk menunjukkan bahwa kita menerapkan metode pada struktur generik:

Rust
struct Container<T> {
    value: T,
}

impl<T> Container<T> {
    fn new(value: T) -> Self {
        Container { value }
    }

    fn value(&self) -> &T {
        &self.value
    }
}

Cobalah sendiri

Latihan 1: Struktur Poin

Latihan#rust.m5.l1.e1
Upaya: 0Memuat…

Definisikan struct generik bernama Point<T> dengan dua bidang: x bertipe T dan y bertipe T. Dalam fungsi utama, buat instance variabel point yang berisi Point dengan nilai integer x = 5 dan y = 10, lalu cetak nilai point.x.

Memuat editor…
Tunjukkan petunjuk

Deklarasikan struct menggunakan `struct Point<T> { x: T, y: T }`. Buat instance di main dan gunakan `point.x` untuk mencetaknya.

Solusi tersedia setelah 3 upaya

Latihan 2: Membalikkan Tuple dengan swap

Latihan#rust.m5.l1.e2
Upaya: 0Memuat…

Tulis fungsi generik bernama swap<T> yang menerima tupel dari dua elemen (T, T) dan mengembalikan tupel baru (T, T) dengan posisinya terbalik. Pada fungsi utama, panggil fungsi dengan tupel (1, 2) dan cetak hasilnya.

Memuat editor…
Tunjukkan petunjuk

Tanda tangan fungsi harus `fn swap<T>(pair: (T, T)) -> (T, T)`. Kembalikan tupel terbalik dengan `(pair.1, pair.0)`.

Solusi tersedia setelah 3 upaya

Latihan 3: Struktur Kontainer

Latihan#rust.m5.l1.e3
Upaya: 0Memuat…

Definisikan struct generik Container<T> yang berisi bidang nilai tipe T. Implementasikan blok impl generik untuk mendefinisikan metode baru yang menerima nilai tipe T dan mengembalikan instance Container<T>.

Memuat editor…
Tunjukkan petunjuk

Gunakan `impl<T> Container<T>`untuk mengimplementasikan metode terkait`fn new(value: T) -> Self { Container { value } }`.

Solusi tersedia setelah 3 upaya