Error Rust E0425: cannot find value in this scope (nama tidak ditemukan)
E0425 artinya Rust mencari sebuah nama di satu titik tertentu di kodemu, dan tidak menemukannya di sana. Ini salah satu error yang paling sering muncul, dan hampir selalu cepat diperbaiki: biasanya salah ketik, variabel yang tinggal di blok lain, atau fungsi yang butuh path modulnya. Halaman ini bagian dari Penjelasan error compiler Rust.
Pesan error-nya
Section titled “Pesan error-nya”error[E0425]: cannot find value `total_scor` in this scope --> src/main.rs:3:33 |3 | println!("Final score: {}", total_scor); | ^^^^^^^^^^ |help: a local variable with a similar name exists |3 | println!("Final score: {}", total_score); | +Compiler bilang ia tidak bisa menemukan total_scor di baris 3, lalu menyarankan nama yang mirip: total_score.
Ini program yang menghasilkan error tersebut:
fn main() { let total_score = 42; println!("Final score: {}", total_scor);}Apa artinya
Section titled “Apa artinya”Tanda ^^^^ menunjuk nama yang tidak bisa ditemukan Rust: total_scor di baris 3. “In this scope” artinya “dilihat dari posisi baris ini”. Rust sudah memeriksa semua variabel, fungsi, dan import yang terlihat dari titik itu, dan tidak ada satu pun yang bernama begitu.
Baca juga baris help:. Di sini rustc menemukan variabel dengan nama mirip (total_score), bahkan menunjukkan huruf yang kurang dengan tanda +. Kalau kamu melihat “a local variable with a similar name exists” (ada variabel lokal dengan nama mirip), itu tandanya salah ketik.
Bayangkan kamu memanggil “Jon!” di sebuah ruangan, padahal nama temanmu John. Dia ada di situ, tapi tidak ada yang merasa dipanggil “Jon”.
Error yang sama juga bisa muncul sebagai cannot find function ... in this scope kalau nama yang hilang itu adalah fungsi yang kamu panggil.
Kenapa Rust melakukan ini
Section titled “Kenapa Rust melakukan ini”Sebelum programmu berjalan, Rust sudah menentukan setiap nama merujuk ke apa. Sebuah variabel hanya ada mulai dari baris let-nya sampai } penutup blok tempat ia dideklarasikan. Itulah scope (cakupan)-nya. Di luar wilayah itu, nama tersebut memang tidak ada.
Banyak bahasa lain membiarkan hal ini lolos, dan kamu baru tahu belakangan. Di JavaScript, salah ketik bisa diam-diam membuat variabel global baru atau memberimu undefined. Di Python kamu akan dapat NameError saat program berjalan, mungkin hanya di satu jalur kode yang tidak pernah tersentuh oleh test-mu. Rust menangkapnya saat kompilasi, setiap kali.
Fungsi mengikuti ide yang sama lewat modul: fungsi di dalam mod billing tidak terlihat dari main sampai kamu menyebut path-nya atau membawanya masuk dengan use.
Cara memperbaikinya
Section titled “Cara memperbaikinya”Perbaikan 1: Betulkan ejaannya
Section titled “Perbaikan 1: Betulkan ejaannya”Pilih ini kalau baris help: bilang ada nama yang mirip. Sejauh ini, inilah penyebab paling umum. Nama di Rust juga membedakan huruf besar dan kecil, jadi Total_score dan total_score adalah dua nama berbeda.
fn main() { let total_score = 42; println!("Skor akhir: {}", total_score);}Output:
Skor akhir: 42Perbaikan 2: Deklarasikan variabel di tempat yang terlihat dari kedua sisi
Section titled “Perbaikan 2: Deklarasikan variabel di tempat yang terlihat dari kedua sisi”Pilih ini kalau help-nya bilang “the binding is available in a different scope in the same function” (variabelnya ada, tapi di scope lain dalam fungsi yang sama). Kamu membuat variabel di dalam loop atau blok if, lalu memakainya setelah }. Versi yang rusak terlihat seperti ini:
fn main() { let prices = [120, 300, 80]; for price in prices { let with_tax = price + price / 10; println!("{with_tax}"); } println!("Last price with tax: {}", with_tax); // error[E0425]}with_tax dibuat baru di setiap putaran loop dan dibuang di } penutup loop. Kalau kamu butuh nilainya setelah loop, deklarasikan sebelum loop dan perbarui di dalamnya:
fn main() { let prices = [120, 300, 80]; let mut last_with_tax = 0;
for price in prices { let with_tax = price + price / 10; println!("{with_tax}"); last_with_tax = with_tax; }
println!("Harga terakhir dengan pajak: {}", last_with_tax);}Output:
13233088Harga terakhir dengan pajak: 88Perbaikan yang sama juga berlaku kalau kamu memakai variabel sebelum baris let-nya. Rust membaca dari atas ke bawah, jadi cukup pindahkan let ke atas.
Perbaikan 3: Tulis path fungsinya, atau tambahkan use
Section titled “Perbaikan 3: Tulis path fungsinya, atau tambahkan use”Pilih ini untuk cannot find function kalau fungsinya ada di modul lain. Rust mencetak:
error[E0425]: cannot find function `total_with_tax` in this scope --> src/main.rs:8:17 |8 | let total = total_with_tax(50.0); | ^^^^^^^^^^^^^^ not found in this scope |help: consider importing this function |1 + use crate::billing::total_with_tax; |Compiler tidak menemukan total_with_tax di sini, dan menyarankan baris use untuk mengimpornya.
Panggil fungsinya dengan path lengkap (billing::total_with_tax(50.0)), atau tambahkan baris use yang disarankan rustc:
mod billing { pub fn total_with_tax(amount: f64) -> f64 { amount * 1.2 }}
use crate::billing::total_with_tax;
fn main() { let total = total_with_tax(50.0); println!("{total}");}Output:
60Fungsinya juga harus pub. Tanpa itu kamu akan mendapat error lain (E0603, “function is private” atau fungsinya privat). Lihat Modul untuk cara kerja path dan use.
Perbaikan 4: Tambahkan self. di depan field
Section titled “Perbaikan 4: Tambahkan self. di depan field”Pilih ini di dalam method, kalau nama yang hilang adalah salah satu field struct-mu. Kalau kamu datang dari Java atau C#, wajar kalau kamu menulis count dan berharap itu berarti field-nya. Di Rust kamu selalu menulis self.count. rustc akan bilang: help: you might have meant to use the available field (mungkin maksudmu field yang ada).
struct Counter { count: u32,}
impl Counter { fn report(&self) { println!("Jumlah: {}", self.count); }}
fn main() { let c = Counter { count: 3 }; c.report();}Output:
Jumlah: 3Di mana biasanya kamu melihatnya
Section titled “Di mana biasanya kamu melihatnya”-
Variabel yang dibuat di dalam
if.if balance > 50 { let bonus = 10; }laluprintln!("{}", bonus)gagal, karenabonussudah mati di}. Perbaikannya: buatif-nya menghasilkan nilai,let bonus = if balance > 50 { 10 } else { 0 };. -
Memanggil constructor tanpa tipenya.
let p = new("ferris");menghasilkancannot find function `new` in this scope. Perbaikannya:newmilik tipenya, jadi tulisPlayer::new("ferris"). -
Memakai
selfdi fungsi yang tidak punya parameterself. Ini “saudara dekat” E0425, yaitu E0424:error[E0424]: expected value, found module `self`--> src/main.rs:7:9|6 | fn reset() {| ----- this function doesn't have a `self` parameter7 | self.count = 0;| ^^^^ `self` value is a keyword only available in methods with a `self` parameterCompiler menjelaskan bahwa
selfhanya bisa dipakai di method yang punya parameterself, sedangkanresettidak punya.Perbaikannya: tambahkan parameter
self. rustc menyarankan&self, tapi fungsi ini mengubah sebuah field, jadi yang dibutuhkan adalahfn reset(&mut self).
Error terkait
Section titled “Error terkait”- E0599: no method found: nama yang kamu panggil sebagai method tidak ada di tipe tersebut.
- E0382: use of moved value: variabelnya ada, tapi nilainya sudah dipindahkan (move).
- E0308: mismatched types: namanya ditemukan, tapi tipenya salah.
- E0277: trait bound not satisfied: sebuah tipe tidak punya trait yang dibutuhkan oleh suatu kode.
- Semua error compiler: daftar lengkap, dengan ringkasan singkat masing-masing.
Kuis singkat
Section titled “Kuis singkat”Kuis singkat
1. rustc bilang "help: a local variable with a similar name exists". Apa penyebab yang paling mungkin?
2. Kamu menulis let found = true; di dalam loop for dan memakai found setelah loop. Kenapa gagal?
3. Fungsi send ada di dalam mod mailer. Baris mana yang membuat main bisa memanggilnya sebagai send()?
Skor: 0 / 3
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- E0425 — Rust error codes index (bahasa Inggris): penjelasan resmi error ini, dengan contoh tambahan.
- Bringing Paths into Scope with use — The Rust Book (bahasa Inggris): bagaimana
usemembuat fungsi dari modul lain terlihat. - Scope and Shadowing — Rust by Example (bahasa Inggris): contoh singkat tentang di mana variabel hidup dan berakhir.
- Method Syntax — The Rust Book (bahasa Inggris): kenapa method memakai
selfdan cara mengakses field lewatself. - E0424 — Rust error codes index (bahasa Inggris): error terkait saat memakai
selfdi luar method.