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 memungkinkanmu meminta beberapa trait menggunakan 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 merangkai sebanyak mungkin trait yang dibutuhkan:
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 kode berfungsi, kamu menyatakan secara eksplisit kemampuan apa saja yang diperlukan, lalu compiler memastikan persyaratan tersebut terpenuhi saat kompilasi.
Tantangan
MudahMari buat sistem inspeksi produk yang mengharuskan item memiliki beberapa kemampuan! Kamu akan membuat fungsi generik yang hanya menerima tipe yang mengimplementasikan trait kustom sekaligus trait standar, untuk menunjukkan cara 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 bidang 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 pemformat{}, lalu hasil pemanggilaninspect().main.rs: Gunakan 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 kompilasi.
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 (urai 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