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:
pub trait Summary {
fn summarize(&self) -> String;
}Untuk mengimplementasikan suatu sifat pada tipe konkret, kami menggunakan sintaks impl TraitName for TypeName:
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>:
pub fn notify<T: Summary>(item: &T) {
println!("Notification: {}", item.summarize());
}Alternatifnya, untuk tanda tangan yang lebih kompleks, kita dapat menggunakan klausa where :
pub fn notify_advanced<T>(item: &T)
where
T: Summary
{
println!("Notification: {}", item.summarize());
}Cobalah sendiri
Latihan 1: Sifat Ringkasan
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.
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
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().
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
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).
Tunjukkan petunjuk
Tentukan sifat `Area` dan struktur`Lingkaran`. Implementasikan`area(&self)` menggunakan rumus luas lingkaran.
Solusi tersedia setelah 3 upaya