Получение одиночного символа из строки
Я хочу получить первый символ 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"