In Rust is de standaardmethode voor het converteren van een string naar een getal de parse() methode. Deze kan worden toegepast op types die de FromStr trait implementeren, bijvoorbeeld om String of &str naar i32, f64 en andere te converteren.
Voorbeeld:
let num: i32 = "42".parse().unwrap();
Echter, bij een onjuiste string ontstaat er een fout (Result::Err). Het is belangrijk om het resultaat via match te verwerken om een crash van de applicatie te voorkomen:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("Getal: {}", n), Err(e) => println!("Parser fout: {}", e), }
De parse-methode ondersteunt type-overloading via "turbofish" (::<i32>), als het type niet impliciet kan worden afgeleid.
Vraag: Kun je .parse() aanroepen zonder het type tijdens compilatie op te geven en een correct resultaat krijgen?
Vaak wordt beantwoord: Ja, als de string een getal bevat.
Correct antwoord: Nee, tijdens compilatie moet het type bekend zijn waarin de conversie plaatsvindt. Als het type niet kan worden afgeleid (bijvoorbeeld als het verder niet expliciet wordt gebruikt), geeft de compiler een foutmelding.
Voorbeeld van foutieve code:
let x = "10".parse(); // Fout: onduidelijk in welk type te parseren
Om dit te corrigeren, gebruik turbofish:
let x = "10".parse::<i32>().unwrap();
Verhaal
In de configuratie-parsingmodule lieten ze .parse().unwrap() zonder foutafhandeling. Eén typfout in de gebruikersinstelling leidde tot panic! en stopte de hele applicatie in productie.
Verhaal
In een project gaven ontwikkelaars het type niet expliciet op (gebruikten geen turbofish), en de variabele werd tijdelijk niet gebruikt, waardoor de compiler het type niet kon afleiden, wat leidde tot een moeilijk te traceren fout bij de compilatie.
Verhaal
In een project ontstond er een bug omdat ze per ongeluk parse::<u8> gebruikten om een groot getal uit een string te parseren, wat leidde tot een overflow-fout. De fout werd pas weken later ontdekt, toen gegevens waren verloren.