Rust'ta bir dizeyi sayıya dönüştürmenin standart yöntemi parse() metodudur. Bu, FromStr trait'ini uygulayan türlere uygulanabilir, örneğin String veya &str'yi i32, f64 ve diğerlerine dönüştürmek için.
Örnek:
let num: i32 = "42".parse().unwrap();
Ancak yanlış bir dize durumunda bir hata oluşur (Result::Err). Uygulamanın çökmesini önlemek için sonucu match ile işlemek önemlidir:
let input = "abc"; match input.parse::<i32>() { Ok(n) => println!("Sayı: {}", n), Err(e) => println!("Hata: {}", e), }
Parse metodu, türün belirsiz olduğu durumlarda türün açık bir şekilde belirtilmesi için "turbofish" (::<i32>) üzerinden türü destekler.
Soru: .parse()'i derleme esnasında tür belirtmeden çağırmak mümkün mü ve doğru bir sonuç alınabilir mi?
Sıklıkla verilen cevap: Evet, eğer dize bir sayı içeriyorsa.
Doğru cevap: Hayır, derleme esnasında dönüşüm yapılacak tür bilinmelidir. Eğer tür çıkartılamıyorsa (örneğin, daha sonra açıkça kullanılmıyorsa) derleyici hata verecektir.
Yanlış kod örneği:
let x = "10".parse(); // Hata: hangi türe parse edileceği belirsiz
Düzeltmek için turbofish kullanın:
let x = "10".parse::<i32>().unwrap();
Hikaye
Konfigürasyonun parse edilmesi modülünde hata işleme olmadan .parse().unwrap() bırakıldı. Kullanıcı ayarındaki bir yazım hatası, tüm uygulamanın üretimde çökmesine yol açtı.
Hikaye
Bir projede geliştiriciler türü açıkça belirtmemişlerdi (turbofish kullanmamışlardı) ve ara değişken geçici olarak kullanılmadığı için derleyici türü çıkartamadı, bu da derleme aşamasında zorlayıcı bir hataya yol açtı.
Hikaye
Bir projede, bir dizeden büyük bir sayıyı parse etmek için yanlışlıkla parse::<u8> uygulandı ve bu da taşma hatasına yol açtı. Hata, birkaç hafta kullanımdan sonra ve verilerin kaybedilmesi sonrasında fark edildi.