Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Kamu 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_numbers yang menerima dua parameter &str dan mengembalikan Result<i32, std::num::ParseIntError>
  • Di dalam fungsi, uraikan string pertama menjadi i32 menggunakan operator ?
  • Uraikan string kedua menjadi i32 menggunakan operator ?
  • Kembalikan Ok(sum), dengan sum adalah penjumlahan kedua angka yang telah diurai
  • Panggil fungsi dengan kedua string input
  • Gunakan ekspresi match untuk menangani Result
  • 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(_)
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Rust online