Struct Generik
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Rust di Coddy. Pelajaran 24 dari 61.
Sejauh ini, setiap struct yang kamu buat memiliki field dengan tipe yang spesifik dan konkret. Sebuah Pet memiliki nama bertipe String, sebuah Rectangle memiliki dimensi bertipe f64. Namun, bagaimana jika kamu ingin membuat struct yang dapat menyimpan jenis data apa pun?
Di sinilah generics berperan. Generics memungkinkan kamu menulis kode yang fleksibel dan dapat digunakan kembali, yang bekerja dengan berbagai tipe. Alih-alih menetapkan tipe tertentu secara langsung, kamu menggunakan placeholder, biasanya T, yang diganti dengan tipe konkret saat kamu menggunakan struct.
Berikut struct pembungkus sederhana yang dapat menyimpan tipe apa pun:
struct Wrapper<T> {
value: T,
}
<T> setelah nama struct mendeklarasikan parameter tipe generik. Di dalam struct, T berfungsi sebagai pengganti tipe apa pun yang akan kamu gunakan. Saat membuat instance, Rust menyimpulkan tipe konkretnya:
let int_wrapper = Wrapper { value: 42 }; // T bertipe i32
let float_wrapper = Wrapper { value: 3.14 }; // T bertipe f64
let text_wrapper = Wrapper { value: "hello" }; // T bertipe &str
Masing-masing memiliki tipe konkret yang berbeda, yaitu Wrapper<i32>, Wrapper<f64>, dan Wrapper<&str>, tetapi semuanya menggunakan definisi struct yang sama. Dengan begitu, kamu tidak perlu menulis struct IntWrapper, FloatWrapper, dan StringWrapper secara terpisah, padahal semuanya pada dasarnya melakukan hal yang sama.
Huruf T hanyalah konvensi (singkatan dari "Type"). Kamu bisa menggunakan identifier valid apa pun, tetapi T merupakan standar di Rust dan sebagian besar bahasa lain yang memiliki generik.
Tantangan
MudahMari buat container generik yang dapat menampung nilai dengan tipe apa pun! Kamu akan membuat struct Container untuk menunjukkan bagaimana generik membuat kodemu fleksibel dan dapat digunakan kembali.
Kamu akan membagi kodemu ke dalam dua file:
container.rs: Definisikan struct generik publik bernamaContainer<T>dengan satu field publikitembertipeT. Container ini harus dapat menampung tipe apa pun: bilangan bulat, bilangan desimal, string, atau apa pun.main.rs: Sertakan module container-mu dan tunjukkan fleksibilitasnya dengan membuat container yang menampung tipe data berbeda. Kamu akan membuat tiga container dan menampilkan isi masing-masing.
Di file utama, buat container berikut:
- Container yang menampung nilai bilangan bulat (input pertama, diuraikan sebagai
i32) - Container yang menampung nilai bilangan desimal (input kedua, diuraikan sebagai
f64) - Container yang menampung string (input ketiga, disimpan sebagai
String)
Output-mu harus menampilkan isi setiap container dalam format ini:
Integer container: {value}
Float container: {value}
String container: {value}Contohnya, dengan input 42, 3.14, dan hello:
Integer container: 42
Float container: 3.14
String container: helloPerhatikan bagaimana definisi Container<T> yang sama dapat digunakan untuk ketiga tipe berbeda: itulah keunggulan generik!
Kamu akan menerima tiga input: nilai bilangan bulat, nilai bilangan desimal, dan nilai string.
Coba sendiri
mod container;
use container::Container;
fn main() {
// Baca ketiga input
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let int_value: i32 = input1.trim().parse().expect("Failed to parse integer");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let float_value: f64 = input2.trim().parse().expect("Failed to parse float");
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 tiga container menggunakan Container<T>
// 1. Container bilangan bulat yang menyimpan int_value
// 2. Container bilangan desimal yang menyimpan float_value
// 3. Container string yang menyimpan string_value
// TODO: Cetak isi setiap container dalam format yang diminta
// Integer container: {value}
// Float container: {value}
// String container: {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