Lewati ke konten

Error Rust E0433: failed to resolve, use of undeclared type (tipe belum dikenal)

E0433 artinya kamu menulis path seperti HashMap::new() atau rand::rng(), dan Rust tidak tahu apa bagian pertamanya. Hampir selalu ada satu baris yang kurang: sebuah use, sebuah dependency di Cargo.toml, atau deklarasi mod. Kabar baiknya, rustc biasanya mencetak baris itu persis, tinggal kamu salin. Halaman ini bagian dari Penjelasan error compiler Rust.

error[E0433]: cannot find type `HashMap` in this scope
--> src/main.rs:2:21
|
2 | let mut stock = HashMap::new();
| ^^^^^^^ use of undeclared type `HashMap`
|
help: consider importing this struct
|
1 + use std::collections::HashMap;
|

Compiler tidak menemukan tipe HashMap di scope ini, dan menyarankan baris use std::collections::HashMap; untuk mengimpornya.

Ini program yang menghasilkan error tersebut:

fn main() {
let mut stock = HashMap::new();
stock.insert("apples", 12);
println!("{:?}", stock.get("apples"));
}

Versi Rust yang lebih lama mencetak error yang sama sebagai “failed to resolve: use of undeclared type HashMap” (gagal menyelesaikan path: tipe HashMap belum dideklarasikan). Tergantung apa yang kurang, label-nya juga bisa berbunyi use of unresolved module or unlinked crate (untuk crate atau modul), bukan use of undeclared type. Semuanya E0433, dan cara memperbaikinya sama.

Tanda ^^^^^^^ menunjuk HashMap, bagian sebelum ::. Untuk memanggil HashMap::new(), Rust harus menemukan dulu sesuatu yang bernama HashMap. Ia sudah melihat semua yang terlihat dari baris 2 dan tidak menemukan apa pun dengan nama itu, jadi ia bahkan belum bisa mulai mencari new.

Baris help: adalah bagian terpenting. rustc mencari di standard library, menemukan struct bernama HashMap di std::collections, dan menampilkan baris use yang akan membuatnya terlihat. 1 + artinya “tambahkan ini sebagai baris 1”.

Ibaratnya kamu meminta pustakawan mencarikan “bab 3 dari buku itu” tanpa menyebut buku yang mana. Dia tahu bab 3 ada di banyak buku, tapi dia butuh judulnya dulu.

Hanya sedikit nama yang otomatis terlihat di setiap file Rust. Kumpulan ini disebut prelude: Vec, String, Option, Some, None, Result, Ok, Err, Box, dan beberapa trait. Semua yang lain, termasuk HashMap, HashSet, fs, dan Ordering, harus dibawa masuk dengan use atau ditulis dengan path lengkapnya.

Dengan begitu prelude tetap kecil dan tidak ada nama yang bentrok. Standard library, misalnya, punya dua tipe Ordering yang berbeda, dan kodemu sendiri mungkin juga punya Duration atau Result. Rust tidak mau menebak mana yang kamu maksud. Kamu cukup menyebutnya sekali di atas file, dan setiap pembaca bisa melihat dari mana setiap nama berasal.

Hal yang sama berlaku untuk crate dan modul: sebuah crate baru ada bagi kodemu setelah dicantumkan di Cargo.toml, dan sebuah modul baru ada setelah ada baris mod. Lihat Modul dan Cargo dan crate.

Perbaikan 1: Tambahkan baris use yang disarankan rustc

Section titled “Perbaikan 1: Tambahkan baris use yang disarankan rustc”

Pilih ini kalau help: bilang consider importing (coba import ini). Sejauh ini, inilah perbaikan yang paling umum. Salin baris yang disarankan ke bagian atas file:

use std::collections::HashMap;
fn main() {
let mut stock = HashMap::new();
stock.insert("apel", 12);
println!("{:?}", stock.get("apel"));
}

Output:

Some(12)
▶ Coba sendiri

Pilihan lainnya adalah menulis path lengkap di tempat pemanggilan, std::collections::HashMap::new(). Itu juga jalan, tapi kamu harus mengulanginya di mana-mana, jadi baris use adalah pilihan yang biasa. Selengkapnya tentang tipe ini di HashMap.

Kalau rustc menawarkan beberapa import (consider importing one of these), baca dulu sebelum memilih. Itu adalah tipe-tipe berbeda yang kebetulan bernama sama, dan hanya satu yang kamu maksud.

Perbaikan 2: Betulkan nama tipenya, atau deklarasikan tipenya

Section titled “Perbaikan 2: Betulkan nama tipenya, atau deklarasikan tipenya”

Pilih ini kalau namanya adalah tipe buatanmu sendiri. Kalau tidak ada help: sama sekali, tipenya memang belum ada; kalau ada salah ketik, rustc menunjuk nama yang mirip:

error[E0433]: cannot find type `Invetory` in this scope
--> src/main.rs:12:17
|
12 | let stock = Invetory::new();
| ^^^^^^^^ use of undeclared type `Invetory`
|
help: a struct with a similar name exists
|
12 | let stock = Inventory::new();
| +

Compiler tidak mengenal Invetory, tapi ada struct dengan nama mirip: Inventory.

Tanda + di bawah baris itu menunjukkan huruf yang kurang. Betulkan ejaannya:

struct Inventory {
items: Vec<String>,
}
impl Inventory {
fn new() -> Self {
Inventory { items: Vec::new() }
}
}
fn main() {
let stock = Inventory::new();
println!("{} barang", stock.items.len());
}

Output:

0 barang
▶ Coba sendiri

Kalau Order::new() menghasilkan E0433 tanpa saran apa pun, berarti kamu belum menulis struct Order (atau struct itu ada di file yang belum kamu deklarasikan dengan mod). Cek juga huruf besarnya: inventory::new() dan Inventory::new() adalah dua nama berbeda.

Perbaikan 3: Sebutkan modul tempat tipenya berada

Section titled “Perbaikan 3: Sebutkan modul tempat tipenya berada”

Pilih ini kalau tipe atau enum-nya didefinisikan di dalam sebuah modul dan kamu memakainya dari luar. Di sini enum-nya ada di mod traffic, tapi main menulis Light::Green:

error[E0433]: cannot find type `Light` in this scope
--> src/main.rs:11:15
|
11 | let now = Light::Green;
| ^^^^^ use of undeclared type `Light`
|
help: consider importing this enum
|
1 + use crate::traffic::Light;
|

Compiler tidak melihat Light dari main, dan menyarankan import use crate::traffic::Light;.

Import enum-nya (atau tulis traffic::Light::Green). Perhatikan bahwa yang kamu import adalah enum-nya, dan kamu tetap menulis Light::Green untuk setiap variant:

mod traffic {
#[derive(Debug)]
pub enum Light {
Red,
Yellow,
Green,
}
}
use crate::traffic::Light;
fn can_go(light: &Light) -> bool {
match light {
Light::Green => true,
Light::Yellow | Light::Red => false,
}
}
fn main() {
let now = Light::Green;
println!("{now:?}: boleh jalan = {}", can_go(&now));
}

Output:

Green: boleh jalan = true
▶ Coba sendiri

Path sebuah variant punya tepat dua bagian: Enum::Variant. Kalau kamu menulis satu bagian terlalu banyak, seperti Light::Red::Green, kamu akan mendapat E0433 dengan cannot find module `Red` in `Light` dan label `Red` is a variant, not a module (Red adalah variant, bukan modul). Lihat Enum.

Perbaikan 4: Tambahkan crate-nya, atau deklarasikan modulnya

Section titled “Perbaikan 4: Tambahkan crate-nya, atau deklarasikan modulnya”

Pilih ini kalau label-nya bilang use of unresolved module or unlinked crate. Bagian pertama path-nya adalah crate atau modul yang tidak dikenal Rust:

error[E0433]: cannot find module or crate `rand` in this scope
--> src/main.rs:4:19
|
4 | let mut rng = rand::rng();
| ^^^^ 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 rand, dan menyarankan cargo add rand.

Untuk crate dari crates.io, jalankan cargo add rand di folder proyekmu. Untuk modul standard library seperti fs, rustc akan menyarankan use std::fs;. Dan untuk file-mu sendiri, misalnya src/inventory.rs, help-nya berbunyi to make use of source file src/inventory.rs, use `mod inventory` in this file to declare the module (untuk memakai file ini, deklarasikan modulnya dengan mod inventory):

src/
├── main.rs inventory::count_items() ← butuh `mod inventory;` di bagian atas
└── inventory.rs pub fn count_items() -> u32 { 42 }

Ini program yang sama dalam satu file, dengan modul yang ditulis langsung supaya bisa dijalankan di Playground:

mod inventory {
pub fn count_items() -> u32 {
42
}
}
fn main() {
println!("Jumlah barang di stok: {}", inventory::count_items());
}

Output:

Jumlah barang di stok: 42
▶ Coba sendiri

Kalau pakai file terpisah, satu-satunya perubahan adalah mod inventory { ... } menjadi mod inventory;, dan isinya dipindah ke src/inventory.rs.

Kamu mungkin melihat extern crate rand; di kode lama. Sejak edisi 2018 kamu tidak membutuhkannya: begitu sebuah crate ada di Cargo.toml, kamu bisa langsung memakainya. Menambahkan extern crate tidak memperbaiki E0433. Tanpa dependency-nya, itu hanya mengubah error-nya menjadi E0463, can't find crate for rand (crate rand tidak ditemukan). cargo add adalah perbaikan yang sebenarnya.

Membandingkan dengan cmp. match a.cmp(&b) dengan arm Ordering::Less menghasilkan E0433, dan rustc menyarankan dua import: use std::cmp::Ordering; dan use std::sync::atomic::Ordering;. Yang kamu mau adalah std::cmp::Ordering; yang atomic untuk thread. Lihat Match.

Test di dalam blok mod tests. Modul test adalah modul anak, jadi ia tidak bisa melihat tipe-tipemu tanpa meng-import-nya. Inventory::new() di dalam mod tests menghasilkan E0433 dengan help: consider importing this struct dan use crate::Inventory;. Perbaikannya: tulis use super::*; di bagian atas modul test. Lihat Testing.

Kode yang ditempel dari dokumentasi atau blog. Contoh-contoh sering tidak menyertakan baris use-nya. fs::read_to_string(...) gagal dengan cannot find module or crate `fs` in this scope dan help use std::fs;. Perbaikannya: tambahkan import yang ditunjukkan rustc, atau cari path item itu di halaman dokumentasinya.

  • E0432: masalah yang sama di baris use, yaitu unresolved import.
  • E0425: nilai atau fungsi tidak ditemukan (tanpa ::), misalnya nama variabel yang salah ketik. rustc versi sekarang juga memakai E0425 untuk tipe yang tidak ada di posisi tipe, seperti let m: HashMap<&str, u32>; versi lama menyebutnya E0412. Baris use yang sama memperbaikinya.
  • E0599: tipenya ditemukan, tapi method atau variant setelah :: tidak ada, misalnya Light::Blue.
  • E0463: can't find crate, dari extern crate tanpa dependency-nya.
  • Semua error compiler: daftar lengkap halaman error.

Kuis singkat

1. Kenapa HashSet::new() menghasilkan E0433, padahal Vec::new() jalan tanpa import apa pun?

2. rustc menyarankan use std::cmp::Ordering; dan use std::sync::atomic::Ordering; untuk match a.cmp(&b)-mu. Mana yang kamu pilih?

3. rand::rng() menghasilkan E0433 dengan label 'use of unresolved module or unlinked crate'. Apa yang memperbaikinya?

Skor: 0 / 3