L'obtention d'une seule de caractères d'une chaîne
Je veux obtenir le premier caractère d'une std::str
. La méthode char_at()
est actuellement instable, comme c'est slice_chars
dans std::string::String
.
La seule option que j'ai actuellement est la suivante.
let text = "hello world!";
let char_vec:Vec<char> = text.chars().collect();
let ch = char_vec[0];
Mais cela semble excessif pour obtenir juste un seul caractère, et ne pas utiliser le reste du vecteur.
OriginalL'auteur Aaronepower | 2015-06-12
Vous devez vous connecter pour publier un commentaire.
UTF-8 ne permet pas de définir ce "personnage" est donc, cela dépend de ce que vous voulez. Dans ce cas,
char
s sont en Unicode des valeurs scalaires, et donc la premièrechar
d'un&str
va être entre un et quatre octets.Si vous voulez juste la première
char
, alors ne pas recueillir dans unVec<char>
, il suffit d'utiliser l'itérateur:Cela donne à la
n
le code de l'unité, maischar_at
donne le code de l'unité de départ à l'octetn
. Ce dernier est plus utile car la plupart des opérations de la chaîne traiter en octets indices. C'est l'équivalent dechar_at
(et aussi de la constante de temps):text[i..].chars().next().unwrap()
Je dirais qu'en réalité l'utilisation
char_at
est un peu dangereux comme l'index pourrait être la dans une unité de code.Ensuite, vous obtenez un effet de panique, pas de corruption des données (à la fois avec
char_at
et le découpage de contournement). Si vous écrivez votre code correctement Unicode (c'est à dire, à l'aide de la chaîne existante méthodes et les itérateurs) qui n'arrive pas non plus. Et à l'aide de points de code des indices n'est pas vraiment réalisable, car (comme je l'ai dit avant) la plupart des opérations de la chaîne de ne pas les traiter. de Mixage point de code, des indices et des octets indices sont plus dangereux que ce soit.Oui, le point de code indices ne fonctionnerait pas en O(1), de toute façon. Cependant, quand quelqu'un demande pour la n-ième caractère, ils pourraient se poser pour la n-ième codepoint ou la n-ième graphème cluster, mais il est peu probable qu'ils demandent pour la n-ième octet.
OriginalL'auteur Steve Klabnik
J'ai écrit une fonction qui retourne la tête d'un
&str
et le reste:L'utiliser comme ceci:
La sortie ressemble à ceci:
Il fonctionne très bien avec les caractères qui sont plus de 1 octet.
Shepmaster - votre version est en effet plus simple. Mais, je suis inquiet à propos de l'caractères() fonction -, il me semble que si l'analyse de l'ensemble de la chaîne et de l'analyse que dans un vecteur ou quelque chose, alors que mon code ne regarde que les 4 premiers caractères de la chaîne, tout au plus. Mais, peut-être que je suis l'incompréhension comment caractères() fonctionne?
Désolé, veut dire "les 4 premiers octets" pas "4 premiers caractères"
OriginalL'auteur Sean
Accepté la réponse est un peu moche!
&"日本語"[0..1]
Peut-être que Steve Klabnik, qui a écrit la accepté de répondre, devrait mettre à jour son livre qui est à l'honneur sur la Rouille site web, car il montre que cette méthode exacte (doc.rust-lang.org/book/second-edition/...).
Qui est brièvement abordés dans ce chapitre du livre ("
world
serait une tranche qui contient un pointeur pour la 6ème octet des
et une valeur de longueur 5", c'est moi qui souligne) et dans beaucoup plus de détails plus tard.OriginalL'auteur FeFiFoFu