Kembali ke seri

Traits dan generics tanpa drama

Perilaku bersama di Rust: traits, trait bound, dan kapan memakai generics.

Daftar Isi

Rust tidak punya inheritance, jadi perilaku bersama datang dari trait. Anggap trait sebagai kontrak: tipe apa pun yang menandatanganinya wajib menyediakan method ini.

Mendefinisikan dan mengimplementasikan

trait Summary {
    fn summarize(&self) -> String;
}

struct Release {
    product: String,
    version: String,
}

impl Summary for Release {
    fn summarize(&self) -> String {
        format!("{} {}", self.product, self.version)
    }
}

Memakainya secara generik

Trait bound berkata “semua T yang memenuhi kontrak”:

fn announce(item: &impl Summary) {
    println!("Update! {}", item.summarize());
}

Memilih di antaranya

  • impl Trait di posisi argumen: cepat, mudah dibaca, biasanya cukup
  • <T: Summary> eksplisit: perlu saat Anda menyebut T lebih dari sekali
  • Trait object (dyn Summary): satu koleksi berisi tipe campuran, biaya runtime kecil

Dikombinasikan dengan ownership dari bagian 1, traits dan generics mencakup sebagian besar arsitektur yang akan Anda tulis di Rust sehari-hari.