Batas Trait
Batasi generik dengan trait.
Batas Trait adalah pelajaran Learn Rust Coding gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Learn Rust Coding, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Learn Rust Coding mencakup 4 pelajaran total.
Fungsi Batasan Trait
Batasan trait membatasi tipe generik hanya pada tipe yang menerapkan trait tertentu. Batasan ini memberi tahu kompiler perilaku apa yang dijamin oleh tipe tersebut.
Dengan begitu, metode milik trait dapat digunakan di dalam kode generik, sementara fungsi tetap dapat digunakan untuk banyak tipe.
Sintaks Batasan Sebaris
Bentuk paling sederhana menempatkan batasan tepat setelah parameter tipe: T: Trait. Di sini T harus menerapkan Display agar dapat dicetak.
Di dalam fungsi, Anda kini dapat memanggil metode apa pun yang disediakan Display.
use std::fmt::Display;
fn show<T: Display>(value: T) {
println!("value = {}", value);
}Trait Khusus
Batasan juga dapat digunakan dengan trait buatan Anda sendiri. Definisikan trait dengan sebuah metode, lalu batasi fungsi generik dengan trait tersebut.
Trait Summary ini memerlukan metode summarize yang mengembalikan string.
trait Summary {
fn summarize(&self) -> String;
}Menerapkan dan Membatasi
Terapkan trait tersebut pada suatu tipe, lalu fungsi yang dibatasi dapat menerima implementasi apa pun. Fungsi memanggil metode trait tanpa mengetahui tipe konkretnya.
Program lengkap ini mencetak ringkasan sebuah Article.
trait Summary { fn summarize(&self) -> String; }
struct Article { title: String }
impl Summary for Article {
fn summarize(&self) -> String {
format!("Article: {}", self.title)
}
}
fn notify<T: Summary>(item: &T) {
println!("{}", item.summarize());
}
fn main() {
let a = Article { title: String::from("Rust") };
notify(&a);
}Menggabungkan Batasan dengan +
Minta beberapa trait sekaligus dengan menggabungkannya menggunakan +. Di sini T harus menerapkan Display dan Clone.
Dengan demikian, fungsi dapat mencetak nilai sekaligus membuat salinannya.
use std::fmt::Display;
fn process<T: Display + Clone>(value: T) {
let copy = value.clone();
println!("{}", copy);
}Trait impl dalam Argumen
Sintaks impl Trait pada posisi argumen merupakan bentuk singkat dari batasan sederhana. item: &impl Summary memiliki arti yang sama dengan parameter <T: Summary>.
Sintaks ini ringkas untuk kasus dengan satu argumen, tetapi memberikan kontrol yang lebih sedikit saat Anda menggunakan kembali tipenya.
trait Summary { fn summarize(&self) -> String; }
fn notify(item: &impl Summary) {
println!("{}", item.summarize());
}Mengembalikan impl Trait
Anda juga dapat mengembalikan impl Trait untuk menyembunyikan tipe konkret sekaligus menjamin bahwa tipe tersebut menerapkan suatu sifat. Ini berguna untuk penutupan dan iterator.
Pemanggil hanya mengetahui bahwa hasilnya menerapkan sifat yang disebutkan.
fn make_adder(n: i32) -> impl Fn(i32) -> i32 {
move |x| x + n
}
fn main() {
let add5 = make_adder(5);
println!("{}", add5(10));
}Batasan Mengaktifkan Operator
Operator dipetakan ke sifat: + memerlukan Add, == memerlukan PartialEq, dan perbandingan memerlukan PartialOrd. Dengan memberikan batasan ini, kode generik dapat menggunakan operator tersebut.
Di sini, penjumlahan mengharuskan T menerapkan Add dengan dirinya sendiri.
use std::ops::Add;
fn sum<T: Add<Output = T>>(a: T, b: T) -> T {
a + b
}Metode Sifat Bawaan
Sifat dapat menyediakan isi metode bawaan. Tipe yang menerapkannya dapat mengganti isi tersebut atau menggunakan bawaan. Generik berbatasan akan menggunakan definisi yang sedang berlaku.
Summary ini memiliki summarize bawaan yang dapat dipertahankan apa adanya oleh berbagai tipe.
trait Summary {
fn summarize(&self) -> String {
String::from("(no summary)")
}
}
struct Note;
impl Summary for Note {}Pemanggilan Statis vs Dinamis
Batasan sifat menggunakan pemanggilan statis: kompiler memilih metode yang tepat saat kompilasi melalui monomorfisasi. Sebaliknya, dyn Trait menggunakan pemanggilan dinamis melalui vtable.
Batasan biasanya lebih cepat; dyn mengorbankan kecepatan demi biner yang lebih kecil dan fleksibilitas saat berjalan.
Batasan pada Struct Generik
Batasan sifat tidak hanya berlaku untuk fungsi. Anda dapat mewajibkannya saat mendefinisikan struct agar semua instans memenuhi sifat tersebut.
Di sini, setiap Sortable<T> menjamin bahwa item-itemnya dapat dibandingkan.
struct Sortable<T: PartialOrd> {
items: Vec<T>,
}Pemeriksaan Singkat
Uji pemahaman Anda tentang batasan sifat.
Ringkasan
Batasan sifat membatasi tipe generik sehingga kompiler mengizinkan metode dan operator milik sifat tersebut. Gabungkan sifat dengan +, dan gunakan impl Trait sebagai bentuk singkat dalam argumen atau nilai kembalian.
Batasan memberikan pemanggilan statis tanpa biaya tambahan, berbeda dari pemanggilan dinamis dyn Trait.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Batas Trait” gratis?
Ya — teks lengkap “Batas Trait” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Learn Rust Coding, upgrade ke CoddyKit PRO. Kursus Learn Rust Coding mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Batas Trait”?
Batasi generik dengan trait. Kamu berlatih Learn Rust Coding dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Learn Rust Coding?
Tidak diperlukan pengalaman sebelumnya. Learn Rust Coding di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Batas Trait” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Learn Rust Coding ini?
Ya. Setiap pelajaran Learn Rust Coding menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.