0Pricing
Learn Rust Coding · Pelajaran

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.

Semua pelajaran dalam kursus ini

  1. Fungsi Generik
  2. Struct dan Enum Generik
  3. Batas Trait
  4. Klausa where dan Banyak Batas
← Kembali ke Learn Rust Coding