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.
Tantangan
MudahMari 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 publikInspectabledengan method bernamainspectyang menerima&selfdan mengembalikanStringberisi detail inspeksi. Lalu buat struct publikGadgetdengan field publikname(String) danserial(u32). Gadget-mu harus mengimplementasikanInspectable(mengembalikanInspecting: {name}) danstd::fmt::Display(memformat sebagai{name} (SN: {serial})). Terakhir, buat fungsi generik publik bernamafull_reportyang menerima tipe apa punTyang mengimplementasikanDisplaydanInspectable. Fungsi ini harus mencetak dua baris: pertama item menggunakan formatter{}, lalu hasil pemanggilaninspect().main.rs: Sertakan module produkmu dan buat instanceGadgetmenggunakan input yang diberikan. Panggilfull_reportdengan 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: SmartwatchKamu 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
}
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