Lewati ke konten

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.

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);
}

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.

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.

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: 42
▶ Coba sendiri

Perbaikan 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:

132
330
88
Harga terakhir dengan pajak: 88
▶ Coba sendiri

Perbaikan 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:

60
▶ Coba sendiri

Fungsinya 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: 3
▶ Coba sendiri
  • Variabel yang dibuat di dalam if. if balance > 50 { let bonus = 10; } lalu println!("{}", bonus) gagal, karena bonus sudah mati di }. Perbaikannya: buat if-nya menghasilkan nilai, let bonus = if balance > 50 { 10 } else { 0 };.

  • Memanggil constructor tanpa tipenya. let p = new("ferris"); menghasilkan cannot find function `new` in this scope. Perbaikannya: new milik tipenya, jadi tulis Player::new("ferris").

  • Memakai self di fungsi yang tidak punya parameter self. 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` parameter
    7 | self.count = 0;
    | ^^^^ `self` value is a keyword only available in methods with a `self` parameter

    Compiler menjelaskan bahwa self hanya bisa dipakai di method yang punya parameter self, sedangkan reset tidak punya.

    Perbaikannya: tambahkan parameter self. rustc menyarankan &self, tapi fungsi ini mengubah sebuah field, jadi yang dibutuhkan adalah fn reset(&mut self).

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