Error Rust E0026: struct or variant does not have a field named X (salah nama field)
E0026 artinya: kamu sedang membongkar sebuah struct atau varian enum di dalam pattern (pola), seperti Shape::Circle { r }, dan salah satu nama field yang kamu tulis ternyata tidak ada. Ini versi pattern dari E0560 dan E0559, yang menangkap kesalahan yang sama saat kamu membuat sebuah nilai. rustc biasanya memberi tahu nama yang benar di baris help:, jadi perbaikannya sering cuma satu kata. (Halaman ini bagian dari Penjelasan error compiler Rust.)
Pesan error-nya
Section titled “Pesan error-nya”error[E0026]: variant `Shape::Circle` does not have a field named `r` --> src/main.rs:8:25 |8 | Shape::Circle { r } => 3.14 * r * r, // ❌ nama field-nya `radius` | ^ | | | variant `Shape::Circle` does not have this field | help: `Shape::Circle` has a field named `radius`Artinya: varian Shape::Circle tidak punya field bernama r. rustc juga memberi petunjuk bahwa Shape::Circle punya field bernama radius.
Ini program yang menghasilkan error tersebut:
enum Shape { Circle { radius: f64 }, Rectangle { width: f64, height: f64 },}
fn area(shape: &Shape) -> f64 { match shape { Shape::Circle { r } => 3.14 * r * r, // ❌ nama field-nya `radius` Shape::Rectangle { width, height } => width * height, }}
fn main() { println!("{}", area(&Shape::Circle { radius: 1.0 }));}Kamu juga akan melihat error kedua untuk baris yang sama: E0027, “pattern does not mention field radius” (pattern tidak menyebut field radius). Itu kesalahan yang sama, dilihat dari sisi lain. Rust menemukan field yang kamu sebut tapi tidak ada (r) dan field asli yang tidak kamu sebut (radius). Perbaiki namanya, dan kedua error itu hilang bersamaan.
Apa artinya
Section titled “Apa artinya”Judul error-nya menyebut struct atau varian yang sedang kamu cocokkan (Shape::Circle) dan field yang kamu tulis (r). Tanda ^ menunjuk ke nama itu di dalam kurung kurawal pattern-nya.
Di dalam pattern, nama-nama di dalam { } adalah nama field, bukan nama variabel baru yang bebas kamu pilih. Shape::Circle { r } adalah singkatan dari Shape::Circle { r: r }: “ambil field bernama r dan simpan di variabel bernama r”. Circle tidak punya field bernama r, jadi Rust berhenti.
Di bawah tanda panah, rustc memberi salah satu petunjuk berikut:
help: `Shape::Circle` has a field named `radius`(Shape::Circlepunya field bernamaradius): ada tepat satu field yang tidak kamu sebut, jadi rustc menebak kamu memaksudkan field itu.help: a field with a similar name exists(ada field dengan nama yang mirip): salah ketik, misalnyanmaeuntukname. rustc menunjukkan baris yang sudah dibetulkan.- Tidak ada petunjuk sama sekali: rustc tidak bisa menebak. Lihat definisi struct atau enum-nya untuk mengetahui nama aslinya.
Ibaratnya kamu meminta petugas perpustakaan mengambilkan “buku di rak yang namanya Fiksi-fiksian”. Dia tahu kamu mau sebuah rak, tapi dia cuma bisa pergi ke rak yang benar-benar ada.
Kenapa Rust melakukan ini
Section titled “Kenapa Rust melakukan ini”Pattern seperti Shape::Circle { radius } adalah sebuah janji: “kalau nilainya Circle, berikan aku radius-nya”. Rust memeriksa janji itu terhadap definisinya saat kompilasi, jadi sebuah pattern tidak akan pernah meminta data yang tidak ada. Lihat Destructuring tuple dan struct.
Di bahasa yang tidak punya pemeriksaan ini, membaca key yang tidak ada memberimu undefined atau null, dan bug-nya baru muncul jauh belakangan, jauh dari tempat salah ketiknya. Di Rust, salah ketik itu tidak bisa lolos dari compiler. Ini juga melindungimu saat seseorang mengganti nama sebuah field: setiap pattern yang masih memakai nama lama langsung ditandai dengan E0026, jadi tidak ada satu pun yang diam-diam terlupakan.
Cara memperbaikinya
Section titled “Cara memperbaikinya”Perbaikan 1: Pakai nama field yang asli
Section titled “Perbaikan 1: Pakai nama field yang asli”Pilih ini hampir setiap saat. Pakai nama dari baris help:, atau lihat definisinya. Nama field membedakan huruf besar dan kecil, dan ditulis dalam snake_case.
Salah ketik mendapat petunjuk “similar name” dan baris yang sudah dibetulkan:
error[E0026]: struct `User` does not have a field named `nmae` --> src/main.rs:8:16 |8 | let User { nmae, age } = user; // ❌ salah ketik: nama field-nya `name` | ^^^^ struct `User` does not have this field |help: a field with a similar name exists |8 - let User { nmae, age } = user; // ❌ salah ketik: nama field-nya `name`8 + let User { name, age } = user; // ❌ salah ketik: nama field-nya `name` |Artinya: struct User tidak punya field bernama nmae, dan rustc menyarankan nama yang mirip, name.
Program di baliknya:
struct User { name: String, age: u32,}
fn main() { let user = User { name: String::from("Ferris"), age: 7 }; let User { nmae, age } = user; // ❌ salah ketik: nama field-nya `name` println!("{} berumur {} tahun", nmae, age);}Tulis nama field persis seperti di definisinya. Dengan begitu singkatannya berfungsi, dan kamu mendapat variabel dengan nama yang sama:
struct User { name: String, age: u32,}
enum Shape { Circle { radius: f64 }, Rectangle { width: f64, height: f64 },}
fn area(shape: &Shape) -> f64 { match shape { Shape::Circle { radius } => 3.14 * radius * radius, // ✅ nama field yang asli Shape::Rectangle { width, height } => width * height, }}
fn main() { let shapes = [ Shape::Circle { radius: 2.0 }, Shape::Rectangle { width: 3.0, height: 4.0 }, ]; for shape in &shapes { println!("luas: {:.2}", area(shape)); }
let user = User { name: String::from("Ferris"), age: 7 }; let User { name, age } = user; // ✅ `name`, bukan `nmae` println!("{} berumur {} tahun", name, age);}Output:
luas: 12.56luas: 12.00Ferris berumur 7 tahunPerbaikan 2: Tetap pakai nama variabelmu sendiri dengan field: nama
Section titled “Perbaikan 2: Tetap pakai nama variabelmu sendiri dengan field: nama”Pilih ini kalau kamu suka nama pendek r dan cuma ingin variabelnya bernama begitu. Tulis nama field yang asli, titik dua, lalu nama variabelmu: Shape::Circle { radius: r }. Bacanya: “ambil field radius dan beri nama r”.
enum Shape { Circle { radius: f64 }, Rectangle { width: f64, height: f64 },}
fn area(shape: &Shape) -> f64 { match shape { Shape::Circle { radius: r } => 3.14 * r * r, // ✅ field `radius`, variabel `r` Shape::Rectangle { width: w, height: h } => w * h, }}
fn main() { let small = Shape::Circle { radius: 1.0 }; let wide = Shape::Rectangle { width: 10.0, height: 2.5 }; println!("kecil: {:.2}", area(&small)); println!("lebar: {:.2}", area(&wide));}Output:
kecil: 3.14lebar: 25.00Cara ini juga berguna kalau nama field-nya akan bentrok dengan variabel yang sudah kamu punya, atau kalau nama field-nya panjang.
Perbaikan 3: Pastikan kamu mencocokkan varian yang benar
Section titled “Perbaikan 3: Pastikan kamu mencocokkan varian yang benar”Pilih ini kalau field yang kamu tulis memang ada, tapi di varian lain. Setiap varian enum punya field-nya sendiri. Di sini x milik Click, tapi arm-nya mencocokkan KeyPress:
error[E0026]: variant `Event::KeyPress` does not have a field named `x` --> src/main.rs:9:27 |9 | Event::KeyPress { x, .. } => format!("tombol di {}", x), // ❌ `x` milik `Click` | ^ | | | variant `Event::KeyPress` does not have this field | help: `Event::KeyPress` has a field named `key`Artinya: varian Event::KeyPress tidak punya field x, dan rustc menebak kamu memaksudkan key.
Program di baliknya:
enum Event { Click { x: i32, y: i32 }, KeyPress { key: char },}
fn describe(event: &Event) -> String { match event { Event::Click { x, y } => format!("klik di ({}, {})", x, y), Event::KeyPress { x, .. } => format!("tombol di {}", x), // ❌ `x` milik `Click` }}
fn main() { println!("{}", describe(&Event::KeyPress { key: 'a' }));}Tebakan rustc (key) hanyalah “satu-satunya field yang tidak kamu sebut”, jadi jangan langsung diikuti begitu saja. Tanyakan pada dirimu apa yang seharusnya dikerjakan arm ini. Penekanan tombol tidak punya posisi, jadi perbaikan yang tepat di sini adalah memakai field yang memang dimiliki KeyPress:
enum Event { Click { x: i32, y: i32 }, KeyPress { key: char },}
fn describe(event: &Event) -> String { match event { Event::Click { x, y } => format!("klik di ({}, {})", x, y), Event::KeyPress { key } => format!("tombol '{}' ditekan", key), // ✅ KeyPress punya `key` }}
fn main() { let events = [Event::Click { x: 10, y: 20 }, Event::KeyPress { key: 'a' }]; for event in &events { println!("{}", describe(event)); }}Output:
klik di (10, 20)tombol 'a' ditekanKalau penekanan tombol memang seharusnya punya posisi, tambahkan field-nya ke varian itu: KeyPress { key: char, x: i32, y: i32 }. Setelah itu, setiap tempat yang membuat KeyPress juga harus mengisinya (rustc menunjuk ke masing-masing tempat dengan E0063).
Di mana biasanya kamu melihatnya
Section titled “Di mana biasanya kamu melihatnya”Setelah mengganti nama field. Kamu mengganti nama r menjadi radius di enum, dan sekarang setiap arm Shape::Circle { r } => ... memberi E0026. Cari nama lamanya di seluruh proyek dan perbarui setiap pattern, atau pakai radius: r supaya nama variabel lamanya tetap.
Di if let dan let. if let Some(User { nmae, .. }) = find_user() memberi error yang sama. Menambahkan .. tidak membantu di sini: .. melewati field yang tidak kamu sebut, tapi setiap nama yang kamu tulis tetap harus ada. Perbaikannya: User { name, .. }.
Kurung kurawal pada varian tuple atau tuple struct. Untuk struct Point(i32, i32);, pattern Point { x, y } tidak punya nama field asli untuk dicocokkan. rustc melaporkannya dengan kode lain, E0769, “tuple variant Point written as struct variant” (varian tuple Point ditulis seperti varian struct), dan menyarankan Point(x, y). Lihat Destructuring enum yang membawa data.
Error terkait
Section titled “Error terkait”- E0027: pattern does not mention field: kembaran E0026, yaitu field asli yang terlewat dari pattern-mu. Sering muncul bersama E0026.
- E0559: variant has no field named x: nama salah yang sama saat membuat varian enum.
- E0560: struct has no field named x: nama salah yang sama saat membuat struct.
- E0609: no field on type: nama salah yang sama saat membaca field, seperti
user.nmae. - E0533: expected unit struct, unit variant or constant: variannya benar, tapi bentuk pattern-nya salah (tanpa
{ }). - Semua error compiler: daftar lengkap halaman error.
Kuis singkat
Section titled “Kuis singkat”Kuis singkat
1. Untuk enum Shape { Circle { radius: f64 } }, apa yang diminta oleh pattern Shape::Circle { r }?
2. Kamu ingin field radius disimpan di variabel bernama r. Pattern mana yang berhasil?
3. Apakah User { nmae, .. } bisa dikompilasi kalau nama field-nya name?
Skor: 0 / 3
Bacaan lebih lanjut
Section titled “Bacaan lebih lanjut”- E0026 — Rust error codes index (bahasa Inggris): penjelasan resmi untuk error ini.
- Pattern Syntax — The Rust Book (bahasa Inggris): destructuring struct dan enum, termasuk
field: variabeldan... - Destructuring structs — Rust by Example (bahasa Inggris): contoh-contoh kecil pattern struct yang bisa langsung dijalankan.
- Patterns — The Rust Reference (bahasa Inggris): aturan persis untuk pattern struct dan singkatan field.