capypad
0 Tage Serie
rust / intermediate
Snippet

Result-Typ-Komposition mit map und and_then

Die map-Methode von Result transformiert den Ok-Wert und bewahrt dabei Fehler. and_then (flat_map) verketettet Berechnungen, die Result zurückgeben, und ermöglicht Pipeline-artige Fehlerbehandlung ohne verschachtelte Matches. Der ?-Operator funktioniert gut mit beiden, aber map/and_then glänzen bei der Transformation von Werten innerhalb einer Kette. Diese funktionale Komposition hält die Fehlerbehandlung sauber und lesbar.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use std::num::ParseIntError;
 
fn parse_and_double(s: &str) -> Result<i32, ParseIntError> {
s.parse::<i32>().map(|n| n * 2)
}
 
fn parse_and_check(s: &str) -> Result<i32, ParseIntError> {
s.parse::<i32>()
.and_then(|n| if n > 0 { Ok(n) } else { Err(ParseIntError::default()) })
}
 
fn main() {
let inputs = vec!["42", "hello", "-5", "100"];
 
for s in inputs {
match parse_and_double(s) {
Ok(n) => println!("{} doubled = {}", s, n),
Err(_) => println!("Could not parse '{}'", s),
}
}
 
if let Ok(n) = parse_and_check("50") {
println!("50 is positive: {}", n);
}
}
Erklärung
1
.map(|n| n * 2)
Transformiert Ok-Wert: i32 -> i32; Err bleibt unverändert durchgereicht
2
.and_then(|n| ...)
Verkettet einen Result-zurückgebenden Closure; muss Result-Typ zurückgeben
3
if n > 0 { Ok(n) } else { Err(...) }
Bedingte Fehlererstellung innerhalb einer and_then-Kette
4
Err(ParseIntError::default())
Erstellt Fehlerfall wenn Validierung fehlschlägt, Kurzschluss der Kette