Klausa where
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 42 dari 61.
Saat kamu menambahkan lebih banyak batasan trait, tanda tangan fungsi bisa sulit dibaca. Perhatikan fungsi dengan beberapa parameter generik, yang masing-masing memerlukan beberapa trait:
fn complex_operation<T: Display + Clone, U: Debug + Summary>(first: T, second: U) {
// ...
}
Ini berfungsi, tetapi signature-nya mulai penuh. Klausa where menawarkan alternatif yang lebih rapi dengan memindahkan batas trait setelah daftar parameter:
fn complex_operation<T, U>(first: T, second: U)
where
T: Display + Clone,
U: Debug + Summary,
{
// ...
}
Kedua versi memiliki fungsi yang identik: klausa where hanya bertujuan meningkatkan keterbacaan. Persyaratan setiap tipe ditampilkan pada barisnya sendiri, sehingga kamu dapat dengan mudah melihat kebutuhan setiap parameter generik.
Klausa where menjadi sangat berguna saat batasannya rumit atau saat kamu memiliki banyak parameter generik. Klausa ini membuat nama fungsi dan parameter langsung terlihat, dengan batasan yang dicantumkan secara terpisah di bawahnya. Gaya ini lebih disukai di sebagian besar codebase Rust saat batasan melampaui T: Trait sederhana.
Tantangan
MudahMari buat sistem pemrosesan data yang menggunakan klausa where agar batas trait yang kompleks tetap mudah dibaca! Kamu akan membuat fungsi generik dengan beberapa parameter tipe, yang masing-masing memerlukan trait berbeda, lalu menyusun batas-batasnya dengan rapi menggunakan sintaks where.
Kamu akan menyusun kodemu dalam dua file:
processor.rs: Definisikan dua trait publik dan fungsi generik yang menggunakan keduanya:Summarize: sebuah trait dengan methodsummaryyang menerima&selfdan mengembalikanStringValidate: sebuah trait dengan methodvalidateyang menerima&selfdan mengembalikanbool
process_itemsyang menerima dua parameter dengan tipe generik berbeda. Gunakan klausawhereuntuk menentukan bahwa tipe pertama harus mengimplementasikanClonedanSummarize, sedangkan tipe kedua harus mengimplementasikanValidate. Fungsi tersebut harus mencetak ringkasan item pertama, lalu mencetak apakah item kedua valid.main.rs: Buat dua struct publik yang mengimplementasikan trait yang diperlukan:Article: dengan field publiktitle(String). ImplementasikanSummarizeagar mengembalikanArticle: {title}, dan turunkanClone.Form: dengan field publikfilled(bool). ImplementasikanValidateagar mengembalikan nilaifilled.
process_itemsdengan keduanya.
Klausa where membuat signature fungsi jauh lebih rapi daripada menjejalkan semua batas ke dalam tanda kurung sudut. Persyaratan setiap tipe ditulis pada barisnya sendiri, sehingga kamu dapat melihat dengan mudah apa yang diperlukan setiap parameter generik.
Output-mu harus menampilkan ringkasan yang diikuti hasil validasi:
Article: {title}
Valid: {true/false}Contohnya, dengan input Rust Tips dan true:
Article: Rust Tips
Valid: trueDan dengan input Breaking News dan false:
Article: Breaking News
Valid: falseKamu akan menerima dua input: judul artikel dan apakah formulir sudah diisi (parse sebagai bool).
Coba sendiri
mod processor;
use processor::{Summarize, Validate, process_items};
use std::io;
// TODO: Definisikan struct publik Article dengan field publik title (String)
// Turunkan Clone untuk Article
// TODO: Implementasikan Summarize untuk Article
// method summary harus mengembalikan "Article: {title}"
// TODO: Definisikan struct publik Form dengan field publik filled (bool)
// TODO: Implementasikan Validate untuk Form
// method validate harus mengembalikan nilai filled
fn main() {
let mut title = String::new();
io::stdin().read_line(&mut title).expect("Failed to read line");
let title = title.trim().to_string();
let mut filled_input = String::new();
io::stdin().read_line(&mut filled_input).expect("Failed to read line");
let filled: bool = filled_input.trim().parse().expect("Failed to parse bool");
// TODO: Buat Article dengan title yang diberikan
// TODO: Buat Form dengan nilai filled yang diberikan
// TODO: Panggil process_items dengan article dan form
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Method dan Perilaku
Pengantar Blok ImplementasiParameter SelfMethod MutableFungsi TerkaitBeberapa Blok ImplementasiMethod BerantaiRangkuman: Aksi Persegi Panjang4Proyek: Hewan Peliharaan Virtual
Mendefinisikan Hewan PeliharaanMemberi Makan Hewan Peliharaan2Enkapsulasi dan module
Dasar-Dasar moduleKata Kunci publicField privateGetterSetterRekap: Loker Aman8Trait sebagai Batasan
Sintaks Batasan TraitBeberapa BatasanKlausa whereMengembalikan Tipe dengan TraitRangkuman: Pencetak GenerikLatihan sendiri: Compiler Rust online