println!("{}",'a'asu8);// перевод символа в код ASCII
println!("{}",97aschar);// число как символ
// перевод кода UTF-8 в символ (не все символы можно перевести):
println!("{:?}",std::char::from_u32(98).unwrap());
Первая и последняя буква в строке
Чтобы проверить или изменить 1-ую букву в строке (в том числе иероглиф или иной вариант алфавита), нужно строку переделать в вектор из букв:
Есть функции sort() и sort_unstable() (работает быстрее, но равные элементы может перемешивать) для вектора символов Vec<char>. Обе функции делают сортировку на месте, возвращают ().
letinput="zxyabc";// сортировка Unicode тоже работает
letmutchar2vec_iter=input.chars().collect::<Vec<char>>();char2vec_iter.sort_unstable();// сортировка на месте
// char2vec_iter.sort_by(|a,b| b.cmp(a)); // реверс-сортировка
// собираем назад String из Vec<char>
letsorted_string: String=char2vec_iter.into_iter().collect();println!("{}",sorted_string);// "abcxyz"
chunks() и chunks_exact() разбиение строк на части
Аналогично массивам, строки можно разбить на части:
lettext="ПриветМир";letchars=text.chars().collect::<Vec<char>>();println!("Разбиваем строку на части по 3 символа:");forchunkinchars.chunks(3){lets: String=chunk.iter().collect();println!("{}",s);// При
// вет
// Мир
Строковые срезы
Срезы позволяют взять часть строки, указав диапазон байтовых индексов.
Синтаксис: &string[start..end] (где start — начало, end — конец, не включительно).
Особенность: нужно вручную следить за границами байтов, иначе будет паника при попытке разрезать строку посреди многобайтового символа.
lettext="Hello, world!";// тип &str
lettext=String::from("Hello, world!");// String
// Если у вас String, а не &str, нужно взять срез с помощью &:
letfirst_three=&text[0..3];// первые 3 символа
letlast_five=&text[text.len()-5..];// последние 5 символов
println!("{}",first_three);// "Hel"
println!("{}",last_five);// "orld!"
Отрицательные индексы в Rust не поддерживаются, поэтому нужно вычислять вручную. Если указать только начало ([start..]), берётся всё до конца:
Если строка содержит многобайтовые символы (например, кириллицу или эмодзи), простые байтовые срезы могут вызвать панику. Для работы с символами (Unicode scalar values) используйте метод .chars():
lettext="Привет, мир!";letchars: Vec=text.chars().collect();// преобразуем в вектор символов
letprivet: String=chars[0..6].iter().collect();// собираем первые 6 символов
println!("{}",privet);// "Привет"
Метод .chars() возвращает итератор по символам, а .collect() собирает их в нужный тип (например, String).
.get(start..end) для безопасного извлечения
Если нет уверенности в границах, и надо избежать паники, подойдёт метод .get() вместо прямого среза. Он возвращает Option<&str>:
Преимущество: проще для новичков, не нужно беспокоиться о байтовых границах.
Недостаток: добавляет внешнюю зависимость.
Примеры
Разворот букв в словах
Дана строка с пробелами между словами. Необходимо развернуть слова в строке наоборот, при этом сохранить пробелы.
fnreverse_words_split(str: &str)-> String{str.to_string().split(" ")// при разделении split() множественные пробелы сохраняются
.map(|x|x.chars().rev().collect::<String>())// разворот слов+сбор в строку
.collect::<Vec<String>>().// сбор всего в вектор
.join(" ")// превращение вектора в строку
}fnmain(){letword: &str="The quick brown fox jumps over the lazy dog.";println!("{}",reverse_words_split(&word));}// ehT kciuq nworb xof spmuj revo eht yzal .god