Belajar Pengaturcaraan Rust · Pelajaran

Penggunaan Trait Lanjutan: Jenis Berkaitan

Terokai jenis berkaitan dalam trait untuk mentakrifkan ruang letak bagi jenis yang mesti dilaksanakan oleh sesuatu trait, demi abstraksi yang lebih fleksibel.

Pelajaran 3 daripada 311 langkah

Penggunaan Trait Lanjutan: Jenis Berkaitan ialah pelajaran Belajar Pengaturcaraan Rust percuma di CoddyKit. Ini ialah pelajaran 3 daripada 3. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Belajar Pengaturcaraan Rust, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 3 pelajaran.

Apakah Jenis Berkaitan?

Selamat datang ke topik lanjutan dalam trait Rust: Jenis Berkaitan! Ini ialah ciri berkuasa yang menambahkan fleksibiliti dan kejelasan pada takrifan trait anda.

Anggap jenis berkaitan sebagai jenis pemegang tempat yang diisytiharkan dalam sesuatu trait. Daripada trait itu sendiri menjadi generik terhadap sesuatu jenis, pelaksana trait menentukan jenis konkrit untuk pemegang tempat ini.

Mengapa Menggunakan Jenis Berkaitan?

Jenis berkaitan membantu menjadikan trait lebih kemas dan mudah digunakan, terutamanya apabila sesuatu trait mentakrifkan beberapa kaedah yang semuanya beroperasi pada jenis berkaitan tertentu.

  • Kejelasan: Jenis berkaitan dikumpulkan secara terus dalam skop trait.
  • Fleksibiliti: Setiap pelaksana trait boleh menentukan jenis khususnya sendiri untuk pemegang tempat ini.
  • Kurang kod berulang: Anda tidak perlu mengulangi parameter jenis generik merentas semua tandatangan kaedah dalam trait.

Mentakrifkan Trait dengan Jenis Berkaitan

Mari kita lihat sintaks asas untuk mentakrifkan trait dengan jenis berkaitan. Kita menggunakan kata kunci type dalam takrifan trait.

Di sini, trait Container perlu mengetahui jenis Item yang akan disimpannya. Trait itu sendiri tidak menentukannya, sebaliknya hanya menyatakan bahawa jenis sedemikian wujud.

trait Container {
    type Item; // Associated type declaration
    fn add(&mut self, item: Self::Item);
    fn contains(&self, item: &Self::Item) -> bool;
}

Melaksanakan Trait

Apabila anda melaksanakan trait dengan jenis berkaitan untuk jenis tertentu (contohnya, satu struct), anda mesti menyatakan dengan jelas apakah jenis konkrit bagi jenis berkaitan itu.

Dalam contoh kita, MyVec melaksanakan Container, dan kita mengisytiharkan bahawa jenis Item ialah i32.

trait Container {
    type Item;
    fn add(&mut self, item: Self::Item);
    fn contains(&self, item: &Self::Item) -> bool;
}

struct MyVec {
    elements: Vec<i32>,
}

impl Container for MyVec {
    type Item = i32; // Specify the concrete type for Item

    fn add(&mut self, item: Self::Item) {
        self.elements.push(item);
    }

    fn contains(&self, item: &Self::Item) -> bool {
        self.elements.contains(item)
    }
}

fn main() {
    let mut my_vec = MyVec { elements: vec![] };
    my_vec.add(10);
    my_vec.add(20);
    println!("Contains 10: {}", my_vec.contains(&10));
    println!("Contains 30: {}", my_vec.contains(&30));
}

Jenis Berkaitan berbanding Generik

Ini ialah perbezaan yang penting! Jika Container bersifat generik (contohnya, trait Container), anda boleh melaksanakan Container for MyVec DAN Container for MyVec.

Dengan jenis berkaitan, bagi satu impl Container for MyVec, jenis Item hanya boleh menjadi satu jenis khusus (contohnya, i32). Anda tidak boleh melaksanakan Container untuk MyVec dua kali dengan jenis Item yang berbeza.

Contoh Dunia Sebenar: Trait `Iterator`

Salah satu contoh jenis berkaitan yang paling lazim dan jelas dalam pustaka standard Rust ialah trait Iterator.

Trait Iterator mempunyai jenis berkaitan yang dipanggil Item, yang mewakili jenis nilai yang akan dihasilkan oleh iterator. Setiap pelaksana Iterator menentukan dengan tepat jenis Item yang dihasilkannya.

// Simplified Iterator trait
trait Iterator {
    type Item;
    fn next(&mut self) -> Option<Self::Item>;
}

struct Counter {
    count: u32,
}

impl Iterator for Counter {
    type Item = u32; // This iterator yields u32 values

    fn next(&mut self) -> Option<Self::Item> {
        if self.count < 5 {
            self.count += 1;
            Some(self.count)
        } else {
            None
        }
    }
}

fn main() {
    let mut counter = Counter { count: 0 };
    // Using the iterator directly
    while let Some(num) = counter.next() {
        println!("Current count: {}", num);
    }
}

Mengehadkan Jenis Berkaitan

Sama seperti parameter jenis generik, anda boleh menambahkan batas trait pada jenis berkaitan. Ini memastikan jenis konkrit yang dipilih oleh pelaksana mematuhi tingkah laku atau keupayaan tertentu.

Di sini, Item: std::fmt::Debug bermaksud jenis berkaitan itu mesti melaksanakan trait Debug, yang membolehkan kita mencetaknya.

trait PrintableContainer {
    type Item: std::fmt::Debug; // Item must implement Debug
    fn add(&mut self, item: Self::Item);
    fn print_all(&self);
}

struct DebugVec {
    elements: Vec<String>,
}

impl PrintableContainer for DebugVec {
    type Item = String; // String implements Debug

    fn add(&mut self, item: Self::Item) {
        self.elements.push(item);
    }

    fn print_all(&self) {
        for item in &self.elements {
            println!("Item: {:?}", item); // Uses Debug formatting
        }
    }
}

fn main() {
    let mut debug_vec = DebugVec { elements: vec![] };
    debug_vec.add(String::from("Hello"));
    debug_vec.add(String::from("World"));
    debug_vec.print_all();
}

Jenis Berkaitan dengan Nilai Lalai

Untuk fleksibiliti yang lebih tinggi, jenis berkaitan boleh mempunyai jenis konkrit lalai. Pelaksana kemudiannya boleh memilih sama ada untuk menggunakan nilai lalai atau menggantikannya dengan jenis yang berbeza.

Ini berguna untuk trait yang mempunyai tingkah laku lalai yang lazim, tetapi kadangkala memerlukan jenis tersuai.

trait Processor {
    type Input = String; // Default input type
    type Output = String; // Default output type

    fn process(&self, input: Self::Input) -> Self::Output;
}

struct SimpleProcessor;

impl Processor for SimpleProcessor {
    // Here, we use the default Input and Output types (String)
    fn process(&self, input: String) -> String {
        format!("Processed: {}", input.to_uppercase())
    }
}

struct CustomIntProcessor;

impl Processor for CustomIntProcessor {
    type Input = i32; // Override default Input
    type Output = i32; // Override default Output

    fn process(&self, input: i32) -> i32 {
        input * 2
    }
}

fn main() {
    let simple = SimpleProcessor;
    println!("Simple processor: {}", simple.process(String::from("hello rust")));

    let custom = CustomIntProcessor;
    println!("Custom int processor: {}", custom.process(10));
}

Bila Memilih Jenis Berkaitan

Bilakah anda patut memilih jenis berkaitan berbanding parameter jenis generik pada trait itu sendiri?

  • Apabila sesuatu konsep trait secara asasnya beroperasi pada satu jenis berkaitan khusus bagi *setiap* pelaksanaan (contohnya, Iterator sentiasa menghasilkan satu jenis Item).
  • Untuk mengelakkan pengulangan parameter generik pada setiap tandatangan kaedah, lalu menghasilkan takrifan trait yang lebih kemas.
  • Apabila anda mahu mentakrifkan sesuatu jenis *dalam* skop trait, dan bukannya menjadikan trait itu sendiri generik.

Semak Pemahaman Anda

Mari kita uji pemahaman anda tentang jenis berkaitan secara ringkas.

Ulang Kaji: Jenis Berkaitan

Syabas! Dalam pelajaran ini, anda telah meneroka jenis berkaitan dalam trait Rust. Anda telah mempelajari bahawa:

  • Jenis berkaitan ialah jenis pemegang tempat yang ditakrifkan dalam sesuatu trait.
  • Pelaksana trait menentukan jenis konkrit bagi pemegang tempat ini.
  • Jenis ini memberikan kejelasan dan fleksibiliti dengan mengumpulkan jenis berkaitan secara terus dalam trait.
  • Jenis ini berbeza daripada parameter trait generik kerana memastikan satu jenis konkrit bagi sesuatu pelaksanaan trait.
  • Contoh seperti trait Iterator menunjukkan kegunaan praktikalnya.

Menguasai jenis berkaitan membantu anda menulis kod Rust yang lebih kukuh dan idiomatik, khususnya apabila mereka bentuk abstraksi berasaskan trait yang kompleks!

Percuma untuk bermula

Pelajari Rust dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
144

Soalan Lazim

Adakah pelajaran “Penggunaan Trait Lanjutan: Jenis Berkaitan” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Belajar Pengaturcaraan Rust, termasuk “Penggunaan Trait Lanjutan: Jenis Berkaitan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Belajar Pengaturcaraan Rust merangkumi sejumlah 3 pelajaran.

Apakah yang akan saya pelajari dalam “Penggunaan Trait Lanjutan: Jenis Berkaitan”?

Terokai jenis berkaitan dalam trait untuk mentakrifkan ruang letak bagi jenis yang mesti dilaksanakan oleh sesuatu trait, demi abstraksi yang lebih fleksibel. Anda berlatih Belajar Pengaturcaraan Rust menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Belajar Pengaturcaraan Rust?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Belajar Pengaturcaraan Rust di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 3.

Berapa lamakah pelajaran “Penggunaan Trait Lanjutan: Jenis Berkaitan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Belajar Pengaturcaraan Rust ini?

Ya. Setiap pelajaran Belajar Pengaturcaraan Rust menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menulis Kod Generik dalam Rust
  2. Mentakrifkan dan Melaksanakan Trait
  3. Penggunaan Trait Lanjutan: Jenis Berkaitan
← Kembali ke Belajar Pengaturcaraan Rust