Получение одиночного символа из строки

Я хочу получить первый символ std::str. Метод char_at() в настоящее время нестабилен, как и slice_chars in std::string::String.

Единственная опция, которую я имею в виду, следующая:

let text = "hello world!";
let char_vec:Vec<char> = text.chars().collect();
let ch = char_vec[0];

Но это кажется чрезмерным, чтобы просто получить один символ, а не использовать остальную часть вектора.

Ответ 1

UTF-8 не определяет, какой "символ" так зависит от того, что вы хотите. В этом случае char являются сканирующими значениями Unicode, поэтому первый char of &str будет находиться в пределах от одного до четырех байтов.

Если вы хотите только первый char, то не собирайте в Vec<char>, просто используйте итератор:

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

Ответ 2

Я написал функцию, которая возвращает голову &str, а остальное:

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)
}

Используйте его следующим образом:

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

Результат выглядит следующим образом:

first char: t
remainder: est

Он отлично работает с символами размером более 1 байт.

Ответ 3

Принятый ответ немного уродлив!

let text = "hello world!";

let ch = &text[0..1]; // this returns "h"