Menu
CoddyTech

Beberapa Batasan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 41 dari 61.

Terkadang satu batasan trait saja tidak cukup. Kamu mungkin membutuhkan tipe generik yang bisa dicetak dan memberikan ringkasan. Rust memungkinkan kamu mewajibkan beberapa trait dengan sintaks +.

Berikut cara menentukan bahwa suatu tipe harus mengimplementasikan dua trait:

use std::fmt::Display;

trait Summary {
    fn summarize(&self) -> String;
}

fn announce<T: Display + Summary>(item: T) {
    println!("Breaking news: {}", item);
    println!("Summary: {}", item.summarize());
}

Batasan T: Display + Summary berarti "T harus mengimplementasikan Display dan Summary." Di dalam fungsi, kamu bisa menggunakan kemampuan dari kedua trait: mencetak dengan {} (dari Display) dan memanggil summarize() (dari Summary).

Kamu bisa menggabungkan trait sebanyak yang diperlukan:

fn process<T: Display + Summary + Clone>(item: T) {
    // Bisa mencetak, merangkum, DAN mengkloning
}

Pola ini penting saat fungsimu bergantung pada beberapa perilaku. Alih-alih menerima tipe apa pun dan berharap semuanya berfungsi, kamu menyatakan dengan jelas kemampuan apa saja yang diperlukan, lalu compiler memastikannya saat kompilasi.

challenge icon

Tantangan

Mudah

Mari kita buat sistem inspeksi produk yang mengharuskan item memiliki beberapa kemampuan! Kamu akan membuat fungsi generik yang hanya menerima tipe yang mengimplementasikan trait kustom dan trait standar, untuk menunjukkan bagaimana sintaks + menggabungkan beberapa batasan.

Kamu akan mengatur kodemu dalam dua file:

  • product.rs: Definisikan trait publik Inspectable dengan method bernama inspect yang menerima &self dan mengembalikan String berisi detail inspeksi. Lalu buat struct publik Gadget dengan field publik name (String) dan serial (u32). Gadget-mu harus mengimplementasikan Inspectable (mengembalikan Inspecting: {name}) dan std::fmt::Display (memformat sebagai {name} (SN: {serial})). Terakhir, buat fungsi generik publik bernama full_report yang menerima tipe apa pun T yang mengimplementasikan Display dan Inspectable. Fungsi ini harus mencetak dua baris: pertama item menggunakan formatter {}, lalu hasil pemanggilan inspect().
  • main.rs: Sertakan module produkmu dan buat instance Gadget menggunakan input yang diberikan. Panggil full_report dengan gadget-mu untuk menunjukkan bahwa gadget tersebut memenuhi kedua persyaratan trait.

Keunggulan beberapa batasan adalah fungsi full_report-mu dapat menggunakan kemampuan dari kedua trait, menampilkan item dengan rapi DAN mendapatkan detail inspeksi, semuanya dijamin saat compile.

Output-mu harus menampilkan format tampilan dan hasil inspeksi:

{name} (SN: {serial})
Inspecting: {name}

Contohnya, dengan input Smartwatch dan 98765:

Smartwatch (SN: 98765)
Inspecting: Smartwatch

Kamu akan menerima dua input: nama gadget dan nomor seri (parse sebagai u32).

Coba sendiri

mod product;

use product::{Gadget, full_report};

fn main() {
    // Baca input
    let mut name = String::new();
    std::io::stdin().read_line(&mut name).expect("Failed to read line");
    let name = name.trim().to_string();
    
    let mut serial_input = String::new();
    std::io::stdin().read_line(&mut serial_input).expect("Failed to read line");
    let serial: u32 = serial_input.trim().parse().expect("Failed to parse serial");
    
    // TODO: Buat instance Gadget dengan nama dan nomor seri
    
    // TODO: Panggil full_report dengan gadget-mu
}
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