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
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