Error Rust E0432: unresolved import (import tidak ditemukan)
E0432 artinya salah satu baris use di kodemu menunjuk ke sesuatu yang tidak bisa ditemukan Rust. Mungkin crate-nya belum ada di Cargo.toml, mungkin ada salah ketik kecil di path-nya, atau mungkin file-nya ada tapi Rust tidak tahu bahwa itu sebuah modul. Kelihatannya menakutkan, tapi hampir selalu bisa diperbaiki dengan satu baris, dan compiler biasanya memberi tahu baris yang mana. Halaman ini bagian dari Penjelasan error compiler Rust.
Pesan error-nya
Section titled “Pesan error-nya”error[E0432]: unresolved import `rand` --> src/main.rs:1:5 |1 | use rand::random_range; | ^^^^ use of unresolved module or unlinked crate `rand` | = help: if you wanted to use a crate named `rand`, use `cargo add rand` to add it to your `Cargo.toml`Compiler tidak menemukan modul atau crate bernama rand, dan menyarankan cargo add rand untuk menambahkannya ke Cargo.toml.
Ini program yang menghasilkan error tersebut, di proyek baru hasil cargo new yang belum punya apa pun di bawah [dependencies]:
use rand::random_range;
fn main() { let roll = random_range(1..=6); println!("You rolled {roll}");}Teks di bawah ^^^^ berubah sesuai penyebabnya. Semua ini adalah E0432, dan masing-masing menunjuk ke perbaikan yang berbeda di bawah:
| Apa kata label-nya | Apa yang biasanya salah | Perbaikan |
|---|---|---|
use of unresolved module or unlinked crate |
crate tidak ada di Cargo.toml, atau file tanpa baris mod |
Perbaikan 1 atau 3 |
could not find `collection` in `std` |
salah ketik di tengah path | Perbaikan 2 |
no `Hashmap` in `collections` |
salah ketik (atau huruf besar/kecil salah) di nama terakhir | Perbaikan 2 |
could not find `inventory` in the crate root |
path crate:: ke modul yang belum dideklarasikan |
Perbaikan 3 |
no external crate |
path dimulai dari modul yang salah | Perbaikan 4 |
Apa artinya
Section titled “Apa artinya”Baris use adalah jalan pintas. use rand::random_range; berarti “mulai sekarang, random_range artinya benda yang ada di rand::random_range”. Sebelum Rust bisa membuat jalan pintas itu, ia harus menelusuri path-nya satu per satu: pertama cari rand, lalu cari random_range di dalamnya.
Tanda ^^^^ menunjuk bagian pertama yang gagal. Di sini yang gagal adalah rand, bagian paling awal, jadi Rust bahkan belum sempat mencari random_range. Baris help: menebak alasannya: rand adalah crate dari crates.io, dan proyek ini belum menambahkannya.
Ibaratnya kamu memberi sopir taksi alamat “Jalan Pelabuhan No. 12, Surbaya”. Kalau nama kotanya salah, sopirnya bahkan tidak bisa mulai mencari jalannya.
Kenapa Rust melakukan ini
Section titled “Kenapa Rust melakukan ini”Rust menyelesaikan setiap path saat kompilasi, bukan saat program berjalan. Tidak ada yang dimuat “untuk jaga-jaga”. Kodemu hanya bisa melihat tiga jenis hal: crate yang tercantum di Cargo.toml (ditambah std), modul yang kamu deklarasikan dengan mod, dan item di dalamnya. Kalau baris use menyebut sesuatu di luar itu, Rust langsung berhenti, bukan menebak-nebak.
Ini hal yang baik. Import yang salah ketik di Python atau JavaScript sering baru gagal saat baris itu akhirnya dijalankan, mungkin saja di production. Di Rust, programnya bahkan tidak bisa di-build. Artinya juga, crate yang tidak pernah kamu tambahkan tidak akan bisa menyelinap masuk ke programmu.
Sejak edisi 2018, path di use dimulai dari salah satu tempat ini: nama sebuah crate (std, rand), crate (akar crate-mu sendiri), self (modul saat ini), super (modul induk), atau modul yang dideklarasikan di modul saat ini. Pelajaran Modul membahasnya secara detail, dan Cargo dan crate menjelaskan dependency.
Cara memperbaikinya
Section titled “Cara memperbaikinya”Perbaikan 1: Tambahkan crate-nya dengan cargo add
Section titled “Perbaikan 1: Tambahkan crate-nya dengan cargo add”Pilih ini kalau bagian pertama path-nya adalah crate dari crates.io, seperti rand, serde, atau regex, dan baris help: menyebut cargo add. Ini penyebab paling umum, terutama kalau kamu menyalin kode dari blog. Jalankan perintah ini di folder yang berisi Cargo.toml:
cargo add randCargo mencari versi terbaru dan menambahkan satu baris ke Cargo.toml untukmu:
[dependencies]rand = "0.10.3"Sekarang kode yang sama bisa di-build. Versi ini mencetak hasil pengecekan, bukan angka lemparannya, supaya output-nya selalu sama:
use rand::random_range;
fn main() { let roll = random_range(1..=6); println!("Hasil lemparan antara 1 dan 6: {}", (1..=6).contains(&roll));}Output:
Hasil lemparan antara 1 dan 6: trueAda dua hal yang sering bikin orang bingung di sini. Pertama, nama crate yang memakai tanda hubung ditulis dengan garis bawah di kode: kamu menjalankan cargo add tracing-subscriber, tapi menulis use tracing_subscriber::.... Kedua, kalau crate-nya adalah dependency workspace-mu, crate itu tetap harus dicantumkan di Cargo.toml milik package yang memakainya.
Perbaikan 2: Betulkan ejaan path-nya
Section titled “Perbaikan 2: Betulkan ejaan path-nya”Pilih ini kalau label-nya bilang could not find `X` in `Y` (tidak menemukan X di Y) atau no `X` in `Y` (tidak ada X di Y). Ada yang salah ketik di tengah atau di akhir path. Contoh klasiknya:
error[E0432]: unresolved import `std::collection` --> src/main.rs:1:10 |1 | use std::collection::HashMap; | ^^^^^^^^^^ could not find `collection` in `std`Compiler tidak menemukan collection di dalam std.
Nama modulnya collections, dengan s. Nama juga membedakan huruf besar dan kecil: use std::collections::Hashmap; gagal dengan no `Hashmap` in `collections`, dan rustc menambahkan help: a similar name exists in the module (ada nama yang mirip di modul ini) beserta ejaan yang benar. Import yang sudah diperbaiki:
use std::collections::HashMap;
fn main() { let mut stock: HashMap<&str, u32> = HashMap::new(); stock.insert("apel", 12); println!("{:?}", stock.get("apel"));}Output:
Some(12)Kalau kamu tidak yakin path persisnya, cari di dokumentasi standard library (bahasa Inggris). Halaman setiap item menampilkan path lengkapnya di bagian atas. Lihat HashMap untuk penjelasan lebih lanjut tentang tipe ini.
Perbaikan 3: Deklarasikan modulnya dengan mod
Section titled “Perbaikan 3: Deklarasikan modulnya dengan mod”Pilih ini kalau kamu membuat file baru, misalnya src/inventory.rs, dan use inventory::... tidak bisa menemukannya. Di Rust, sebuah file bukan modul sampai file induknya mendeklarasikannya. Proyekmu terlihat seperti ini:
src/├── main.rs use inventory::count_items; ← tidak ada `mod inventory;`└── inventory.rs pub fn count_items() -> u32 { 42 }Dan rustc menyebutkan persis apa yang kurang:
error[E0432]: unresolved import `inventory` --> src/main.rs:1:5 |1 | use inventory::count_items; | ^^^^^^^^^ use of unresolved module or unlinked crate `inventory` |help: to make use of source file src/inventory.rs, use `mod inventory` in this file to declare the module |1 + mod inventory; |Compiler bilang: untuk memakai file src/inventory.rs, tulis mod inventory di file ini untuk mendeklarasikan modulnya.
Tambahkan mod inventory; di bagian atas src/main.rs (atau src/lib.rs, kalau modulnya milik library-mu). Menulis use crate::inventory::count_items; sebagai gantinya tidak menolong; itu gagal dengan could not find `inventory` in the crate root, karena modulnya tetap belum dideklarasikan.
Di Playground semuanya ada di satu file, jadi di sini modulnya ditulis langsung dengan mod inventory { ... }. Cara kerjanya persis sama dengan file terpisah:
mod inventory { pub fn count_items() -> u32 { 42 }}
use inventory::count_items;
fn main() { println!("Jumlah barang di stok: {}", count_items());}Output:
Jumlah barang di stok: 42Deklarasikan setiap modul sekali saja, di modul induknya. File lain lalu menjangkaunya dengan use crate::inventory::.... Jangan tambahkan mod inventory; di setiap file yang memakainya.
Perbaikan 4: Mulai path-nya dari tempat yang benar
Section titled “Perbaikan 4: Mulai path-nya dari tempat yang benar”Pilih ini kalau import-nya ada di dalam sebuah modul, dan item-nya ada di modul lain di crate-mu sendiri. Di sini receipt ada di dalam shop dan ingin memakai shop::store_name:
mod shop { pub fn store_name() -> &'static str { "Ferris Fruits" }
pub mod receipt { use store_name; // ❌ looks in the wrong place
pub fn header() -> String { format!("== {} ==", store_name()) } }}error[E0432]: unresolved import `store_name` --> src/main.rs:7:13 |7 | use store_name; // ❌ looks in the wrong place | ^^^^^^^^^^ no external crate `store_name`Compiler mencari crate eksternal bernama store_name (komentar di baris 7 artinya “mencari di tempat yang salah”), dan tentu saja tidak menemukannya.
Nama polos di awal path use berarti “sebuah crate, atau sesuatu yang dideklarasikan langsung di modul ini”. store_name bukan keduanya, jadi Rust mencari crate dengan nama itu. Beri tahu Rust dari mana harus mulai:
| Awalan | Mulai dari | Contoh |
|---|---|---|
crate:: |
akar crate-mu (main.rs atau lib.rs) |
use crate::shop::prices::price_of; |
super:: |
modul induk | use super::store_name; |
self:: |
modul saat ini | use self::lines::line; |
Ketiganya dalam satu program:
mod shop { pub fn store_name() -> &'static str { "Ferris Fruits" }
pub mod prices { pub fn price_of(item: &str) -> u32 { if item == "apple" { 3 } else { 5 } } }
pub mod receipt { use super::store_name; // modul induk: shop use crate::shop::prices::price_of; // dari akar crate use self::layout::line; // anak dari modul ini
mod layout { pub fn line(item: &str, price: u32) -> String { format!("{item}: {price}") } }
pub fn print(item: &str) { println!("== {} ==", store_name()); println!("{}", line(item, price_of(item))); } }}
fn main() { shop::receipt::print("apple");}Output:
== Ferris Fruits ==apple: 3use layout::line; juga akan jalan di sini, karena layout dideklarasikan di modul saat ini; self:: hanya membuatnya lebih jelas. Kalau ragu, crate:: dengan path lengkap selalu bisa dipakai dari mana saja di crate-mu, dan rustc sering menyarankannya: help: a similar path exists (ada path yang mirip) diikuti versi crate::-nya.
Di mana biasanya kamu melihatnya
Section titled “Di mana biasanya kamu melihatnya”Kode yang ditulis untuk versi crate yang lebih lama. Banyak tutorial memakai rand 0.8. Dengan rand 0.10 kamu akan mendapat:
error[E0432]: unresolved import `rand::thread_rng` --> src/main.rs:1:5 |1 | use rand::thread_rng; | ^^^^^^^^^^^^^^^^ no `thread_rng` in the rootCompiler bilang tidak ada thread_rng di akar crate rand.
Perbaikannya: cek dokumentasi crate itu di docs.rs untuk versi yang ada di Cargo.toml-mu. Di sini nama barunya adalah rand::rng(). Lihat Angka acak.
Package yang punya main.rs sekaligus lib.rs. Keduanya adalah dua crate yang terpisah. Di dalam main.rs, crate:: berarti crate binary-nya, jadi use crate::inventory::count_items; gagal dengan could not find `inventory` in the crate root meskipun lib.rs punya pub mod inventory;. Perbaikannya: pakai nama package-nya, use shop_app::inventory::count_items; (dengan tanda hubung diganti garis bawah).
Item-nya ada, tapi privat. Itu error yang berbeda, E0603, bukan E0432:
error[E0603]: function `count_items` is private --> src/main.rs:7:16 |7 | use inventory::count_items; | ^^^^^^^^^^^ private functionCompiler menemukan fungsinya, tapi fungsi itu privat.
Perbaikannya: tambahkan pub di depan fn (dan di depan setiap mod yang dilewati, karena modul privat menghasilkan module `prices` is private). Lihat Modul.
Error terkait
Section titled “Error terkait”- E0433: sebuah path di dalam kodemu (seperti
HashMap::new()ataurand::rng()) tidak bisa diselesaikan. Penyebabnya sama, tapi bukan di barisuse. - E0425: nilai atau fungsi tidak ditemukan, sering diperbaiki dengan baris
useyang sama. - E0603: import-nya ditemukan, tapi privat. Tambahkan
pub. - E0463:
can't find crate(crate tidak ditemukan), yang muncul dariextern crate rand;kalau crate-nya tidak ada diCargo.toml. - Semua error compiler: daftar lengkap halaman error.
Kuis singkat
Section titled “Kuis singkat”Kuis singkat
1. Kamu menyalin use serde::Serialize; ke proyek baru dan mendapat E0432 yang bilang crate serde unresolved atau unlinked. Apa perbaikannya?
2. Kamu membuat src/billing.rs, tapi use billing::total; di main.rs gagal. Apa yang kurang?
3. Di dalam mod shop { mod receipt { ... } }, bagaimana receipt meng-import fungsi yang didefinisikan langsung di shop?
Skor: 0 / 3
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- E0432 — Rust error codes index (bahasa Inggris): penjelasan resmi, termasuk bagaimana path berubah di Rust 2018.
- Bringing Paths into Scope with the
useKeyword — The Rust Book (bahasa Inggris): cara kerjause, dengan package eksternal dan nested path. - Paths for Referring to an Item in the Module Tree — The Rust Book (bahasa Inggris): path absolut
crate::, path relatif, dansuper. - Separating Modules into Different Files — The Rust Book (bahasa Inggris): di mana
modditulis kalau sebuah modul punya file sendiri. cargo add— The Cargo Book (bahasa Inggris): semua opsi untuk menambahkan dependency, termasuk feature.