2014-11-20 21 views
60

Nota: questa domanda contiene codice deprecato precedente alla 1.0! La risposta è corretta, però.Convertire una stringa in int in Rust?

Per convertire un str a un int a Rust, posso fare questo:

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

L'unico modo che conosco come convertire un String a un int è quello di ottenere una fetta di esso e quindi utilizzare from_str su di esso in questo modo:

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

c'è un modo per convertire direttamente un String a un int?

+0

Vedere anche: http://stackoverflow.com/q/32381414/500207 per non decimale (es. Esadecimale). –

risposta

81

È possibile convertire direttamente in int utilizzando str::parse::<T>() method.

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

È possibile specificare il tipo di analizzare a con l'operatore turbofish (::<>) come mostrato sopra o attraverso tipo di annotazione esplicita:

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

Come accennato nei commenti, parse() restituisce un Result. Questo risultato sarà un Err se la stringa non può essere analizzata come il tipo specificato (ad esempio, la stringa "peter" non può essere analizzata come i32).

+19

Si noti che ['parse' restituisce un' Result'] (http://doc.rust-lang.org/std/primitive.str.html#method.parse), quindi è necessario gestirlo in modo appropriato per arrivare a un vero e proprio tipo integrale. – Shepmaster

+12

Inoltre, 'int' è stato rimosso dalla lingua. Utilizzare invece una dimensione specifica ('u8',' u32', ecc.). – Shepmaster

5

Con una recente notte, si può fare questo:

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

Quello che sta succedendo qui è che String ora possono essere dereferenziato in un str. Tuttavia, la funzione vuole un &str, quindi dobbiamo prendere nuovamente in prestito. Per riferimento, credo che questo particolare modello (&*) sia chiamato "cross-borrowing".

+0

Okay, non sono in nightly ma lo accetterò come risposta dato che in effetti ho provato a dereferenziare un 'String' ad un certo punto e speravo che avrebbe funzionato. – mtahmed

+2

In alternativa, puoi esprimere 'my_sttring.as_slice()' come 'my_string []' (attualmente 'slicing_syntax' è con gating, ma molto probabilmente una qualche forma di esso finirebbe nella lingua). – tempestadept

0

Bene, no. Perché dovrebbe esserci? Basta scartare la stringa se non ne hai più bisogno.

&str è più utile di String quando è necessario leggere solo una stringa, perché è solo una vista nel pezzo originale di dati, non il suo proprietario. È possibile passarlo più facilmente rispetto a String ed è possibile copiarlo, quindi non viene utilizzato dai metodi richiamati. A questo proposito è più generale: se si dispone di un String, è possibile passarlo a dove è previsto un &str, ma se si dispone di &str, è possibile passarlo solo alle funzioni che prevedono String se si effettua una nuova allocazione.

È possibile trovare ulteriori informazioni sulle differenze tra questi due e quando utilizzarli nello official strings guide.

+0

Beh, una ragione ovvia per cui "dovrebbe esserci", secondo me, è che non dovrei fare '.as_slice()' ogni volta che devo fare 'from_str' su una stringa. Gli argomenti della riga di comando, ad esempio, sono un punto in cui devo eseguire 'from_str' su tutti gli argomenti per interpretarli come' int's ecc. – mtahmed

+0

'as_slice()' è solo un aspetto secondario della gestione delle stringhe. Ad esempio, è possibile utilizzare la sintassi di slicing ('s []') o sfruttare la coercizione 'Deref' (' & * s'). C'è anche una proposta che permetterebbe di scrivere solo '& s'. –

+0

Ooooh! Cosa sarebbe '& s' fare per una stringa? Darebbe un 'str' indietro? Potresti indicarmi la proposta? – mtahmed

29
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(), 
} 

parse restituisce un core::result::Result<u32, core::num::ParseIntError> e unwrap "sposta il valore v fuori dalla opzione se si tratta di qualche (v) [o] panic se il valore è uguale a sé None".

parse è un generic function, quindi il tipo in parentesi angolari.

+6

Se si specifica il tipo di variabile ('let my_u8: u8'), non è necessario il valore tra parentesi angolari. Si noti inoltre che lo stile di ruggine prevalente indica che ':' deve rimanere sul lato sinistro. – Shepmaster

+3

In particolare intendevo 'let my_u32: u32 =" 42 ".parse(). Unwrap()' – Shepmaster