Klausa where
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 42 dari 61.
Semakin banyak batasan trait yang kamu tambahkan, signature fungsi bisa semakin 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 terlalu padat. 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 berfungsi secara identik: klausa where hanya untuk 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 parameternya terlihat sekilas, dengan batasan yang dicantumkan secara terpisah di bawah. Ini adalah gaya yang lebih disukai di sebagian besar basis kode Rust saat batasannya lebih dari sekadar T: Trait.
Tantangan
MudahMari buat sistem pemrosesan data yang menggunakan klausa where agar batasan trait yang kompleks tetap mudah dibaca! Kamu akan membuat fungsi generik dengan beberapa parameter tipe, yang masing-masing memerlukan trait berbeda, lalu mengatur batasannya dengan rapi menggunakan sintaks where.
Kamu akan mengatur kodemu dalam dua file:
processor.rs: Definisikan dua trait publik dan fungsi generik yang menggunakan keduanya:Summarize: trait dengan methodsummaryyang menerima&selfdan mengembalikanStringValidate: 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: memiliki field publiktitle(String). ImplementasikanSummarizeagar mengembalikanArticle: {title}, dan turunkanClone.Form: memiliki field publikfilled(bool). ImplementasikanValidateagar mengembalikan nilaifilled.
process_itemsdengan keduanya.
Klausa where membuat signature fungsi jauh lebih rapi daripada menjejalkan semua batasan ke dalam tanda kurung sudut. Persyaratan setiap tipe muncul di barisnya sendiri, sehingga kamu dapat melihat dengan mudah kebutuhan setiap parameter generik.
Output-mu harus menampilkan ringkasan, 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