0Pricing
Learn Rust Coding · บทเรียน

Result และตัวดำเนินการ ?

ส่งต่อข้อผิดพลาด

Result และตัวดำเนินการ ? เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

ชนิด Result

Result<T, E> แทนการดำเนินการที่อาจสำเร็จด้วย Ok(T) หรือล้มเหลวด้วย Err(E) ซึ่งเป็นชนิดหลักสำหรับจัดการข้อผิดพลาดใน Rust

fn main() {
    let parsed: Result<i32, _> = "42".parse::<i32>();
    println!("{:?}", parsed);
}

การจับคู่กับ Result

คุณสามารถจัดการผลลัพธ์ทั้งสองแบบอย่างชัดเจนด้วย match

fn main() {
    match "oops".parse::<i32>() {
        Ok(n) => println!("got {n}"),
        Err(e) => println!("error: {e}"),
    }
}

การคืนค่า Result

ฟังก์ชันที่อาจล้มเหลวจะคืนค่าเป็น Result เพื่อให้ผู้เรียกตัดสินใจว่าจะจัดการข้อผิดพลาดอย่างไร

fn halve(n: i32) -> Result<i32, String> {
    if n % 2 == 0 {
        Ok(n / 2)
    } else {
        Err("odd number".to_string())
    }
}

fn main() {
    println!("{:?}", halve(10));
    println!("{:?}", halve(7));
}

ตัวดำเนินการ ?

ตัวดำเนินการ ? จะแกะค่า Ok หรือคืนค่า Err ออกจากฟังก์ชันโดยทันที ช่วยแทนที่โค้ด match และคืนค่าที่ยืดยาว

fn double_str(s: &str) -> Result<i32, std::num::ParseIntError> {
    let n = s.parse::<i32>()?;
    Ok(n * 2)
}

fn main() {
    println!("{:?}", double_str("21"));
    println!("{:?}", double_str("x"));
}

การเชื่อมต่อด้วย ?

ขั้นตอนที่อาจล้มเหลวหลายขั้นอ่านได้อย่างกระชับเมื่อเชื่อมต่อด้วย ? โดยข้อผิดพลาดแรกจะหยุดขั้นตอนที่เหลือทันที

fn sum_two(a: &str, b: &str) -> Result<i32, std::num::ParseIntError> {
    let x = a.parse::<i32>()?;
    let y = b.parse::<i32>()?;
    Ok(x + y)
}

fn main() {
    println!("{:?}", sum_two("3", "4"));
}

? ใน main

main สามารถคืนค่าเป็น Result ได้ ดังนั้นจึงใช้ ? ที่นั่นได้เช่นกัน หากคืนค่าเป็น Err โปรแกรมจะจบลงด้วยรหัสการออกที่ไม่เป็นศูนย์

fn main() -> Result<(), std::num::ParseIntError> {
    let n: i32 = "100".parse()?;
    println!("parsed {n}");
    Ok(())
}

เมธอด Result ที่มีประโยชน์

ตัวดำเนินการประกอบที่มีประโยชน์:

  • unwrap_or(default) — ใช้ค่าหรือค่าทดแทน
  • map — แปลงค่า Ok
  • map_err — แปลงข้อผิดพลาด
  • is_ok / is_err — ตรวจสอบรูปแบบย่อย
fn main() {
    let n = "x".parse::<i32>().unwrap_or(-1);
    println!("{n}");
}

แปลง Option เป็น Result

แปลง Option เป็น Result ด้วย ok_or เพื่อให้ ? ส่งต่อข้อผิดพลาดที่มีความหมายได้

fn first_char(s: &str) -> Result<char, String> {
    let c = s.chars().next().ok_or("empty string".to_string())?;
    Ok(c)
}

fn main() {
    println!("{:?}", first_char("hi"));
    println!("{:?}", first_char(""));
}

วิธีที่ ? แปลงข้อผิดพลาด

เมื่อชนิดของข้อผิดพลาดแตกต่างกัน ? จะเรียก From::from เพื่อแปลงข้อผิดพลาดให้เป็นชนิดข้อผิดพลาดที่ประกาศไว้ของฟังก์ชัน วิธีนี้ช่วยให้จัดการข้อผิดพลาดข้ามชั้นต่าง ๆ ได้อย่างสะดวก

หลีกเลี่ยง unwrap ในโค้ดใช้งานจริง

unwrap และ expect จะทำให้เกิด panic เมื่อพบ Err ใช้ได้สำหรับตัวอย่างและการทดสอบ แต่ในโค้ดจริงควรเลือกใช้ ? หรือการจัดการอย่างชัดเจน เพื่อให้ความล้มเหลวยังสามารถกู้คืนได้

การเชื่อมต่อ and_then

and_then จะเรียกใช้ขั้นตอนถัดไปที่อาจล้มเหลวต่อเมื่อขั้นตอนก่อนหน้าสำเร็จเท่านั้น โดยส่งค่าต่อไปตามลำดับ

fn main() {
    let result = "8"
        .parse::<i32>()
        .and_then(|n| Ok(n * 2));
    println!("{:?}", result);
}

ตรวจสอบอย่างรวดเร็ว

เมื่อนำตัวดำเนินการ ? ไปใช้กับ Result ที่เป็น Err ตัวดำเนินการนี้จะทำหน้าที่อะไร

สรุปทบทวน

คุณได้เรียนรู้การจัดการข้อผิดพลาดด้วย Result:

  • Result<T, E> แทนผลลัพธ์สำเร็จหรือล้มเหลว
  • ? แกะค่า Ok หรือส่งคืน Err ทันที
  • ? ใช้ได้ในฟังก์ชันและ main ที่ส่งคืน Result
  • ตัวดำเนินการอย่าง map, map_err, unwrap_or และ ok_or ช่วยจัดการผลลัพธ์
  • หลีกเลี่ยงการใช้ unwrap ในระบบจริง

คำถามที่พบบ่อย

บทเรียน “Result และตัวดำเนินการ ?” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “Result และตัวดำเนินการ ?” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “Result และตัวดำเนินการ ?”

ส่งต่อข้อผิดพลาด คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “Result และตัวดำเนินการ ?” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Result และตัวดำเนินการ ?
  2. thiserror
  3. anyhow
  4. การแปลงข้อผิดพลาด
← กลับไปที่ Learn Rust Coding