Rust, string'leri sayılara dönüştürmek için FromStr trait'ini kullanarak kullanışlı standart araçlar sağlar. En sık kullanılan yöntem .parse::<T>()dir, bu da string'ler ve dilimlerde çağrılabilir.
Birçok dilde string'i sayıya dönüştürmek alışılmış bir görevdir, ancak Rust bunu mümkün olduğunca güvenli ve şeffaf bir biçimde yapar; hata işleme standart kütüphanenin bir parçasıdır ve çalışma zamanı istisnaları değildir.
.parse::<T>() Result<T, ParseIntError> (veya diğer türler için benzer) türünde bir sonuç döndürür; bu durum başarısızlıkları açıkça işlemeye zorlar. Sık yapılan bir hata, hatanın olasılığını göz ardı etmek, analiz yapmadan unwrap() kullanmaktır, bu durum hatalı verilerde programın çökmesine yol açar, bu da hatalı bir hata mesajı yerine geçmez.
String'leri dönüştürmek için parse yöntemini kullanırız. Söz dizimi:
let num: i32 = "42".parse().unwrap();
Ancak daha doğru olanı hatayı işlemektir:
let s = "abc"; match s.parse::<i32>() { Ok(n) => println!("Elde edilen sayı: {}", n), Err(e) => println!("Ayrıştırma hatası: {e}"), }
Anahtar özellikler:
FromStr uygulanmıştır, ancak kesin kısıtlamalar belirsizdir: boşluklar, işaretler ve taşma farklı şekilde dikkate alınır.Result olarak döndürülür, panik veya istisna yoluyla değil.FromStr uygulamasına sahip tür (özel olanlar da dahil) .parse() hedefi olabilir.Sonuç tipini belirtmeden parse kullanabilir miyiz?
Hayır, tipin (veya örtük tip çıkarımının) belirtilmemesi durumunda Rust hata verir, çünkü hangi tipe dönüştüreceğini anlamaz.
Sayının sayıya dönüştürülmesinde sayısal olmayan bir içeriğe sahip string ayrıştırılmaya çalışılırsa ne olur?
Yöntem bir hata döndürür (Err(...)), panik oluşturmaz. Hata Debug trait'ini uygular, bu da çıktı için kullanışlıdır.
let num: Result<u32, _> = "not_a_number".parse(); assert!(num.is_err());
Eğer içeriğinden eminseniz, parse'dan sonra unwrap kullanabilir miyiz?
Teknik olarak mümkündür, ancak bu bir anti-patern'dir. Eğer string beklenmedik bir şekilde geçersizse, program çökebilir.
unwrap() kullanımıtrim kullanılmamasıparse::<String>())Konsol aracı kullanıcıdan bir sayı okur ve .parse().unwrap() kullanır. Rastgele hatalı bir girişle program aniden çökebilir, kullanıcı nedenini anlayamaz.
Avantajlar:
Dezavantajlar:
Giriş önce boşluklardan arındırılır, ve match ile ya da gerekiyorsa kendi hatasını döndürmek için map_err kullanılarak parse yapılır. Hatalar doğru bir şekilde işlenir ve belirgin bir hata mesajı verilir.
Avantajlar:
Dezavantajlar: