Rust bir dize int dönüştürmek?


187

Not: Bu soru, kullanılmayan 1.0 öncesi kodu içeriyor! Ancak cevap doğrudur.

Bir dönüştürmek için strbir etmek intRust, ben bunu yapabilirsiniz:

let my_int = from_str::<int>(my_str);

Ben dönüştürmek için bildiğim tek yolu Stringbir karşı intbunun bir dilim almak ve sonra kullanmaktır from_strşöyle Üzerinde:

let my_int = from_str::<int>(my_string.as_slice());

Doğrudan bir dönüştürmek için bir yolu var mı Stringbir etmek int?


1
Ayrıca , ondalık olmayan (ör. Altıgen) için stackoverflow.com/q/32381414/500207 adresine bakın .
Ahmed Fasih

2
Biraz açık, ancak 2014'ten sonra bu soruyu iyi bulan ve not_str'un neden kapsamda olmadığını merak eden bir not, başlangıçta değil. use std::str::FromStr;bunu düzeltir. İsterseniz from_str ile ilgili daha fazla bilgi edinin. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_str
7l-l04

Yanıtlar:


261

str::parse::<T>()Yöntemi kullanarak doğrudan int'ye dönüştürebilirsiniz .

let my_string = "27".to_string();  // `parse()` works with `&str` and `String`!
let my_int = my_string.parse::<i32>().unwrap();

::<>Yukarıda gösterildiği gibi turbofish işleci ( ) ile ayrıştırılacak türü veya açık tür ek açıklamasıyla belirtebilirsiniz :

let my_int: i32 = my_string.parse().unwrap();

Yorumlarda belirtildiği gibi, parse()a Result. Bu sonuç Err, dize belirtilen tür olarak ayrıştırılamazsa (örneğin, dize "peter"şu şekilde ayrıştırılamazsa i32) olur.


35
A parsedöndürdüğünüResult unutmayın , bu yüzden gerçek bir integral türüne ulaşmak için bunu uygun şekilde ele almanız gerekir.
Shepmaster

54
let my_u8: u8 = "42".parse::<u8>().unwrap();
let my_u32: u32 = "42".parse::<u32>().unwrap();

// or, to be safe, match the `Err`
match "foobar".parse::<i32>() {
  Ok(n) => do_something_with(n),
  Err(e) => weep_and_moan(),
}

str::parse::<u32>a değerini döndürür Result<u32, core::num::ParseIntError>ve Result::unwrap"Sonucunun paketini açar Ok, değer bir ise, [veya] paniklerinin içeriğini 'değer Errtarafından sağlanan panik mesajıyla Errverir.'

str::parsea, genel fonksiyon , dirsekler dolayısıyla türü.


9
Değişkenin ( let my_u8: u8) türünü belirtirseniz, köşeli parantez içindeki değere ihtiyacınız yoktur. Ayrıca, geçerli Rust tarzının :sol tarafa yapışması gerektiğini gösterdiğine dikkat edin .
Shepmaster

5
Özellikle, demek let my_u32: u32 = "42".parse().unwrap()
istedim

9

Eğer dize gelen alırsanız stdin().read_line, önce onu Döşeme gerekiyor.

let my_num: i32 = my_num.trim().parse()
   .expect("please give me correct string number!");

6

Yakın zamanda bir gecede bunu yapabilirsiniz:

let my_int = from_str::<int>(&*my_string);

Burada olan şu ki Stringşimdi a str. Ancak, fonksiyon bir istiyor &str, bu yüzden tekrar ödünç almalıyız. Referans olarak, bu özel örüntüye ( &*) "çapraz borçlanma" denildiğine inanıyorum .


Tamam ben geceleri değilim ama bir cevap olarak kabul edeceğim çünkü aslında Stringbir noktada atılmayı denedim ve işe yarayacağını umdum.
2014

2
Alternatif olarak, şu anda ifade my_sttring.as_slice()edilebilir my_string[](şu anda slicing_syntaxözellikli, ancak büyük olasılıkla bunun bir biçimi dilde olabilir).
tempestadept

2

Aşağıdakiler için uygulanan FromStrözelliğin from_stryöntemini kullanabilirsiniz i32:

let my_num = i32::from_str("9").unwrap_or(0);

0

Hayır. Neden olmalı? Artık ihtiyacınız yoksa dizeyi atın.

&strStringyalnızca bir dizeyi okumanız gerektiğinden daha yararlıdır , çünkü sahibinin değil, yalnızca orijinal veri parçasının bir görünümüdür. Etrafından daha kolay geçebilirsiniz Stringve kopyalanabilir, bu nedenle çağrılan yöntemlerle tüketilmez. Bu bağlamda daha geneldir: Eğer varsa String, a'nın &strbeklendiği yere iletebilirsiniz , ancak eğer varsa &str, bunu sadece Stringyeni bir ayırma yaparsanız bekleyen işlevlere iletebilirsiniz .

Bu ikisi arasındaki farklar ve bunların ne zaman kullanılacağı hakkında daha fazla bilgiyi resmi dizeler kılavuzunda bulabilirsiniz .


Peki, "olması gerektiği" nin açık bir nedeni, bence , bir Dize .as_slice()yapmak istediğim her zaman yapmak zorunda from_strkalmamamdır. Komut satırı argümanları, örneğin, from_strtüm argümanlarda bunları intvb. Olarak yorumlamak için yapmam gereken bir yerdir
mtahmed

as_slice()dize işlemenin yalnızca küçük bir yönüdür. Örneğin, dilimleme sözdizimini ( s[]) kullanabilir veya Derefzorlamayı ( &*s) kullanabilirsiniz. Sadece yazmaya izin verecek bir teklif bile var &s.
Vladimir Matveev

Ooooh! &sBir dize için ne yapardı ? strGeri verir mi ? Beni teklife yönlendirebilir misin?
2014'te

1
Her şeyden önce, strüzerinde çalıştığınız şey değil; öyle &str. Farklılar (ancak ilgili). Birincisi, neredeyse hiç doğrudan kullanamayacağınız dinamik olarak boyutlandırılmış bir türken, ikincisi bir yağ işaretçisi olan bir dize dilimi. Teklife deref baskısı denir ; ondan zorlamak olanak sağlayacak &Tkadar &Ueğer T: Deref<U>. Beri String: Deref<str>zaten, sen elde etmek mümkün olacaktır &strdan Stringsadece birlikte &. Hala tartışılıyor ama 1.0'dan önce olacağından şüpheliyim - çok az zaman kaldı.
Vladimir Matveev

-1

Temel olarak bir String'i bir Tamsayıya dönüştürmek istiyorsunuz! İşte en çok kullandığım şey ve resmi belgelerde de belirtiliyor.

fn main() {

    let char = "23";
    let char : i32 = char.trim().parse().unwrap();
    println!("{}", char + 1);

}

Bu hem String hem de & str için çalışır Umarım bu da yardımcı olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.