Option — value may or may not exist (no error info). Result — operation succeeded or failed (carries error info).
Option:
Some(T) for present values, None for absent..unwrap_or(), .map(), .and_then(), .filter().1fn find_by_key(key: &str) -> Option<String> {2 let map = std::collections::HashMap::from([3 ("name".to_string(), "Alice".to_string()),4 ]);5 map.get(key).cloned()6}78// Chaining with Option9let name = find_by_key("name")10 .map(|s| s.to_uppercase())11 .unwrap_or("Unknown".to_string());
Result:
Ok(T) for success, Err(E) for failure.? operator propagates errors up the call stack.1use std::fs;23fn read_config() -> Result<String, Box<dyn std::error::Error>> {4 let content = fs::read_to_string("config.toml")?;5 Ok(content)6}78// Using ? for error propagation9fn parse_config() -> Result<u32, Box<dyn std::error::Error>> {10 let content = fs::read_to_string("config.toml")?;11 let value: u32 = content.trim().parse()?;12 Ok(value)13}
When to use:
Option for: lookups, optional fields, nullable values, iterators.Result for: file I/O, network calls, parsing, database queries.Common mistakes:
unwrap() in production — can panic.? or match.Option and Result — Result needs an error type.