15.4 Error Propagation with the ?
Operator
Writing match
for every possible error can be verbose. The ?
operator streamlines error propagation while preserving the explicitness Rust requires.
15.4.1 Mechanism of the ?
Operator
If the result is Ok(T)
, the value T
is extracted. If the result is Err(E)
, the function returns Err(E)
immediately:
#![allow(unused)] fn main() { use std::fs::File; use std::io::{self, Read}; fn read_username_from_file() -> Result<String, io::Error> { let mut s = String::new(); File::open("username.txt")?.read_to_string(&mut s)?; Ok(s) } }
Without ?
, you would need explicit match
blocks at each stage.