Option — value may or may not exist (no error info). Result — operation succeeded or failed (carries error info).
Option:
Some(T) for present, None for absent.1fn divide(a: f64, b: f64) -> Option<f64> {2 if b == 0.0 {3 None4 } else {5 Some(a / b)6 }7}89let result = divide(10.0, 2.0)10 .map(|x| x * 100.0)11 .unwrap_or(0.0);
Result:
Ok(T) for success, Err(E) for failure.? operator propagates errors.1use std::num::ParseIntError;23fn parse_number(s: &str) -> Result<i32, ParseIntError> {4 s.parse::<i32>()5}67fn main() {8 match parse_number("42") {9 Ok(n) => println!("Got: {}", n),10 Err(e) => eprintln!("Error: {}", e),11 }12}
When to use:
Option for: lookups, optional fields, nullable values.Result for: I/O, parsing, network, any fallible operation.Common mistakes:
unwrap() in production — can panic.? or match.Option when error reason matters — use Result.