Fungsi adalah resep bernama: ia menerima bahan (parameter), mengolahnya, lalu menyerahkan hasilnya (return value). Di Rust, tipe tiap bahan dan tipe hasilnya wajib ditulis. Bayangin kartu hitung di meja kasir Kedai Martabak Bang Rusdi: "beri aku harga dan jumlah porsi, aku kembalikan totalnya". Kotak bahannya berlabel: harga harus angka bulat, porsi juga. Hasilnya diserahkan lewat piring di baris terakhir resep. Kalau piring itu malah ditutup titik koma, yang sampai ke kasir cuma nampan kosong.
🧪 Tebakan cepat: di fungsi
total_harga, baris terakhirnya diberi titik koma:harga * porsi;. Apakah program masih mencetakTotal: 76000? Tebak dulu, jawabannya ada di bagian "Expression dan statement".
Membuat dan memanggil fungsi
fn total_harga(harga: u32, porsi: u32) -> u32 {
harga * porsi
}
fn main() {
let total = total_harga(38000, 2);
println!("Total: {}", total);
}
Total: 76000
fn total_harga(...)membuat fungsi. Namanya snake_case, sama seperti variabel. Fungsi boleh ditulis di atas atau di bawahmain.harga: u32, porsi: u32adalah parameter. Tiap parameter wajib punya tipe. Rust gak menebak tipe parameter.-> u32adalah tipe return: fungsi ini menyerahkan sebuahu32.harga * porsidi baris terakhir, tanpa titik koma, adalah nilai yang dikembalikan.total_harga(38000, 2)memanggilnya: 38000 masuk keharga, 2 keporsi, sesuai urutan. Hasilnya, 76000, disimpan ditotal.
Expression dan statement
Rust membedakan dua jenis baris:
- Expression menghasilkan nilai:
38000,harga * porsi,total_harga(38000, 2). - Statement adalah perintah yang diakhiri
;. Ia gak menyerahkan nilai, atau tepatnya menyerahkan(), nilai kosong yang tipenya juga ditulis().
Titik koma mengubah expression jadi statement. Ini kode tebakan tadi:
error[E0308]: mismatched types
--> src/main.rs:1:43
|
1 | fn total_harga(harga: u32, porsi: u32) -> u32 {
| ----------- ^^^ expected `u32`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
2 | harga * porsi;
| - help: remove this semicolon to return this value
- Fungsi berjanji menyerahkan
u32, tapi karena titik koma, badannya gak punya expression di akhir, jadi yang diserahkan(). help:menunjuk titik koma yang harus dihapus. Compile gagal, jadi gak ada yang tercetak. Itu jawaban tebakannya.
return, dan fungsi tanpa hasil
fn total_harga(harga: u32, porsi: u32) -> u32 {
return harga * porsi;
}
fn cetak_struk(menu: &str, total: u32) {
println!("{}: {}", menu, total);
}
fn main() {
cetak_struk("Martabak telur x2", total_harga(38000, 2));
}
Martabak telur x2: 76000
returnmenyerahkan nilai dan langsung keluar dari fungsi. Denganreturn, titik koma boleh. Kebiasaan di Rust: baris terakhir cukup tanpareturndan tanpa titik koma,returndipakai untuk keluar lebih awal.cetak_strukgak punya->. Fungsi tanpa tipe return menyerahkan(): tugasnya cuma mencetak.menu: &strartinya parameter bertipe teks.
Memilih hasil dengan if
Fungsi sering harus memilih hasilnya. Detail if ada di pelajaran berikutnya. Untuk sekarang, pola ini yang perlu kamu kenal:
fn harga_menu(menu: &str) -> u32 {
if menu == "manis" {
32000
} else if menu == "telur" {
38000
} else if menu == "es teh" {
5000
} else {
0
}
}
fn main() {
println!("{}", harga_menu("telur"));
println!("{}", harga_menu("bakso"));
}
38000
0
menu == "manis"membandingkan teks, hasilnyatrueataufalse. Dua tanda sama dengan untuk membandingkan, satu untuk mengisi.- Cuma satu cabang yang dipilih, dan nilai di cabang itu, tanpa titik koma, jadi hasil fungsi.
elseterakhir menangkap semua menu yang gak dikenal, jadi"bakso"dapat0.- Untuk
f64, angka bulat dicetak tanpa.0: fungsi yang mengembalikan13.0mencetak13.
⚠️ Jebakan yang sering ketemu
- Titik koma di baris terakhir.
expected `u32`, found `()`artinya hasilnya tertutup titik koma. Hapus titik komanya. - Parameter tanpa tipe.
fn total_harga(harga, porsi: u32)ditolak denganexpected one of `:`, `@`, or `|`, found `,`. Tulisharga: u32. - Lupa
->. Kalau badan fungsi menghasilkan angka tapi->-nya gak ada, compiler menulisexpected `()`, found `u32`dan menyarankan-> u32. - Argumen yang salah.
total_harga(38000)ditolak denganthis function takes 2 arguments but 1 argument was supplied, dantotal_harga(38000, 2.5)denganexpected `u32`, found floating-point number.
TL;DR: Fungsi ditulis fn nama(param: Tipe, ...) -> TipeHasil { ... }. Tiap parameter wajib bertipe, dan -> menulis tipe hasilnya. Hasil fungsi adalah expression terakhir tanpa titik koma: harga * porsi. Titik koma mengubahnya jadi statement yang menyerahkan (), dan compiler menolak dengan expected `u32`, found `()` plus saran menghapus titik koma. return keluar lebih awal, dan fungsi tanpa -> menyerahkan (). Untuk memilih hasil, pakai if ... else if ... else, tiap cabang berisi nilai tanpa titik koma.