Menulis crate::front_of_house::hosting::add_to_waitlist() sekali masih terasa wajar; menuliskannya sepuluh kali di dalam satu module membuat jari dan mata sama-sama lelah, dan setiap pengulangan menjadi titik rawan salah ketik. Rust tidak memaksa kita mengulang path panjang: keyword use membawa nama dari tree module turun ke scope lokal, seolah nama tersebut dideklarasikan di module kita sendiri. Chapter ini membahas cara kerja use, cara mengimpor beberapa nama sekaligus dengan kurung kurawal bersarang, cara mengganti nama dengan alias as, serta wujud error E0432 yang muncul ketika path yang kita impor ternyata tidak ada.
use Membawa Nama ke Scope #
Mekanismenya sederhana namun perlu dipahami presisi: use tidak menyalin kode dan tidak menggerakkan item — use hanya menciptakan nama baru di scope saat ini yang menunjuk ke item yang sama di tree module. Nama baru itu mengikuti aturan scope biasa: hidup di dalam module tempat use ditulis, dan berakhir ketika module berakhir. Setelah use crate::front_of_house::hosting; ditulis, kata hosting resmi menjadi nama pendek yang bisa dipakai tanpa mengulang cabang-cabang di depannya. Kita terapkan pada warung kita:
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {
println!("Pelanggan masuk daftar tunggu");
}
}
}
use crate::front_of_house::hosting;
fn main() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}Output yang Dihasilkan:
Pelanggan masuk daftar tunggu
Pelanggan masuk daftar tungguMari kita bedah kode di atas:
- Baris 9 (
use crate::front_of_house::hosting;): pernyataanusemembawa modulehostingke scope crate root. Sejak baris ini, namahostingsah dipakai di seluruh scope yang sama, termasuk di dalammain. - Baris 12 dan Baris 13 (
hosting::add_to_waitlist();): pemanggilan kini cukup menulis nama yang dibawausebeserta item di dalamnya. Path panjangcrate::front_of_house::hosting::add_to_waitlist()tidak perlu lagi ditulis.
Satu keputusan gaya yang tampak di contoh: kita mengimpor module hosting, bukan langsung fungsinya. Penulisan hosting::add_to_waitlist() pada pemanggilan menjaga konteks — pembaca tahu fungsi itu urusan pendaftaran pelanggan di area hosting. Konvensi umum komunitas pun begitu: impor module hingga tingkat yang membuat pemanggilan terbaca jelas; impor fungsi atau item langsung boleh dilakukan, namun paling sering dipakai saat nama modulnya kurang menambah makna — misalnya use std::env::var; yang lazim untuk pembacaan environment variable.
Lokasi penulisan use juga mengikuti aturan scope biasa. Pernyataan di tingkat berkas — seperti contoh kita — berlaku untuk seluruh item pada module itu. Pernyataan di dalam sebuah fungsi hanya berlaku sampai kurung kurawal fungsi tersebut, dan pola ini berguna ketika satu fungsi membutuhkan nama yang tidak dipakai saudaranya. Kompilator bahkan mengingatkan lewat warning unused import ketika nama yang diimpor tidak pernah terpakai, sehingga daftar use yang menggantung tidak bersembunyi lama. Konvensi penulisan menempatkan seluruh use di bagian paling atas berkas atau module, diurutkan secara alfabetis dalam satu kelompok, agar pembaca menemukan seluruh dependensi nama dalam satu pandangan.
Mengimpor Banyak Nama dengan Kurung Kurawal Bersarang #
Program nyata jarang cukup dengan satu impor. Menumpuk baris use crate::menu::makanan;, use crate::menu::minuman;, dan seterusnya sah-sah saja, tetapi Rust menyediakan notasi lebih rapat: kurung kurawal yang mengelompokkan item se-induk, lengkap dengan kemampuan bersarang dan alias di dalamnya:
mod menu {
pub mod makanan {
pub fn tampilkan() {
println!("Nasi Goreng Spesial Rp25000");
}
}
pub mod minuman {
pub fn tampilkan() {
println!("Es Teh Manis Rp5000");
}
pub mod spesial {
pub fn tampilkan() {
println!("Kopi Susu Gula Aren Rp18000");
}
}
}
}
use crate::menu::{
makanan,
minuman::{tampilkan as tampil_minuman, spesial},
};
fn main() {
makanan::tampilkan();
tampil_minuman();
spesial::tampilkan();
}Output yang Dihasilkan:
Nasi Goreng Spesial Rp25000
Es Teh Manis Rp5000
Kopi Susu Gula Aren Rp18000Bedah kode di atas:
- Baris 21–24 (
use crate::menu::{ ... }): satu pernyataanusemengurus dua impor sekaligus. Bagian dalam kurung kurawal dibaca relatif terhadapcrate::menu, jadimakananberarticrate::menu::makanan. - Baris 23 (
minuman::{tampilkan as tampil_minuman, spesial},): kurung kurawal kedua bersarang di dalamminuman. Di dalamnya, fungsitampilkandiimpor sekaligus di-alias menjaditampil_minuman— wajib, sebabmakanan::tampilkanjuga sudah hadir di scope melalui jalur module, dan dua nama pendek sama hanya boleh menunjuk item berbeda jika salah satunya di-rename. Modulespesialikut diimpor sebagai nama module biasa. - Baris 27 (
makanan::tampilkan();): karena yang diimpor adalah modulemakanan, fungsinya tetap dipanggil dengan prefix. - Baris 28 (
tampil_minuman();): fungsi yang diimpor dan di-alias terpanggil langsung tanpa prefix. - Baris 29 (
spesial::tampilkan();): modulespesialyang diimpor dari dalam kurung bersarang dapat langsung diprefix — hasil impor bersarang bekerja sama seperti impor tingkat atas.
Alias dengan as #
Keyword as mengganti nama yang dibawa use — berguna ketika nama asli bertabrakan dengan nama lain di scope, atau ketika nama asli terlalu generik di konteks kode kita. Pola klasiknya adalah dua Result dari standard library: std::fmt::Result dan std::io::Result sama-sama bernama Result, sehingga module yang membutuhkan keduanya meng-alias masing-masing — use std::fmt::Result as FmtResult; dan use std::io::Result as IoResult;. Pola yang sama kita pakai untuk memberi nama yang lebih bermakna pada HashMap penyimpan poin pelanggan:
use std::collections::HashMap as PoinPelanggan;
fn main() {
let mut poin = PoinPelanggan::new();
poin.insert("Budi", 120);
poin.insert("Siti", 340);
println!("Budi memiliki {} poin", poin["Budi"]);
println!("Siti memiliki {} poin", poin["Siti"]);
}Output yang Dihasilkan:
Budi memiliki 120 poin
Siti memiliki 340 poinBedah kode di atas:
- Baris 1 (
use std::collections::HashMap as PoinPelanggan;): tipeHashMapdari standard library masuk ke scope dengan nama baruPoinPelanggan. Nama asliHashMaptidak ikut hadir — hanya alias-nya. - Baris 4 (
let mut poin = PoinPelanggan::new();): pembuatan map memakai alias. Kompiler menerjemahkanPoinPelangganmenjadistd::collections::HashMappada saat resolusi, jadi tidak ada biaya runtime sama sekali.
Path yang Salah: E0432 #
Keyword use memindahkan titik rawan: salah ketik pada path kini terjadi pada baris impor. Kompilator menangkapnya dengan error E0432 sebelum program berjalan. Perhatikan program berikut yang mengimpor hosting seolah modul itu berada di crate root:
use crate::hosting::add_to_waitlist;
fn main() {
add_to_waitlist();
}Pesan error kompilator:
error[E0432]: unresolved import `crate::hosting`
--> main.rs:1:12
|
1 | use crate::hosting::add_to_waitlist;
| ^^^^^^^ could not find `hosting` in the crate root
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0432`.Pesan unresolved import menyatakan bahwa path crate::hosting tidak ditemukan pada crate root — ingat, hosting sebenarnya tinggal di crate::front_of_house::hosting. Error E0432 juga muncul pada variasi lain: nama item yang salah meski module-nya benar, atau item yang ada namun privat sehingga tidak bisa diimpor. Urutan pemeriksaan yang cepat: pastikan path bertolak dari titik yang benar (crate:: untuk absolut, atau super::/self:: untuk relatif), lalu telusuri setiap segmen path dari kiri ke kanan sambil mencocokkan nama module pada tree.
Ringkasan #
Keyword use membawa nama dari tree module ke scope lokal tanpa menyalin kode: module diimpor untuk pemanggilan ber-prefix, fungsi boleh diimpor langsung, kurung kurawal bersarang merapatkan banyak impor sekaligus, dan as menyediakan alias saat nama bertabrakan atau kurang bermakna. Path impor yang keliru dijawab kompilator dengan E0432 unresolved import beserta lokasi segmen yang gagal. Semua nama yang kita impor sejauh ini berasal dari module yang memang terlihat — padahal sebagian besar isi crate sejatinya privat. Chapter berikutnya membedah keyword pub dan aturan visibility yang mengatur siapa boleh melihat apa di dalam tree.