web-dev-qa-db-fra.com

Obtenir un seul caractère d'une chaîne

Je veux obtenir le premier caractère d'un std::str . La méthode char_at() est actuellement instable, de même que slice_chars in std::string::String .

La seule option que je propose 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 d’obtenir un seul caractère et de ne pas utiliser le reste du vecteur.

22
Aaronepower

UTF-8 ne définit pas le "caractère", cela dépend donc de ce que vous voulez. Dans ce cas, les chars sont des valeurs scalaires Unicode et le premier char d'un &str sera compris entre un et quatre octets.

Si vous voulez seulement la première char, ne collectez pas dans un Vec<char>, utilisez simplement l'itérateur:

let text = "hello world!";
let ch = text.chars().next().unwrap();
39
Steve Klabnik

J'ai écrit une fonction qui retourne la tête d'un &str et le reste:

fn car_cdr(s: &str) -> (&str, &str) {
    for i in 1..5 {
        let r = s.get(0..i);
        match r {
            Some(x) => return (x, &s[i..]),
            None => (),
        }
    }

    (&s[0..0], s)
}

Utilisez-le comme ceci:

let (first_char, remainder) = car_cdr("test");
println!("first char: {}\nremainder: {}", first_char, remainder);

La sortie ressemble à:

first char: t
remainder: est

Cela fonctionne bien avec les caractères qui sont plus que 1 octet.

0
Sean