Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 method summary yang menerima &self dan mengembalikan String
    • Validate: sebuah trait dengan method validate yang menerima &self dan mengembalikan bool
    Lalu buat fungsi generik publik bernama process_items yang menerima dua parameter dengan tipe generik berbeda. Gunakan klausa where untuk menentukan bahwa tipe pertama harus mengimplementasikan Clone dan Summarize, sedangkan tipe kedua harus mengimplementasikan Validate. 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 publik title (String). Implementasikan Summarize agar mengembalikan Article: {title}, dan turunkan Clone.
    • Form: dengan field publik filled (bool). Implementasikan Validate agar mengembalikan nilai filled.
    Gunakan input yang diberikan untuk membuat Article dan Form, lalu panggil process_items dengan 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: true

Dan dengan input Breaking News dan false:

Article: Breaking News
Valid: false

Kamu 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
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Rust online