method Generik
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 25 dari 61.
Struct generik dapat menyimpan tipe apa pun, tetapi tidak terlalu berguna tanpa method untuk berinteraksi dengan datanya. Untuk mendefinisikan method bagi struct generik, kamu memerlukan sintaks khusus di blok impl.
Kuncinya adalah mendeklarasikan parameter generik pada impl itu sendiri:
struct Wrapper<T> {
value: T,
}
impl<T> Wrapper<T> {
fn get(&self) -> &T {
&self.value
}
}
Perhatikan impl<T> sebelum Wrapper<T>. Ini memberi tahu Rust bahwa T adalah parameter tipe generik untuk seluruh blok implementasi. Tanpa deklarasi ini, Rust akan mencari tipe konkret bernama T dan gagal menemukannya.
method get mengembalikan &T: referensi ke tipe apa pun yang disimpan wrapper. Ini berfungsi baik saat T berupa integer, string, maupun tipe lainnya:
let num_wrapper = Wrapper { value: 100 };
let text_wrapper = Wrapper { value: "Rust" };
println!("{}", num_wrapper.get()); // 100
println!("{}", text_wrapper.get()); // Rust
Definisi method yang sama berfungsi untuk keduanya, karena T generik menyesuaikan diri dengan setiap tipe konkret saat kompilasi.
Tantangan
MudahMari kita kembangkan container generikmu dengan method! Kamu akan membuat struct Box (jangan keliru dengan Box standar Rust) yang dapat menyimpan tipe apa pun dan menyediakan method untuk berinteraksi dengan isinya.
Kamu akan mengatur kodemu dalam dua file:
mybox.rs: Definisikan struct generik publik bernamaMyBox<T>dengan field privatcontentsbertipeT. Implementasikan method untuk struct ini:- Fungsi terkait
newyang membuatMyBoxbaru dengan nilai yang diberikan - Method
peekyang mengembalikan referensi ke isinya (menggunakan&self) - Method
replaceyang menerima nilai baru dan mengganti isi saat ini (menggunakan&mut self)
- Fungsi terkait
main.rs: Sertakan module-mu dan tunjukkan method generik yang bekerja dengan tipe berbeda. Kamu akan membuat box, melihat isinya, dan mengganti nilai untuk menunjukkan cara kerja method tersebut.
Ingat sintaks utama untuk mengimplementasikan method pada struct generik: kamu perlu menulis impl<T> sebelum MyBox<T> untuk memberi tahu Rust bahwa T adalah parameter generik untuk seluruh blok implementasi.
Di file utamamu, tunjukkan cara menggunakan MyBox dengan:
- Membuat box dengan bilangan bulat (input pertama, diuraikan sebagai
i32) - Melihat isinya dan mencetak nilainya
- Mengganti isinya dengan bilangan bulat baru (input kedua, diuraikan sebagai
i32) - Melihat isinya lagi untuk menampilkan nilai yang sudah diperbarui
- Membuat box kedua dengan string (input ketiga)
- Melihat isi box string
Output-mu harus mengikuti format ini:
Integer box contains: {value}
After replace: {value}
String box contains: {value}Contohnya, dengan input 10, 25, dan Rust:
Integer box contains: 10
After replace: 25
String box contains: RustKamu akan menerima tiga input: bilangan bulat awal, bilangan bulat pengganti, dan nilai string.
Coba sendiri
mod mybox;
use mybox::MyBox;
fn main() {
// Baca input
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let initial_int: i32 = input1.trim().parse().expect("Invalid integer");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let replacement_int: i32 = input2.trim().parse().expect("Invalid integer");
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let string_value = input3.trim().to_string();
// TODO: Buat MyBox dengan bilangan bulat awal
// TODO: Lihat isinya dan cetak: "Integer box contains: {value}"
// TODO: Ganti isinya dengan bilangan bulat pengganti
// TODO: Lihat lagi isinya dan cetak: "After replace: {value}"
// TODO: Buat MyBox kedua dengan nilai string
// TODO: Lihat isi MyBox yang berisi string dan cetak: "String box contains: {value}"
}
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 AmanLatihan sendiri: Compiler Rust online