Lompati ke konten utama
Modul 5 · Pelajaran 2 dari 210/14 dalam kursus~15 min
Pelajaran modul (2/2)

Sifat dan Batasan Sifat

Sifat menentukan perilaku yang dimiliki suatu tipe tertentu dan dapat dibagikan dengan tipe lain. Kita dapat menggunakan ciri-ciri untuk mendefinisikan sekumpulan metode yang mewakili fungsionalitas atau antarmuka umum tertentu, mirip dengan antarmuka dalam bahasa pemrograman lain.

Batas sifat memungkinkan kita menentukan bahwa tipe generik harus mengimplementasikan sifat tertentu, memastikan bahwa metode yang diperlukan tersedia pada waktu kompilasi.


Mendefinisikan dan Menerapkan Suatu Sifat

Untuk mendefinisikan suatu sifat, kita menggunakan kata kunci trait diikuti dengan tanda tangan metode yang harus ditentukan oleh tipe implementasi:

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

Untuk mengimplementasikan suatu sifat pada tipe konkret, kami menggunakan sintaks impl TraitName for TypeName:

Rust
pub struct NewsArticle {
    pub headline: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}", self.headline)
    }
}

Batasan Sifat

Saat menulis fungsi generik, kita dapat membatasi parameter tipe untuk memastikan fungsi tersebut mengimplementasikan sifat tertentu. Sintaks standarnya adalah <T: Trait>:

Rust
pub fn notify<T: Summary>(item: &T) {
    println!("Notification: {}", item.summarize());
}

Alternatifnya, untuk tanda tangan yang lebih kompleks, kita dapat menggunakan klausa where :

Rust
pub fn notify_advanced<T>(item: &T)
where
    T: Summary
{
    println!("Notification: {}", item.summarize());
}

Cobalah sendiri

Latihan 1: Sifat Ringkasan

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

Definisikan sifat bernama Ringkasan yang berisi tanda tangan metode fn rangkum(&self) -> String;. Selanjutnya, tentukan struct NewsArticle dengan bidang judul bertipe String dan implementasikan sifat Ringkasan sehingga metode ringkasan mengembalikan nilai bidang judul.

Memuat editor…
Tunjukkan petunjuk

Tentukan sifat `Ringkasan` dan struktur`Artikel Berita`. Implementasikan dengan`impl Ringkasan untuk NewsArticle`mengkloning bidang`self.headline.clone()`.

Solusi tersedia setelah 3 upaya

Latihan 2: Batasan Sifat dengan print_summary

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

Berdasarkan kode dari latihan sebelumnya, tentukan fungsi generik bernama print_summary<T> yang menerima item parameter bertipe &T. Terapkan suatu sifat yang terikat sehingga T harus mengimplementasikan sifat Ringkasan. Di dalam fungsi, cetak hasil yang dikembalikan oleh item.summarize().

Memuat editor…
Tunjukkan petunjuk

Gunakan tanda tangan `fn print_summary<T: Summary>(item: &T)`dan aktifkan`item.summarize()`di dalam`println!`.

Solusi tersedia setelah 3 upaya

Latihan 3: Penghitungan Luas menggunakan Sifat

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

Definisikan suatu sifat bernama Area dengan metode fn area(&self) -> f64;. Buat sebuah struct Circle yang berisi bidang radius bertipe f64, dan implementasikan sifat Area untuknya dengan menghitung luasnya (rumus: radius * radius * 3.14159).

Memuat editor…
Tunjukkan petunjuk

Tentukan sifat `Area` dan struktur`Lingkaran`. Implementasikan`area(&self)` menggunakan rumus luas lingkaran.

Solusi tersedia setelah 3 upaya