Fungsi Generik
Parameterkan perilaku berdasarkan tipe.
Fungsi Generik adalah pelajaran Learn Rust Coding gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Learn Rust Coding, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Learn Rust Coding mencakup 4 pelajaran total.
Mengapa Fungsi Generik
Fungsi generik memungkinkan Anda menulis satu fungsi yang bekerja dengan banyak tipe, alih-alih menyalin kode untuk setiap tipe. Rust mengganti tipe pengganti tersebut saat kompilasi.
Bayangkan menulis satu largest untuk bilangan bulat dan satu lagi untuk chars. Generik menyatukan keduanya menjadi satu definisi tanpa biaya saat runtime.
Parameter Tipe
Fungsi generik mendeklarasikan parameter tipe di dalam kurung sudut setelah namanya. Nama T adalah konvensi, tetapi identifier CamelCase apa pun dapat digunakan.
Parameter tersebut kemudian dapat muncul dalam argumen dan tipe pengembalian, sebagai pengganti tipe konkret apa pun yang digunakan pemanggil.
fn first<T>(pair: (T, T)) -> T {
pair.0
}Fungsi Identitas Sederhana
Program ini mendefinisikan echo generik yang mengembalikan argumennya tanpa perubahan. Fungsi ini dipanggil sekali dengan bilangan bulat dan sekali dengan irisan string.
Kompiler membuat versi konkret terpisah untuk setiap tipe yang benar-benar digunakan.
fn echo<T>(value: T) -> T {
value
}
fn main() {
println!("{}", echo(42));
println!("{}", echo("hi"));
}Monomorfisasi
Rust menggunakan monomorfisasi: saat kompilasi, Rust menghasilkan salinan khusus fungsi untuk setiap tipe konkret yang digunakan. Tidak ada boxing atau pengiriman virtual.
Hasilnya adalah kode generik yang berjalan secepat kode khusus tipe yang ditulis secara manual.
Generik Memerlukan Batasan
Di dalam fungsi generik, Anda hanya dapat menggunakan operasi yang didukung oleh setiap tipe yang mungkin. T biasa tidak dapat dijumlahkan, dibandingkan, atau dicetak.
Kode ini gagal dikompilasi karena T mungkin tidak menerapkan perbandingan. Selanjutnya kita akan memperbaikinya dengan batasan trait.
fn larger<T>(a: T, b: T) -> T {
if a > b { a } else { b }
}Menambahkan Batasan Trait
Untuk membandingkan nilai, batasi T dengan PartialOrd. Batasan ini menjamin bahwa tipe tersebut mendukung operator >.
Kami juga menambahkan Copy agar nilai dapat dikembalikan tanpa masalah pemindahan untuk tipe sederhana seperti bilangan bulat.
fn larger<T: PartialOrd + Copy>(a: T, b: T) -> T {
if a > b { a } else { b }
}Memanggil Fungsi yang Dibatasi
Sekarang fungsi ini bekerja untuk tipe apa pun yang menerapkan kedua trait tersebut. Bilangan bulat dan pecahan sama-sama memenuhi PartialOrd + Copy.
Kode sumber yang sama, setelah dimonomorfisasi menjadi dua versi, mencetak hasil untuk setiap pemanggilan.
fn larger<T: PartialOrd + Copy>(a: T, b: T) -> T {
if a > b { a } else { b }
}
fn main() {
println!("{}", larger(3, 9));
println!("{}", larger(2.5, 1.0));
}Beberapa Parameter Tipe
Sebuah fungsi dapat mendeklarasikan beberapa parameter tipe. Masing-masing berdiri sendiri, sehingga kedua argumen dapat memiliki tipe yang berbeda.
Di sini pair menerima T apa pun dan U apa pun, lalu mengembalikannya sebagai tuple.
fn pair<T, U>(a: T, b: U) -> (T, U) {
(a, b)
}Mencetak Nilai Generik
Untuk mencetak nilai generik dengan {}, tipe tersebut harus menerapkan Display. Kami menambahkan batasan itu agar tipe apa pun yang dapat dicetak bisa diteruskan.
Fungsi ini memberi label pada suatu nilai dan mengembalikannya, sehingga menunjukkan penggunaan batasan khusus untuk pemformatan.
use std::fmt::Display;
fn announce<T: Display>(label: &str, value: T) {
println!("{}: {}", label, value);
}
fn main() {
announce("count", 7);
announce("name", "Ada");
}Sintaks Turbofish
Terkadang kompiler tidak dapat menyimpulkan T hanya dari argumen. Turbofish ::<Type> memungkinkan Anda menentukannya secara eksplisit di lokasi pemanggilan.
Sintaks ini paling umum digunakan pada metode seperti parse dan collect ketika tipe pengembalian ambigu.
fn main() {
let n = "42".parse::<i32>().unwrap();
println!("{}", n + 1);
}Generik pada Referensi
Parameter generik juga dapat digunakan dengan referensi. Pembatasan berdasarkan referensi menghindari keharusan menggunakan Copy ketika Anda hanya perlu membaca nilai.
Helper bergaya longest_str ini meminjam dua irisan dan mengembalikan salah satunya tanpa mengambil kepemilikan.
fn pick<'a, T: PartialOrd>(a: &'a T, b: &'a T) -> &'a T {
if a > b { a } else { b }
}Pemeriksaan Singkat
Uji pemahaman Anda tentang fungsi generik dalam Rust.
Rangkuman
Fungsi generik menggunakan parameter tipe dalam kurung sudut agar dapat bekerja pada banyak tipe tanpa biaya saat runtime melalui monomorfisasi.
Operasi pada tipe generik memerlukan batasan trait seperti PartialOrd, Copy, atau Display. Gunakan turbofish ketika inferensi tidak dapat menentukan tipenya.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Fungsi Generik” gratis?
Ya — teks lengkap “Fungsi Generik” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Learn Rust Coding, upgrade ke CoddyKit PRO. Kursus Learn Rust Coding mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Fungsi Generik”?
Parameterkan perilaku berdasarkan tipe. Kamu berlatih Learn Rust Coding dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Learn Rust Coding?
Tidak diperlukan pengalaman sebelumnya. Learn Rust Coding di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Fungsi Generik” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Learn Rust Coding ini?
Ya. Setiap pelajaran Learn Rust Coding menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.