Pelajaran modul (1/2)
Generik dan Fungsi
Generik memungkinkan Anda menulis kode yang fleksibel dan dapat digunakan kembali, menghindari duplikasi logika untuk tipe data yang berbeda. Daripada mendefinisikan beberapa fungsi atau struktur untuk tipe yang berbeda (seperti i32, f64, atau String), kita dapat menggunakan parameter tipe generik, yang biasanya diwakili oleh huruf T.
Kompiler Rust mengelola obat generik menggunakan proses yang disebut monomorfisasi: selama kompilasi, ia menghasilkan salinan kode generik untuk setiap jenis konkret yang benar-benar digunakan. Ini berarti tidak ada overhead kinerja waktu proses.
Fungsi Generik
Untuk mendefinisikan fungsi generik, kita masukkan parameter tipe <T> tepat setelah nama fungsi dan sebelum daftar argumen:
fn print_value<T: std::fmt::Debug>(value: T) {
println!("Value: {:?}", value);
}Dalam fungsi generik, kita bisa menggunakan tipe generik T untuk tipe argumen dan tipe kembalian:
fn identity<T>(value: T) -> T {
value
}Struktur Generik
Kita juga dapat menggunakan parameter tipe generik di dalam struktur (struct) untuk menentukan bidang fleksibel:
struct KeyValuePair<K, V> {
key: K,
value: V,
}
fn main() {
let pair = KeyValuePair {
key: String::from("age"),
value: 30,
};
}Dalam blok impl untuk struct generik, kita harus mendeklarasikan parameter tipe <T> tepat setelah kata kunci impl untuk menunjukkan bahwa kita menerapkan metode pada struktur generik:
struct Container<T> {
value: T,
}
impl<T> Container<T> {
fn new(value: T) -> Self {
Container { value }
}
fn value(&self) -> &T {
&self.value
}
}Cobalah sendiri
Latihan 1: Struktur Poin
Definisikan struct generik bernama Point<T> dengan dua bidang: x bertipe T dan y bertipe T. Dalam fungsi utama, buat instance variabel point yang berisi Point dengan nilai integer x = 5 dan y = 10, lalu cetak nilai point.x.
Tunjukkan petunjuk
Deklarasikan struct menggunakan `struct Point<T> { x: T, y: T }`. Buat instance di main dan gunakan `point.x` untuk mencetaknya.
Solusi tersedia setelah 3 upaya
Latihan 2: Membalikkan Tuple dengan swap
Tulis fungsi generik bernama swap<T> yang menerima tupel dari dua elemen (T, T) dan mengembalikan tupel baru (T, T) dengan posisinya terbalik. Pada fungsi utama, panggil fungsi dengan tupel (1, 2) dan cetak hasilnya.
Tunjukkan petunjuk
Tanda tangan fungsi harus `fn swap<T>(pair: (T, T)) -> (T, T)`. Kembalikan tupel terbalik dengan `(pair.1, pair.0)`.
Solusi tersedia setelah 3 upaya
Latihan 3: Struktur Kontainer
Definisikan struct generik Container<T> yang berisi bidang nilai tipe T. Implementasikan blok impl generik untuk mendefinisikan metode baru yang menerima nilai tipe T dan mengembalikan instance Container<T>.
Tunjukkan petunjuk
Gunakan `impl<T> Container<T>`untuk mengimplementasikan metode terkait`fn new(value: T) -> Self { Container { value } }`.
Solusi tersedia setelah 3 upaya