16. Строки (String)
Напомним, что в Rust существует символьный тип данных char, фиксированная строка &str и строковый объект String. Переменная типа String, в отличии от фиксированной строки, может быть не задана до компиляции и такая переменная изменяемая. Строковый объект размещается в куче.
Строковый тип не является частью основного языка Rust. Он определяется как общедоступная структура в стандартной библиотеке.
String – это наращиваемая коллекция. Объект строки похож на уже изученный нами вектор, только предназначенный сугубо для символов UTF-8.
Создать объект строки можно несколькими способами:
String::new(); // пустая строка
String::from("Пример строки");
"Ещё пример".to_string; // конвертирует &str в String
Доступ к элементам строки
С этими строками всё крайне запутано. Различные символы кодируются разным количеством байт, а в языках буквы могут быть представлены разным количеством символов.
fn main() {
let s1: String = "Day".to_string();
let s2: String = "День".to_string();
println!("Длина {} {} байт",s1, s1.len());
println!("Длина {} {} байт",s2, s2.len());
}
Rust учитывает все нюансы работы с текстом для избежания ошибок вашей программы в будущем, но из-за этого всё немного усложняется.
Компилятор Rust не позволяет нам обращаться к символам по индексу, как это мы могли делать в векторах. Подробнее здесь: https://doc.rust-lang.org/book/ch08-02-strings.html#internal-representation.
Вот ещё несколько методов работы со строками:
fn main() {
let before: String = "Бег на месте".to_string();
if before.contains("на месте") {
let after: String = before.replace("на месте", "трусцой");
println!("{}", after);
}
}
В этом примере мы сначала проверили содержится ли строка
fn main() {
let mut str = "Star".to_string();
println!("{}", str);
str.push('s');
println!("{}", str);
str.push_str(" and moon");
println!("{}", str);
}
fn main() {
let s: String = " Пример строки с пробелами ".to_string();
let s1 = s.trim();
println!("-{}-", s);
println!("-{}-", s1);
}
Итерация по строкам
Строки можно использовать в цикле с помощью специальных методов.
fn main() {
let my_str ="Не бойся ошибаться".to_string();
for s in my_str.chars() {
print!("{} * ", s)
}
}
fn main() {
let my_str =
"Не рискуя, мы рискуем в сто раз больше."
.to_string();
for s in my_str.split_whitespace() {
println!("{}", s)
}
}
fn main() {
let my_str = "Твори и ошибайся. В этом жизнь.".to_string();
for s in my_str.split('.') { // разбиваем по символу точка
println!("*{}*", s)
}
println!("");
for s in my_str.split(". ") { // разбиваем по сроке точка и пробел
println!("*{}*", s)
}
}
Сложение строк
К строке можно присоединить фиксированную строку.
fn main() {
let s1: String = "Утро".to_string();
let s2: &str = "великолепное";
let s3 = s1 + " " + s2;
println!("{}",s3);
}
А вот, с присоединением объекта строки чуть сложнее.
fn main() {
let s1: String = "Утро".to_string();
let s2: String = "великолепное".to_string();
let s3 = s1 + " " + &s2; // передаем ссылку на строку
println!("{}",s3);
}
Срезы строк
Нас ждут в следующем курсе.
Для просмотра заданий и решений, а также публикации своих решений необходимо зарегистрироваться на сайте.
Всё бесплатно, мы просто хотим с вами познакомиться и понять насколько актуально то, что мы делаем.