Remarque: cette question contient du code pré-1.0 obsolète! La réponse est cependant correcte.
Pour convertir un str
en un int
dans Rust, je peux faire ceci:
let my_int = from_str::<int>(my_str);
La seule façon de savoir comment convertir un String
en un int
est d'en obtenir une tranche et de l'utiliser from_str
comme ceci:
let my_int = from_str::<int>(my_string.as_slice());
Existe-t-il un moyen de convertir directement un String
en un int
?
use std::str::FromStr;
corrige cela. Plus d'informations sur from_str si vous le souhaitez. doc.rust-lang.org/std/str/trait.FromStr.html#tymethod.from_strRéponses:
Vous pouvez directement convertir en un entier en utilisant la
str::parse::<T>()
méthode .let my_string = "27".to_string(); // `parse()` works with `&str` and `String`! let my_int = my_string.parse::<i32>().unwrap();
Vous pouvez soit spécifier le type à analyser avec l'opérateur turbofish (
::<>
) comme indiqué ci-dessus, soit via une annotation de type explicite:let my_int: i32 = my_string.parse().unwrap();
Comme mentionné dans les commentaires,
parse()
renvoie un fichierResult
. Ce résultat sera unErr
si la chaîne n'a pas pu être analysée comme le type spécifié (par exemple, la chaîne"peter"
ne peut pas être analysée commei32
).la source
parse
renvoie aResult
, vous devez donc gérer cela de manière appropriée pour obtenir un type intégral réel.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>
renvoie aResult<u32, core::num::ParseIntError>
etResult::unwrap
"Développe un résultat, ce qui donne le contenu d'unOk
[ou] panique si la valeur est anErr
, avec un message de panique fourni par laErr
valeur de."str::parse
est une fonction générique , d'où le type entre chevrons.la source
let my_u8: u8
), vous n'avez pas besoin de la valeur entre crochets angulaires. Notez également que le style de rouille qui prévaut indique qu'il:
doit rester du côté gauche.let my_u32: u32 = "42".parse().unwrap()
Si vous obtenez votre chaîne
stdin().read_line
, vous devez d'abord la couper.let my_num: i32 = my_num.trim().parse() .expect("please give me correct string number!");
la source
Avec une soirée récente, vous pouvez faire ceci:
let my_int = from_str::<int>(&*my_string);
Ce qui se passe ici, c'est qu'il
String
peut maintenant être déréférencé en un fichierstr
. Cependant, la fonction veut un&str
, donc nous devons emprunter à nouveau. Pour référence, je crois que ce modèle particulier (&*
) est appelé «emprunt croisé».la source
String
à un moment donné et espéré que cela fonctionnerait.my_sttring.as_slice()
commemy_string[]
(slicing_syntax
est actuellement limité par les fonctionnalités, mais très probablement une forme de celui-ci se retrouverait dans la langue).Vous pouvez utiliser la méthode
FromStr
du traitfrom_str
, qui est implémentée pouri32
:let my_num = i32::from_str("9").unwrap_or(0);
la source
Et bien non. Pourquoi devrait-il y en avoir? Jetez simplement la chaîne si vous n'en avez plus besoin.
&str
est plus utile queString
lorsque vous n'avez besoin de lire qu'une chaîne, car il ne s'agit que d'une vue de la donnée d'origine, pas de son propriétaire. Vous pouvez le transmettre plus facilement queString
, et il est copiable, il n'est donc pas consommé par les méthodes appelées. À cet égard, c'est plus général: si vous avez unString
, vous pouvez le passer à l'endroit où un&str
est attendu, mais si vous l'avez&str
, vous ne pouvez le passer qu'aux fonctions attenduesString
si vous faites une nouvelle allocation.Vous pouvez en savoir plus sur les différences entre ces deux et quand les utiliser dans le guide officiel des chaînes .
la source
.as_slice()
chaque fois que je dois le fairefrom_str
sur une chaîne. Les arguments de ligne de commande, par exemple, sont un endroit où je dois fairefrom_str
sur tous les arguments pour les interpréter commeint
s etc.as_slice()
n'est qu'un aspect mineur de la gestion des chaînes. Par exemple, vous pouvez utiliser la syntaxe de découpage (s[]
) ou exploiter laDeref
coercition (&*s
). Il existe même une proposition qui permettrait d'écrire juste&s
.&s
pour une chaîne? Cela rendrait-il unstr
retour? Pouvez-vous m'indiquer la proposition?str
n'est pas ce avec quoi vous travaillez; ça l'est&str
. Ils sont différents (mais liés). Le premier est un type de taille dynamique que vous n'utiliseriez presque jamais directement, tandis que le second est une tranche de chaîne qui est un gros pointeur. La proposition est appelée des coercitions de déréf ; cela permettrait de contraindre de&T
à&U
siT: Deref<U>
. DepuisString: Deref<str>
déjà, vous serez en mesure d'obtenir à&str
partirString
avec juste&
. Il est toujours en discussion mais je doute que cela se produise avant la version 1.0 - il reste trop peu de temps.Donc, fondamentalement, vous voulez convertir une chaîne en un entier droit! voici ce que j'utilise le plus souvent et qui est également mentionné dans la documentation officielle ..
fn main() { let char = "23"; let char : i32 = char.trim().parse().unwrap(); println!("{}", char + 1); }
Cela fonctionne à la fois pour String et & str J'espère que cela aidera aussi.
la source