Nota: esta pergunta contém código pré-1.0 obsoleto! A resposta está correta, no entanto.
Para converter um str
para um int
em Rust, eu posso fazer isso:
let my_int = from_str::<int>(my_str);
A única maneira de saber como converter um String
para um int
é obter uma fatia e usá from_str
-la da seguinte maneira:
let my_int = from_str::<int>(my_string.as_slice());
Existe uma maneira de converter diretamente um String
para um int
?
use std::str::FromStr;
corrige isso. Mais sobre from_str, se desejar. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_strRespostas:
Você pode converter diretamente para um int usando o
str::parse::<T>()
método .Você pode especificar o tipo para analisar com o operador turboish (
::<>
) como mostrado acima ou através da anotação explícita do tipo:Conforme mencionado nos comentários,
parse()
retorna aResult
. Este resultado será umErr
se a sequência não puder ser analisada como o tipo especificado (por exemplo, a sequência"peter"
não pode ser analisada comoi32
).fonte
parse
retorna aResult
, então você precisa lidar com isso adequadamente para obter um tipo integral real.str::parse::<u32>
retorna aResult<u32, core::num::ParseIntError>
eResult::unwrap
"Desempacota um resultado, produzindo o conteúdo de umOk
[ou] pânico se o valor for umErr
, com uma mensagem de pânico fornecida peloErr
valor do".str::parse
é uma função genérica , daí o tipo entre colchetes angulares.fonte
let my_u8: u8
), não precisará do valor entre colchetes angulares. Observe também que o estilo Rust predominante indica que:
deve ficar no lado esquerdo.let my_u32: u32 = "42".parse().unwrap()
Se você obtiver sua corda
stdin().read_line
, precisará cortá-la primeiro.fonte
Com uma noite recente, você pode fazer o seguinte:
O que está acontecendo aqui é que
String
agora pode ser desreferenciado para astr
. No entanto, a função quer um&str
, então temos que pedir emprestado novamente. Para referência, acredito que esse padrão específico (&*
) é chamado de "empréstimo cruzado".fonte
String
em um ponto e esperei que funcionasse.my_sttring.as_slice()
comomy_string[]
(atualmenteslicing_syntax
é fechado por recurso, mas provavelmente alguma forma dele terminaria no idioma).Você pode usar o método
FromStr
da característicafrom_str
, que é implementado parai32
:fonte
Bem não. Por que deveria haver? Apenas descarte a corda se não precisar mais dela.
&str
é mais útil do queString
quando você precisa ler apenas uma sequência, porque é apenas uma visualização da parte original dos dados, não do proprietário. Você podeString
distribuí- lo com mais facilidade e é copiável, portanto não é consumido pelos métodos invocados. Nesse sentido, é mais geral: se você tiver umString
, poderá passá-lo para onde&str
é esperado, mas, se tiver&str
, só poderá passá-lo para funções esperadasString
se fizer uma nova alocação.Você pode encontrar mais informações sobre as diferenças entre esses dois e quando usá-los no guia oficial de strings .
fonte
.as_slice()
toda vez que preciso fazerfrom_str
em uma String. Argumentos de linha de comando, por exemplo, é um lugar onde eu preciso fazerfrom_str
em todos os argumentos para interpretá-los comoint
s etc.as_slice()
é apenas um aspecto menor do manuseio de strings. Por exemplo, você pode usar a sintaxe de fatia (s[]
) ou explorar aDeref
coerção (&*s
). Existe até uma proposta que permitiria escrever apenas&s
.&s
faria por uma string? Daria umastr
volta? Você poderia me indicar a proposta?str
não é com o que você está trabalhando; é&str
. Eles são diferentes (mas relacionados). O primeiro é um tipo de tamanho dinâmico que você quase nunca usaria diretamente, enquanto o último é uma fatia de corda que é um ponteiro gordo. A proposta é chamada de deref coercions ; permitiria coagir de&T
para&U
seT: Deref<U>
. DesdeString: Deref<str>
já, você será capaz de obter&str
a partirString
com apenas&
. Ainda está em discussão, mas duvido que isso aconteça antes da versão 1.0 - resta muito pouco tempo.Então, basicamente, você deseja converter uma String em um inteiro inteiro! Aqui está o que eu mais uso e isso também é mencionado na documentação oficial.
Isso funciona para String e & str Espero que isso ajude também.
fonte