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— แปลงค่า Okmap_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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Result และตัวดำเนินการ ?
- thiserror
- anyhow
- การแปลงข้อผิดพลาด