Operator Tanda Tanya '?'
Termasuk bagian Logika dan Alur dalam perjalanan Rust di Coddy. Pelajaran 46 dari 66.
Saat bekerja dengan fungsi yang mengembalikan Result, kamu sering perlu menangani error dengan menanganinya secara lokal atau meneruskannya ke fungsi pemanggil. Rust menyediakan operator yang elegan untuk pola umum ini: operator tanda tanya ?.
Operator ? menyediakan cara yang rapi untuk meneruskan error tanpa menulis pernyataan match yang panjang. Saat kamu menempatkan ? setelah Result, operator itu secara otomatis membuka nilai Ok atau langsung mengembalikan nilai dari fungsi saat ini dengan Err:
fn parse_and_double(s: &str) -> Result<i32, std::num::ParseIntError> {
let number = s.parse::<i32>()?; // Jika parsing gagal, kembalikan error
Ok(number * 2) // Jika berhasil, kalikan angkanya dengan 2
}Ini setara dengan menulis pernyataan match lengkap, tetapi jauh lebih ringkas. Jika s.parse::<i32>() mengembalikan Ok, ? mengambil nilainya dan menetapkannya ke number. Jika mengembalikan Err, ? langsung mengembalikan error tersebut dari seluruh fungsi.
Perhatikan sintaks ::<i32>. Ini disebut turbofish, dan memberi tahu Rust tipe yang akan digunakan untuk mengurai string. Fungsi ini mengembalikan Result<i32, std::num::ParseIntError>, dengan i32 sebagai tipe keberhasilan dan std::num::ParseIntError sebagai tipe error yang dikembalikan saat penguraian gagal.
Operator ? hanya dapat digunakan dalam fungsi yang mengembalikan Result (atau Option), karena operator ini perlu dapat mengembalikan error.
Tantangan
MudahKamu akan menerima dua input. Input pertama adalah string yang harus diurai menjadi bilangan bulat, dan input kedua adalah string lain yang juga harus diurai menjadi bilangan bulat. Buat fungsi bernama add_numbers yang menerima dua potongan string sebagai parameter dan mengembalikan Result<i32, std::num::ParseIntError>. Di dalam fungsi, gunakan operator ? untuk mengurai kedua string dan mengembalikan jumlahnya yang dibungkus dalam Ok. Panggil fungsi dengan kedua input dan tangani hasilnya menggunakan match.
Persyaratan:
- Baca input pertama (angka pertama sebagai string) dan hapus spasi di sekitarnya
- Baca input kedua (angka kedua sebagai string) dan hapus spasi di sekitarnya
- Buat fungsi
add_numbersyang menerima dua parameter&strdan mengembalikanResult<i32, std::num::ParseIntError> - Di dalam fungsi, uraikan string pertama menjadi
i32menggunakan operator? - Uraikan string kedua menjadi
i32menggunakan operator? - Kembalikan
Ok(sum), dengan sum adalah penjumlahan kedua angka yang telah diurai - Panggil fungsi dengan kedua string input
- Gunakan ekspresi
matchuntuk menanganiResult - Pada cabang
Ok(value), cetak:Sum: [value] - Pada cabang
Err(_), cetak:Parsing error
Input:
- Baris pertama: String yang merepresentasikan sebuah angka (misalnya,
15) - Baris kedua: String yang merepresentasikan angka lainnya (misalnya,
27)
Output:
- Jika kedua string adalah angka yang valid:
Sum: [result] - Jika salah satu string tidak dapat diurai:
Parsing error
Coba sendiri
use std::io;
// TODO: Buat fungsi add_numbers di sini
// Fungsi ini harus menerima dua parameter &str dan mengembalikan Result<i32, std::num::ParseIntError>
fn main() {
// Baca input pertama
let mut input1 = String::new();
io::stdin().read_line(&mut input1).expect("Failed to read line");
let input1 = input1.trim();
// Baca input kedua
let mut input2 = String::new();
io::stdin().read_line(&mut input2).expect("Failed to read line");
let input2 = input2.trim();
// TODO: Panggil add_numbers dengan input1 dan input2
// TODO: Gunakan match untuk menangani Result
// Cetak "Sum: [value]" untuk Ok(value)
// Cetak "Parsing error" untuk Err(_)
}Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Alur Kontrol Lanjutan
Ekspresi 'match'Mencocokkan Beberapa NilaiMencocokkan RentangEkspresi 'if let'Perulangan sebagai EkspresiRangkuman, Parser Perintah Sederhana4Mengelompokkan Data dengan Struct
Apa Itu Struct?Ringkasan StructMengakses Field StructStruct yang Dapat DiubahStruct sebagai Parameter FungsiStruct TupleRangkuman: Buat Struct Buku7Menangani error dengan 'Result'
Apa itu 'Result'?Menggunakan 'match' dengan 'Result'is_ok() dan is_err()Cara singkat: unwrap dan expectOperator Tanda Tanya '?'Mengurai string menjadi angkaRangkuman: Fungsi Pembagian Aman2Pengantar Vektor
Apa Itu Vektor?Membuat VektorMenambahkan Elemen dengan pushMengakses Elemen VektorMelakukan Iterasi pada VektorIterasi MutableMenghapus ElemenRangkuman: Pelacak Skor Dasar5Pasangan Kunci-Nilai dengan Hash Map
Apa Itu Hash Map?Membuat Hash MapMenyisipkan Pasangan Kunci-NilaiMengakses NilaiMenelusuri Hash MapMemperbarui NilaiMenghapus PasanganRangkuman: Penghitung Kata8Proyek: Inventaris Barang Sederhana
Menyiapkan ProyekMenambahkan BarangMemeriksa StokMenjual BarangMenyatukan Semuanya3Daftar Tugas Baris Perintah
Penyiapan ProyekMenambahkan TugasMelihat Semua TugasMenghapus TugasKode AkhirLatihan sendiri: Compiler Rust online